Хорошо в основном я могу хотеть выполнить сценарий, который может занять целых 1 час также.
То, что я действительно хочу сделать, Отправляют SMS моим пользователям, использующим третье лицо API. Так в основном как я предоставляю свой сценарий массив номеров телефона и запускаю метод для отправки SMS.
Однако принятие его занимает 5 секунд для отправки 1 SMS, и я хочу отправить 1 000 SMS, которые составляют примерно 1 - 2 часа. Я не могу использовать set_time_limit()
потому что я нахожусь на общем хосте.
Один способ сделать это - числа хранилища на сессии, и выполните каждое SMS и используйте JavaScript для обновления той страницы до конца. Таким образом, я должен сохранить свой браузер открытым, и выполнение остановится, если мое Интернет-соединение будет разъединено.
Так, Есть ли какой-либо лучший способ сделать это?
Надежда я достаточно ясен объяснить, что я хочу? Я хочу выполнить большой сценарий, который может занять часы для выполнения, не получая тайм-аут.
Если ваш хостер позволяет вам, лучшим решением будет использование заданий cron. Задание cron - это обычный php-скрипт, который автоматически запускается веб-сервером через определенный промежуток времени. Для ваших нужд я бы создал скрипт, который запускается каждые 5 минут и обрабатывает ваши числа партиями по 100 штук (очевидно, вы захотите настроить временной интервал и размер партии в соответствии с требованиями). Это снизит нагрузку на сервер и предотвратит проблемы с хостинг-провайдером из-за перегрузки ресурсов.
Для того чтобы отслеживать, какую партию обрабатывает ваш скрипт, я бы создал таблицу track_batch. Эти столбцы должны дать вам хорошее представление о том, как подойти к решению проблемы:
id, date_run, start_record, end_record, final_run
По сути:
После того как вы создали сценарий, вам нужно настроить само задание cron. Хостеры общего доступа, скорее всего, имеют свои собственные интерфейсы для этого, поэтому, вероятно, лучше всего обратиться к ним, как только вы получите работающий скрипт.
В СЛУЧАЕ ВАС МОЖЕТ ВЫПОЛНЯТЬ ЗАДАНИЯ CRON
Обычно у меня есть очередь, менеджер и рабочие. Если вы не можете вызвать sms api один раз, эта модель может вам помочь, и вам не стоит беспокоиться о тайм-аутах, поскольку каждый работник будет управлять сам.
У меня есть что-то вроде:
<?php
// PSEUDO CODE
// grab pending from queue
// <for> {
// update to running
exec("/usr/bin/php /path/to/send.php {$id} > /dev/null &");
// }
и send.php отправит каждое смс. Сейчас у меня это работает со скоростью 300 в минуту, так как это максимальная частота, которую вы можете настроить для задания cron
PHP-скрипт, выполняемый из командной строки или из shell-скрипта, задания cron и т.д., не имеет таймаута.
Для скриптов, вызываемых из CLI, даже если вы установите таймаут PHP-скрипта динамически с помощью функции set_time_limit()
это не имеет никакого эффекта.
На скрипты PHP, запускаемые из командной строки, не влияет параметр max_execution_time
.
Так что вам вообще не о чем беспокоиться.
Это не лучший вариант использовать set_time_limit (0)
, потому что это означает, что он будет работать бесконечно, даже если у вас ошибка, и ваш скрипт заходит в бесконечный цикл.
Вместо этого, если вы оцениваете, что каждое SMS-сообщение займет 5 секунд, используйте следующий подход:
while( $there_are_more_sms_to_be_sent ){
set_time_limit(30); // enough spare time, just in case.
// Do your sending, blah blah
}
Таким образом, ограничение по времени будет последовательно обновляться до 30 секунд. Конечно, у вас может возникнуть проблема с бесконечным циклом с одним while
, но если у вас есть другие вызовы внутри этого while
, этот предел не позволит тем вызовам быть обвинять.
Вы можете или вы не можете использовать set_time_limit()
?
Если вы можете.... Используйте его:
<?php
// Runs forever and ever...
set_time_limit(-1);
?>
Альтернативой использованию JavaScript является добавление мета-тега Refresh
на вашу страницу:
<meta http-equiv="Refresh" content="2; url=http://yoururl/script.php&step=x" ?>
Двойка в content="2; url=...
говорит браузеру загрузить url через 2 секунды после загрузки страницы.