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

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

То, что я действительно хочу сделать, Отправляют SMS моим пользователям, использующим третье лицо API. Так в основном как я предоставляю свой сценарий массив номеров телефона и запускаю метод для отправки SMS.

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

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

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

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

19
задан Galen 15 May 2010 в 18:10
поделиться

7 ответов

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

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

id, date_run, start_record, end_record, final_run

По сути:

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

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

5
ответ дан 30 November 2019 в 03:48
поделиться

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

0
ответ дан 30 November 2019 в 03:48
поделиться

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

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

21
ответ дан 30 November 2019 в 03:48
поделиться

На скрипты PHP, запускаемые из командной строки, не влияет параметр max_execution_time .
Так что вам вообще не о чем беспокоиться.

5
ответ дан 30 November 2019 в 03:48
поделиться

Это не лучший вариант использовать 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 , этот предел не позволит тем вызовам быть обвинять.

3
ответ дан 30 November 2019 в 03:48
поделиться

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

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

<?php
// Runs forever and ever...
set_time_limit(-1);
?>
0
ответ дан 30 November 2019 в 03:48
поделиться

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

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

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

0
ответ дан 30 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: