Büyük bir PHP komut dosyası yürütmek nasıl?

6 Cevap php

Peki temelde ben de kadar 1 saat sürebilir bir komut dosyası çalıştırmak isteyebilirsiniz.

Ne gerçekten yapmak istediğim bir üçüncü taraf API kullanarak, kullanıcılara SMS gönder. Yani onun temelde telefon numaralarını bir dizi ile benim komut arz ve SMS gönderme yöntemini ateş gibi.

Ancak 1 SMS göndermek için 5 saniye sürer varsayarak ve ben kabaca 1 1000 SMS göndermek istiyorsanız - 2 saat. Ben paylaşılan ana duyuyorum çünkü ben set_time_limit() kullanamazsınız.

Bunu yapmanın bir yolu, bir oturumda mağaza sayısı ve her bir SMS yürütmek ve sonuna kadar o sayfayı yenilemek için javascript kullanın. Bu şekilde ben açık benim tarayıcı tutmak gerekiyor ve benim internet bağlantısı kesilirse yürütme durur.

Peki, bunu yapmak için daha iyi bir yolu var mı?

Ne istediğimi açıklamak için yeterince açık olduğumu umut? Ben zaman aşımı almadan yürütmek için saat sürebilir büyük bir komut dosyası çalıştırmak istiyorum.

6 Cevap

Ev sahibi izin verirse, cron işleri en iyi çözümdür. Bir cron işi temelde otomatik olarak belirli bir zaman aralığında web sunucusu tarafından işletilen normal bir php betik. Ihtiyaçlarınız için ben (tabii ki uygun zaman aralığını ve toplu iş boyutunu oynamak isteyeceksiniz) her 5 dakika çalışır ve 100 gruplar halinde sayıları işleyen bir komut dosyası yaratacak. Bu sunucu yükünü aşağı tutmak ve kaynakları hogging için sağlayıcı barındırma derde önleyecektir.

Script işleme gereken toplu izlemek için, ben kurulum track_batch tablo olur. Bu sütunlar, size sorunu yaklaşım nasıl iyi bir göstergesi vermelidir:

id, date_run, start_record, end_record, final_run

Esasen:

  • Check to see the date of the last batch run. If it isn't the current date (or whatever other identifier you choose to use) for the current batch, then proceed.
  • If the last batch run was for the current date, then check the final_run column to see whether you've already finished processing all the numbers.
  • If you still have numbers to process, use the start and end records in conjunction with MySQL's LIMIT to build the db query that your script will use to get the next batch.
  • Numaralarınızı işleyin.
  • Track_batch tabloda bu toplu tüm bilgi depolamak.
  • If the amount of numbers the query returns is ever less than the maximum batch size, you've reached the end and can set the final_run column to 1.

Eğer senaryo var sonra, kurulum için cron işi kendisi gerekir. Paylaşılan barındıran bu iş için kendi özel arayüzleri olması muhtemeldir, bu yüzden muhtemelen sizin komut çalışma var bir kere sormak için en iyi insanlardır.

Vb bir kabuk, cron, komut satırından veya yürütüldüğünde bir PHP komut dosyası zaman aşımı yoktur.

CLI-çağrılan komut için, set_time_limit() fonksiyonu ile dinamik PHP betiğin zaman aşımını ayarlamak bile, bunun hiçbir etkisi yoktur.

Giderdi Eğer bir hata ve komut sonsuz bir döngüye girer olsa bile süresiz koşmak demektir, çünkü set_time_limit(0) kullanmak için en iyi seçenek değildir.

Bunun yerine, her SMS 5 saniye alacak tahmin ise, bu yaklaşımı kullanın:

while( $there_are_more_sms_to_be_sent ){
  set_time_limit(30); // enough spare time, just in case.

  // Do your sending, blah blah
}

Bu şekilde, zaman sınırı sırayla 30 saniye güncellenir. Tabii ki bu tek while ile sonsuz döngü sorunu olabilir, ama bunu içinizde diğer çağrıları varsa while bu sınırı those olmak çağrıları engeller suçlarlar.

JavaScript kullanarak bir alternatif sayfanıza Refresh meta etiketi eklemek için:

<meta http-equiv="Refresh" content="2; url=http://yoururl/script.php&step=x" ?>

content="2; url=.. olarak iki sayfa yüklendikten sonra url 2 ikinci yüklemek için tarayıcı söyler.

DURUMUNDA CRON işleri çalıştırabilirsiniz

Ben genellikle bir sıra, bir yönetici ve işçiler var. Eğer zamanda bir kez sms API arayabilirsiniz sürece bu model size yardımcı olabilir, ve her bir işçi bunu canlarından yönetecek beri zaman aşımları hakkında endişe souldn't.

Ben gibi bir şey var:

<?php
// PSEUDO CODE
// grab pending from queue

// <for> {
// update to running
exec("/usr/bin/php /path/to/send.php {$id} > /dev/null &");
// }

ve send.php her sms göndermek olacaktır. Eğer bir cron işi kurulum yapabilirsiniz maksimum frekans olduğundan Şu anda ben bu 300/minute hızında çalışan var

Sen can veya can't kullanmak set_time_limit()?

Eğer .. kullanın eğer:

<?php
// Runs forever and ever...
set_time_limit(-1);
?>