Функция сна на php - PullRequest
       23

Функция сна на php

2 голосов
/ 17 ноября 2010

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

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

# sleeps for 86400 seconds or one day
sleep(86400);

, будет ли мой скрипт снова запущен через 1 день?даже если вы не получите доступ к нему в моем веб-браузере снова в течение этого периода?Я думаю, что это невозможно, но я здесь, чтобы спросить эксперта об этом.

Ответы [ 9 ]

2 голосов
/ 17 ноября 2010

Существует также time_sleep_until().Может быть, полезнее просыпаться в определенное время ...

2 голосов
/ 17 ноября 2010

Я бы этого не делал, я бы либо использовал задание cron (это ссылка), если это обычное задание, либо at (то есть ссылка) задание, если задание добавлено во время выполнения вашего скрипта.

cron позволяет вам запускать повторяющееся задание каждый день, например, в 13:00, тогда как at позволяет вам запланировать выполнение задания один раз на данный момент + 1 день, например.

Я написал оболочку PHP 5.3 для очереди at, если вы решите пойти по этому маршруту. Доступно на GitHub https://github.com/treffynnon/PHP-at-Job-Queue-Wrapper

2 голосов
/ 17 ноября 2010

Основная проблема с использованием PHP таким способом, по моему опыту, заключается не в тайм-аутах веб-сервера (есть способы справиться с этим с трудностями в зависимости от сервера и платформы), а в утечках памяти.

Простой PHPкод имеет тенденцию к утечке много памяти;большинство написанных мною сценариев смогли выполнить в сотни раз больше работы после того, как я провел некоторый анализ и поместил несколько unset с.И я так и не смог предотвратить все утечки.Мне также сообщили, что в стандартной библиотеке есть утечки памяти, которые, если это правда, делают невозможным написание демонов, которые долгое время работали бы в циклах.

2 голосов
/ 17 ноября 2010

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

1 голос
/ 17 ноября 2010

Это будет работать, но ваше «время запуска» будет зависеть от дрейфа. Допустим, ваша работа выполняется 10 секунд, затем спит 86400, запускается еще 10, спит 86400 и т. Д. Вы запускаете ее ровно в полночь первого дня. Во второй день она запускается в 12:00:10 утра в день 3 сейчас 12:00:20 и т. Д. ...

Вы можете сделать некоторую причудливую математику внутри, чтобы выяснить, сколько времени заняла пробежка, и вычесть это из следующего вызова сна, но в тот момент, почему бы не использовать cron? С помощью cron скрипт будет завершаться после каждого запуска, очищая память и используемые ресурсы. С вашим методом сна вы должны быть ОЧЕНЬ осторожны, чтобы не пропустить ресурсы где-нибудь, иначе все в конечном итоге остановится.

1 голос
/ 17 ноября 2010

Если вы откроете скрипт через веб-браузер, он будет прерван через 30 секунд.

Если вы запустите скрипт PHP из командной строки, это может сработать.

0 голосов
/ 17 ноября 2010

Вот почему были изобретены законные задания cron. Просто используйте crontab. Использование PHP-скрипта для этого будет ЧРЕЗВЫЧАЙНО ненадежным, ошибочным и плохо синхронизированным.

Надеюсь, это проницательно.

0 голосов
/ 17 ноября 2010

Много правильных ответов, но: Использование sleep () означает, что ваш скрипт продолжает работать и продолжает использовать память.Повышение тайм-аута по умолчанию на 30 с будет работать, но, опять же, это плохая идея.Я предлагаю вам использовать crontasks.

0 голосов
/ 17 ноября 2010

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

Я на самом деле использую этот скрипт как часть более крупного скрипта работы cron:

  1. задание cron выполняется каждый час
  2. XML-файл для каждого вложенного крона с cron-подобным временным компонентом (т.е. - * * / 2 * * * php /home..)
  3. сценарий субкрона, который будет запускаться, если текущее время соответствует критериям компонента времени субкрона
  4. пользовательский интерфейс настроен так, что мне не нужно вручную добавлять / удалять субкроны из основного хрон

Класс cronParser здесь .

...