PHP: planlanan işleri çalıştıran (cron jobs)

10 Cevap php

Ben bazı zamanlanmış görevleri çalıştırmak istiyorum benim webhotel bir site var. Bu ulaşmanın ne gibi yöntemler önerirsiniz?

Ne kadar düşünülmüş ettik her sayfanın üst dahil bir komut olan ve daha sonra bu komut bu işi ya da çalıştırmak için zamanı olup olmadığını kontrol edelim edilir.

Bu benim hakkında ne düşündüğünü sadece hızlı bir örnek:

if ($alreadyDone == 0 && time() > $timeToRunMaintainance) {
   runTask();
   $timeToRunMaintainance = time() + $interval;
} 

Başka bir şey dikkate almalı veya bu daha iyi bir yöntem var mıdır?

10 Cevap

Bu CronJobs için yapılan budur. man crontab Eğer bir linux sunucusu çalıştıran varsayarak. Eğer shell erişim veya kurulum cronjobs hiçbir şekilde yoksa, kurulum harici sunucular ve ping URL'lerinizden birinin üzerinde CronJobs ücretsiz hizmetler vardır.

Kimse bu kesin çözüm belirttiğim gibi görünüyor, çünkü ben şimdi bu cevap veriyorum.

'Ben şu anda üzerinde çalışıyorum bir sitede, cPanel kullanarak bir cron işi kurdum, ama onun yerine biz CodeIgniter'ı kullanıyorsanız ve bizim kod denetleyici fonksiyona eşleştirilmiş olduğundan (doğrudan PHP yorumlayıcı çalışan, bu muhtemelen değil Biz kullanırken) harika bir fikir t wget.

wget -q -O cron_job.log http://somehost/controller/method

-q böylece wget herhangi bir çıktı elde değil (yani e-postaları almaya devam olmayacaktır) 'dir. -O cron_job.log denetleyici (büyüyen tutmak olmaz böylece her zaman yazılır) bir günlük dosyası oluşturur olursa olsun içeriğini kaydetmek olacaktır.

Ben bu 'uygun' cron çalışma almanın en kolay yolu buldum.

aslında cron PHP komut dosyasını çalıştırmak için nasıl merak ediyorsanız eğer, iki seçenek vardır: (yani, "php / foo / myscript.php") doğrudan PHP yorumlayıcı arayın, ya da vaşak kullanın (vaşak {[(0)] }). Erişim izinlerini kabuk veya web tarayıcısı üzerinden çağrı bağlı olarak farklı olacaktır yolları ve dosya - hangi birini seçin komut dosyası çevresini yapılandırılmış ihtiyacı nasıl çoğunlukla bağlıdır. Ben vaşak kullanmanızı tavsiye ediyorum.

Bir yan etkisi size bir e-posta ile çalıştırıldığında her zaman olsun. Onlar başarısız olursa bu almak için, benim cron PHP betikleri çıkış şey yapmak (ve hatta boşluk şey, olmak zorunda) başarıyla tamamlamak ve eğer bir hata mesajı. Sonra cron küçük bir PHP komut dosyası kullanarak onları arayın. Başarısız olursa bu şekilde, sadece bir e-posta almak. Bu betiğimiz HTTP isteği ve vaşak yapar dışında, temelde vaşak yöntemi olarak aynıdır.

Bu script "docron" ya da bir şey (+ x chmod unutmayın) diyoruz, ve sonra crontab komutu kullanın: "docron http://mydomain.com/myscript.php". Sayfa bir şey verir eğer, size bir HTML e-posta olarak sayfanın çıktısını e-postaları.

#!/usr/bin/php
<?php

$h = @file_get_contents($_SERVER['argv'][1]);

if ($h === false)
{
        $h = "<b>Failed to open file</b>: " . $_SERVER['argv'][1];
}

if ($h != '')
{
        @mail("cron@mydomain.com", $_SERVER['argv']['1'], $h, "From: cron@mydomain.com\nMIME-Version: 1.0\nContent-type: text/html; charset=iso-8859-1");
}

?>

Eğer bir cPanel barındırma varsa, Gelişmiş için web interface.Go aracılığıyla cron işleri ekleyebilirsiniz -> Cron Jobs ve cron frekansı kurmak için gelişmiş olmayan formu kullanabilirsiniz. Böyle bir komut istiyorum:

/usr/bin/php /path/to/your/php/script.php

(Ben daha iyi bir yöntem önermek istiyorum ama) cron işleri ve etajer kurma kaçınmak istiyorsanız, size verdiğiniz çözüm oldukça iyidir. Projeleri bir dizi, ben PHP komut dosyası kendisi güncelleştirmeyi çalıştırmak için zamanı olup olmadığını görmek için kontrol yapmak yaşadım.

(Aşağı tarafı tamam, one) aşağı tarafı hiç kimse belli bir dönemde uygulamayı kullanıyorsa, o zaman komut dosyası çalışmaz olacaktır.

Yukarı tarafı hiç kimse belli bir dönemde uygulamayı kullanıyorsa, o zaman komut dosyası çalışmaz olacaktır. Ben bunu yapmak için kurmak var görevleri ve etajer "günlük yedekleme yapmak", "bir önbellek dosyası güncelleştirmek" gibi şeyler vardır. Birisi uygulamasını kullanarak değilse, o zaman güncellenmiş önbellek dosyalarını ihtiyacımız olacak değildir, ne de yedekleme için herhangi bir veritabanı değişiklik olacaksa olacak.

Ben öneririm senin yöntemi tek değişiklik Her sayfa yükünü kontrol etmek gerekmez içeri birisi başarıyla oturum açtığında sadece bu kontrolleri çalıştırılır.

Cron çizelgeleme problemleri için genel amaçlı bir çözümdür. Eğer büyük gidin ve programları frekans yüksek gittiğinizde, güvenilirlik / örtüşen sorunları olabilir. Eğer bu tür sorunlar görürseniz, supervise veya daha sofistike monit gibi bir şey düşünün.

Komut satırı PHP + cron ben gitmek istiyorum yolu olacaktır. Bu basit ve tasarıyı uygun olmalıdır. Genellikle tabii olarak PHP ile yüklenir.

Eğer kurulum bir cronjob için seçenek yok eğer (- aynı özelliğe alternatif wget gibi) Curl ile komut arayabilir. Sadece Curl işlevini yürütür yerel makine üzerinde bir zamanlanmış görevi yapmak.

Eğer cronjobs veya harici bir şey kullanmak istemiyorsanız, kullandığınız yöntem, ince, ama bu, her seferinde bir sayfa yükleri kontrol etmek ağır olabilir.

İlk başta, bazı Cronjobs muhtemelen ikame edilmiş olabilir. Eğer web sitesinde kayıtlı kaç kullanıcıları için bir sayaç varsa Örneğin, sadece bunun için bir cronjob veya herhangi bir zamanlanmış görev kullanmak zorunda değilsiniz zaman kullanıcı kayıtları, bu nedenle bu numarayı güncelleyebilirsiniz.

Eğer zamanlanmış görevler kullanmak istiyorsanız, ben size şu anda kullandığınız yöntemi kullanmanızı öneririm, ama küçük bir değişiklik ile. Eğer site bir günde yeterince hit olan iseniz, sadece görevleri çalıştırmak (veya görevleri fonksiyonun çalışmasını kontrol) yerine sadece hepsi% 1 veya isabet belki% 0.01 için, kullanmanız gereken yüzde bağlıdır yapabilirsiniz sayfa vurur Eğer varsa ve görevi çalıştırmak istiyorum kaç kez. Bu nedenle, sadece bu özelliği elde etmek için bir rasgele dağıtıcı ekleyin.

Sadece bu gibi bir işlevi kullanabilirsiniz;

if(rand (1, 100) <= 1) { // 1, 100 is used to generate a number between 1 and 100. 1 is for one percent.
    // Run the tasks system
}

Bu yardımcı olur umarım

Hiç baktı mı ATrigger? PHP library herhangi bir yük olmadan planlanmış görevleri oluşturmaya başlamak için de kullanılabilir.

Yasal Uyarı: Ben kendi takımı arasında değilim.