php using loop для перезапуска времени для выполнения скрипта

Я запускаю цикл foreach в php, который занимает больше времени, чем мое максимальное время выполнения 30 секунд. Цикл отправляет пользователям индивидуальные письма.

Вместо того, чтобы запускать задания cron каждые 30 секунд и создавать очереди для записей, неэтично просто перезапустить счетчик в цикле, используя set_time_limit(30) ?

 $i = 0; //start count from 0 foreach ($users as $user): //limit emails sent if(++$i == 100) break; //ends execution of loop set_time_limit(30); //restart timeout counter send_email($user); //send email to user endforeach; 

Я новичок в этом, но с приведенным выше кодом, я думаю, что я даю каждому электронному адресу 30 секунд, чтобы завершить, но также нарушив цикл, когда отправлено 100 писем, поэтому скрипт не запускается вечно.

Обновление: set_time_limit(0) идет против хостинга TOS, я полагал, что перезапуск тайм-аута перезапускает скрипт, а также CRON

Related of "php using loop для перезапуска времени для выполнения скрипта"

Запуск set_time_limit в цикле foreach с одновременным приведением и решением нескольких проблем.

Я вижу величайшего профессионала этого решения, чтобы убедиться, что ни один запрос не займет больше 30 секунд (и когда у вас будет полная метка, я считаю, что даже желательно сократить каждый сценарий, который занимает так много времени).

Проблема заключается в том, что не все рабочие задания будут выполняться обязательно. Возможно, вы столкнетесь с некоторыми проблемами в середине очереди заданий, и все это провалится.

Я бы пошел с этим:

 # crontab 0,30 * * * * php /path/to/your/script.php 

И будет использовать ваш скрипт.

Если вам нужно выполнить задания как можно быстрее, я бы создал скрипт bash, который выполнял бы (без какого-либо тайм-аута) php-скрипт, если бы он не заканчивался с exit(0) (все задания выполнялись успешно) или wouldn ' t верните "Done!" или как вам угодно.

Экзамен сценария bash: 1 , 2

 #!/bin/bash # Note that false sets $? to 1 false while [ $? -ne 0 ]; do php /path/to/your/script.php >> log.log done 

И если вам нужно убедиться, что два экземпляра не будут запущены одновременно, google один из них (только с головы):

  • .pid файл
  • LOCK TABLE mysql

PS: Если вы будете использовать какой-либо метод, убедитесь, что ваш скрипт будет работать, если он сбой в середине

Просто отключите ограничение времени в начале вашего скрипта:

 set_time_limit(0); 

Если TOS вашего хоста исключает использование неограниченных скриптов, они почти наверняка будут возражать против сброса сценария. Единственный выбор – отправить электронные письма параллельно или перейти на другой хост.