Зацикливание PHP-скрипта

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

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

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

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


person William W    schedule 13.07.2009    source источник


Ответы (6)


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

Если вы ищете что-то быстрое и грязное, вы можете написать 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
person Eddy    schedule 13.07.2009
comment
Мне нравится эта идея. Я пробую это сейчас. - person William W; 14.07.2009
comment
У меня возникли проблемы с запуском скрипта bash через cron. Что-то особенное надо поставить или только тайминг и потом путь к скрипту? - person William W; 14.07.2009
comment
Вам не нужно использовать cron, он будет работать бесконечно - если вы используете cron, вы получите множество процессов, выполняющих одно и то же. Просто нажмите chmod +x на скрипт bash и запустите его: /path/to/script.sh & - person Eddy; 14.07.2009
comment
Сладкий, все заработало, большое спасибо всем, и особенно вам, Эдди! - person William W; 14.07.2009
comment
На самом деле еще одна вещь. Знаете ли вы, как я могу поддерживать его работу после закрытия окна терминала? Я поставил & в конце, но он все равно остановил процесс после того, как я ушел. - person William W; 14.07.2009
comment
@William Как ты добавил nohup, можешь вставить сюда. Спасибо! - person Aivan Monceller; 27.10.2011
comment
Я давно перестал использовать этот скрипт, но я считаю, что поместил вызов php-скрипта в сценарий оболочки, а затем вызвал/запланировал его с помощью: /bin/bash /home/path/file.sh & - person William W; 01.11.2011

Убедитесь, что ваш исполняемый файл 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
person Ben Blank    schedule 13.07.2009

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

person RC.    schedule 13.07.2009

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

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

person AnalyticaL    schedule 13.07.2009

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

person Community    schedule 13.07.2009
comment
Проблема в том, что родительский скрипт ожидает возврата, чего никогда не произойдет. Будет ли это работать: exec(/usr/bin/php ./servercleaner.php › /dev/null 2›&1 &); Или это по-прежнему будет создавать сценарии и никогда не доходить до конца? - person William W; 14.07.2009

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

person Ken Keenan    schedule 13.07.2009