В принципе, я могу выполнить скрипт, который может занять до 1 часа.
Я действительно хочу отправить SMS своим пользователям с использованием стороннего API. Так что в основном я предоставляю свой скрипт с набором телефонных номеров и запускаю метод отправки SMS.
Однако при условии, что для отправки 1 SMS требуется 5 секунд, и я хочу отправить 1000 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. У общих хостов, вероятно, есть свои собственные пользовательские интерфейсы для этого, поэтому они, вероятно, лучшие люди, которые могут спросить, как только вы работаете с вашим скриптом.
Сценарий PHP, выполняемый из командной строки или из сценария оболочки, задания cron и т. Д. Не имеет тайм-аута.
Для сценариев с set_time_limit()
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
этот предел предотвратит вину этих вызовов.
Вы можете или не можете использовать 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 секунды после загрузки страницы.
В СЛУЧАЕ ВЫ МОЖЕТЕ ПРОДОЛЖИТЬ РАБОТЫ 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 отправит каждый sms. Прямо сейчас у меня это работает со скоростью 300 / мин, так как это максимальная частота, которую вы можете настроить на работу cron