2010-05-15 6 views
17

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

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

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

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

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

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

+0

Говорит с API с локального компьютера, на котором вы можете увеличить срок? –

+1

У вас есть возможность настроить задания cron на вашем общем хосте? – Mathew

+0

Да, у меня есть доступ к заданиям cron –

ответ

4

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

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

идентификатор, date_run, start_record, end_record, final_run

По существу:

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

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

5

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

+0

И как мне их запускать как CLI на общем хосте? Я не думаю, что у меня будет доступ к нему. –

+0

Да, право. спасибо :) –

+1

Посмотрите, есть ли у вас секция «cron» на панели управления. Это позволит вам запускать скрипты PHP через командную строку. – zundi

0

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

Если вы можете .. Использование:

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

Хе-хе, я не буду ниспровергать, потому что это технически правильно, но предложите ли вы, чтобы сценарий запускался вечно, если он был * вашим * соседом на общем хосте ?!:) – Mathew

20

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

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

+0

, пожалуйста, ответьте на мой вопрос: http://unix.stackexchange.com/questions/98642/run-a-php-script-in-centos-and-time-and-timeout?noredirect1_comment150287_98642 –

3

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

+0

так каждый раз, когда он петли, это счетчик сброса? –

+0

Правильно. Я предполагал, что вы тоже использовали cronjob. Вы должны использовать его вместе с этим советом, поэтому вы обрабатываете, скажем, 100 сообщений каждый раз, но также убедитесь, что у вас не закончилось время. – Seb

+0

Вы уверены, что можете остановить работу cron, как это? – zehelvion

0

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

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

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

+1

Спасибо, но я уже указал это в своем вопросе. Я искал что-то, что нужно сделать на стороне сервера. Я также знал о CRONs, но я думал, что может быть больше способов для этого –

+0

он явно спрашивает, как .... PHP технология обходного пути - не лучшее решение –

+0

Я не знаю, почему вы считаете необходимым реагировать на сообщение почти 7 лет, но для ответа: при использовании задания cron или командной строки это очень хорошее решение для запуска больших пакетных операций, разделение задания на небольшие шаги и выполнение их шаг за шагом является столь же достоверным. Cron хорош там, где вы можете его использовать, но я успешно запускал скрипты, которые занимали более 12 часов в браузере, когда у меня не было доступа к оболочке. – Matijs

0

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

Смежные вопросы