v2.5.2
Giriş yap

PHP İle Cron İşi Oluşturma Hk.

mcfearcombat
184 defa görüntülendi

Merhabalar,

zamanlanmış çalışacak dosyalarım için cpanel üzerinden cron görevi ekliyorum ancak çok fazla görev eklediğim ve bunların çalışma zamanlaması hakkında sürekli değişiklikler yaptığım için panelimde bir sayfa hazırlayıp değişiklikleri buradan yapmak istiyorum.

Yani istediğim bir php dosyası oluşturmak ya da veritabanında kayıt tutarak cpanel üzerinden cron görevi oluşturmadan bu görevi yapmak.

Şuan için fikrim yok ama bir dosyaya cron görevi atayıp dakikada bir kontrol ettirip içerisinde veri tutup oradan görevi yaptırmak mantıklı mı bilmiyorum.

Tecrübelerinizle fikirlerinizi paylaşabilirseniz sevinirim.

mcfearcombat
116 gün önce

Tekrar merhabalar, alttaki gibi bir yapı oluşturdum. Veritabanında dosya yolunu ve işlemin yapılması gerektiği zaman bilgilerini tutuyorum. Ancak başarılı sonuç elde edemiyorum.

cronjob_manager.php dosyasına 777 yetkilendirmesi yaptım ve cpanel cron görevleri üzerinde dakikada bir çalışacak şekilde ayarladım. Bu sayfa dakikada bir çalışıyor ve veritabanından veriyi çekiyor buraya kadar sorun yok.

cronjob_manager_tester.php dosyasını ise tarayıcıda çalıştırdığımda çalışıp veritabanına log kaydını yapıyor burada da sorun yok. Ancak belirtilen zamanda cronjob_manager.php dosyası çalıştırması gereken dosya bilgilerini çekiyor ve failed'a düşüyor.

dosya yolu olarak cpanelde kullandığımız gibi (alltta örneğini verdim) kullanıyorum. manager dosya ile tester dosya aynı dizinde ve bunlar bir subdomainde yer alıyor. Farklı dosya yolu alternatifleri de denedim ancak başarılı olamadım. Nerede yanlış yapıyor olabilirim ?

php /home/kullanıcıadı/sub.domain.com.tr/settings/cron_manager_tester.php

cron_manager.php dosyası :


<?php
require_once '../config/dbconnect.php';

date_default_timezone_set('Europe/Istanbul'); 

function getPendingCronJobs($conn) {
    $stmt = $conn->prepare("
        SELECT * FROM cron_jobs 
        WHERE 
            status = 'pending' AND 
            (
                last_run IS NULL OR 
                TIMESTAMPDIFF(MINUTE, last_run, NOW()) >= run_interval_minutes
            ) AND
            (
                run_at_hour = HOUR(NOW()) AND run_at_minute = MINUTE(NOW())
            )
    ");
    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

function updateCronJobStatus($conn, $id, $status) {
    $stmt = $conn->prepare("UPDATE cron_jobs SET status = :status, last_run = NOW() WHERE id = :id");
    $stmt->bindParam(':status', $status);
    $stmt->bindParam(':id', $id);
    $stmt->execute();
}

function runCronJob($job) {
    $output = null;
    $result = null;
    $phpPath = '/usr/bin/php'; 
    $command = $phpPath . ' ' . $job['command'] . ' 2>&1';
    exec($command, $output, $result);
    $output = implode("\n", $output);
    file_put_contents('cron_error_log.txt', "Command: {$command}\nOutput: {$output}\nResult: {$result}\nDate: " . date('Y-m-d H:i:s') . "\n\n", FILE_APPEND);
    return $result === 0 ? 'completed' : 'failed';
}


$cronJobs = getPendingCronJobs($conn);

foreach ($cronJobs as $job) {
    updateCronJobStatus($conn, $job['id'], 'running');
    $status = runCronJob($job);
    updateCronJobStatus($conn, $job['id'], $status);
}


?>


cron_manager_tester.php Dosyası :


<?php

date_default_timezone_set('Europe/Istanbul'); 


require_once '../config/dbconnect.php';

try {

    $currentDateTime = date("Y-m-d H:i:s");

    // Veri girişini oluştur
    $text = "Tester 1 Çalıştı. Zaman : " . $currentDateTime;

    // Veritabanına veri ekleme sorgusu
    $stmt = $conn->prepare("INSERT INTO cron_tester (text) VALUES (:text)");
    $stmt->bindParam(':text', $text);
    $stmt->execute();

    echo "Veri başarıyla eklendi.";
} catch(PDOException $e) {
    echo "Veri eklerken bir hata oluştu: " . $e->getMessage();
}


?>