Подтвердить что ты не робот

Как выполнить большой PHP скрипт?

Ну, в принципе, я могу выполнить script, который может занять до 1 часа.

Я действительно хочу отправить SMS своим пользователям с использованием стороннего API. Поэтому в основном я предоставляю свой script массив телефонных номеров и запускаю метод отправки SMS.

Однако при условии, что для отправки 1 SMS требуется 5 секунд, и я хочу отправить 1000 SMS, что составляет примерно 1 - 2 часа. Я не могу использовать set_time_limit(), потому что я на общем хосте.

Один из способов сделать это - сохранить номера в сеансе и выполнить каждое SMS-сообщение и использовать javascript для обновления этой страницы до конца. Таким образом, мне нужно оставить мой браузер открытым, и выполнение остановится, если отключено подключение к Интернету.

Итак, есть ли лучший способ сделать это?

Надеюсь, я достаточно ясен, чтобы объяснить, что я хочу? Я хочу выполнить большой script, который может занять несколько часов, не получая тайм-аута.

4b9b3361

Ответ 1

Если ваш хост позволяет вам, задания cron - лучшее решение. Задача cron - это в основном обычный php script, который автоматически запускается веб-сервером с определенным временным интервалом. Для ваших нужд я бы создал script, который запускается каждые 5 минут и обрабатывает ваши номера партиями по 100 (очевидно, вы захотите настроить временной интервал и размер партии в соответствии). Это снизит нагрузку на ваш сервер и предотвратит возникновение проблем с вашим хостинг-провайдером для ресурсов hogging.

Чтобы отслеживать, какой пакет должен обрабатывать ваш script, я бы установил таблицу track_batch. Эти столбцы должны дать вам хорошее представление о том, как подойти к проблеме:

id, date_run, start_record, end_record, final_run

По существу:

  • Проверить дату последнего пакетный запуск. Если это не текущая дата (или любой другой идентификатор, который вы выбираете для использование) для текущей партии, затем продолжить.
  • Если последний сеанс партии был для текущей даты, проверьте final_run, чтобы узнать, вы уже закончили обработку все числа.
  • Если у вас все еще есть номера для обработки, используйте начало и конец записи в сочетании с MySQL LIMIT, чтобы построить запрос db, который script будет использовать, чтобы получить следующий партия.
  • Обработать свои номера.
  • Сохраните всю информацию из этой партии в таблице track_batch.
  • Если количество чисел, возвращаемых запросом, меньше, чем максимальное размер партии, вы достигли конца и может установить столбец final_run для 1.

Как только вы получите свой script, вам нужно будет настроить работу cron. У общих хостов, вероятно, есть свои собственные пользовательские интерфейсы для этого, поэтому они, вероятно, являются лучшими людьми, которые могут спросить, как только вы заработаете script.

Ответ 2

PHP скрипт, выполняемый из командной строки или из оболочки script, задание cron и т.д. не имеет тайм-аута.

Для сценариев, запускаемых CLI, даже если вы установите динамический тайм-аут PHP script динамически с помощью функции set_time_limit(), она не действует,

Ответ 3

Сценарии PHP, запущенные из командной строки, не зависят от параметра max_execution_time.
Поэтому вам не нужно беспокоиться.

Ответ 4

Это не лучшие варианты использования set_time_limit(0), потому что это означает, что он будет работать бесконечно, даже если у вас есть ошибка, а ваш script вводит бесконечный цикл.

Вместо этого, если вы оцениваете каждое 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, это ограничение предотвратит вину этих вызовов.

Ответ 5

Вы можете или не можете использовать set_time_limit()?

Если вы можете... Используйте его:

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

Ответ 6

Альтернативой использованию JavaScript является добавление метатега Refresh на вашу страницу:

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

Два из content="2; url=.. указывают браузеру загрузить URL-адрес через 2 секунды после загрузки страницы.

Ответ 7

В СЛУЧАЕ ВЫ МОЖЕТЕ ПРОДОЛЖИТЬ РАБОТУ 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.