v2.5.2
Giriş yap

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

mcfearcombat
179 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.

Cevap yaz
Cevaplar (4)
fazilmertvural
75 gün önce

Merhaba, bunun için öncelikle cPanel api ile sunucuna bağlanman gerekir;

Buradan kaynak kodu indir: https://github.com/humolot/cPanel-API-Simple-PHP
Buradan dökümantasyona erişebilirsin: https://api.docs.cpanel.net/cpanel/introduction

mcfearcombat
107 gün önce

Güncelleme : Sorunun hosting firmasının exec() fonksiyonu kısıtlamasından kaynaklandığını tespit ettim. Sistem kurgum tamam ama exec() kısıtlamasına takılmayacak alternatif yöntem aramaktayım.

mcfearcombat
108 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();
}


?>


recepkaramanli61
108 gün önce

Bir php dosyası oluşturup, bu dosyayı dakika yada 5 dk da bir çalıştararak başlayabilirsin. Saat, gün vs durumuna göre ilgili görev bu dosya üzerinden çalıştırılabilir. Çok efektif olmamakla birlikte ilk aklıma gelen bu.