Зацикливание PHP-скрипта - PullRequest
8 голосов
/ 14 июля 2009

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

Моя проблема в том, как заставить этот скрипт работать постоянно. Я настраивал задание cron на запуск каждые 10 минут, а затем в PHP-скрипте у меня бесконечный цикл со сном (10). Я думал, что он будет запускать код каждые 10 секунд, и в случае остановки скрипта задание cron в конечном итоге перезапустит его.

Однако после запуска сценария он выполняется около 3 циклов (30 секунд) и затем останавливается. Я слышал, что PHP получает столько памяти только на одну загрузку файла.

Как я могу сделать этот цикл скрипта PHP на неопределенный срок? Может быть, есть какой-то способ назвать себя

Ответы [ 6 ]

4 голосов
/ 14 июля 2009

Вы можете запустить родительский процесс php, который разветвляет клиента с интервалом. Если вам интересно исследовать его как вариант, хорошей отправной точкой является: http://ca2.php.net/pcntl Хорошая вещь в том, чтобы сделать это таким образом, это то, что родительский процесс может уничтожать клиентские pids, которые не завершаются в течение разумного периода времени. .

Если вы ищете что-то быстрое и грязное, вы можете написать bash-скрипт, чтобы довольно легко вызывать php (если вы работаете в linux):

#!/bin/bash
while [ "true" ]; do
        /path/to/script.php
        sleep 15
done

EDIT Вам даже не нужен скрипт, bash сделает все это в одну строку:

while [ "true" ]; do /path/to/script.php; sleep 15; done
2 голосов
/ 14 июля 2009

Убедитесь, что ваш исполняемый файл PHP скомпилирован для использования в качестве интерпретатора командной строки, а не для исполняемого файла CGI. PHP обычно убивает скрипты, которые работают дольше max_execution_time (по умолчанию 30 секунд). Однако исполняемые файлы CLI не накладывают этого ограничения.

Подробнее о CLI и CGI SAPI.

Вы можете проверить SAPI исполняемого файла, используя аргумент --version:

$ php --version
PHP 4.3.0 (cli), Copyright (c) 1997-2002 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies
2 голосов
/ 14 июля 2009

Возможно, вы захотите проверить параметр max_execution_time в файле php.ini. Я считаю, что по умолчанию 30 секунд. При настройке cron вы, вероятно, будете запускать несколько экземпляров скрипта через 10 минут, если вы не добавите некоторую логику в скрипт, чтобы убедиться, что его экземпляр еще не запущен

1 голос
/ 14 июля 2009

PHP как язык не очень хорошо работает бесконечно. Поскольку у вас есть задание cron каждые десять минут, почему бы не выполнить свое задание 60 раз и затем выйти?

Кроме того, PHP имеет различные конфигурационные файлы для CLI и для режимов Apache на большинстве серверов Linux. Поэтому может быть целесообразно проверить ваш файл etc / php / cli / php.ini и проверить максимальное время выполнения и ограничения памяти.

0 голосов
/ 14 июля 2009

Существует модуль PEAR для написания долгосрочных скриптов PHP. Я сам этим не пользовался.

0 голосов
/ 14 июля 2009

очень часто (до того, как вам не хватит памяти) вырывается из цикла и перезапускается exec ("/ usr / bin / php". FILE );

...