Я запускаю цикл 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
Запуск 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 вашего хоста исключает использование неограниченных скриптов, они почти наверняка будут возражать против сброса сценария. Единственный выбор – отправить электронные письма параллельно или перейти на другой хост.