Intereting Posts
Составить несколько результатов покрытия xdebug в один отчет? Получатель уведомлений по электронной почте Woocommerce условно на основе настраиваемого поля Как исключить типы файлов из цикла каталогов Iterator Планирование системы заказа новостей Получить время истечения срока действия элемента memcache в php? Как получить данные из разных связанных таблиц, используя сдерживаемые в CakePHP? Закрытие PHP: не удается записать файлы? php $ _SERVER , чтобы включить строку запроса Что такое «достаточная дезинфекция» для URL Вход в систему Системный дизайн, позволяющий каждому пользователю регистрироваться на одной машине за раз PHP – простой способ чтения одной записи из MySQL Google сопоставляет маркеры с javascript и PHP Подключение к mysql в xampp без пароля Почему php не жалуется при ссылке на несуществующую переменную? Найти значение в массиве и получить идентификатор в PHP

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

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

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

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

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

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

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

Solutions Collecting From Web of "Как выполнить большой скрипт PHP?"

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

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

id, date_run, start_record, end_record, final_run

По существу:

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

После того, как вы получите свой скрипт, вам нужно настроить работу 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