PHP İle Cron İşi Oluşturma Hk.
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.
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (4)
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
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.
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();
}
?>
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.