PHP-скрипт, который работает вечно :)

Я ищу некоторые идеи, чтобы сделать следующее. Мне нужен PHP-скрипт для выполнения определенного действия в течение довольно длительного времени. Это расширение для CMS, и это не может быть ничем иным, как PHP. Это также не может быть скрипт командной строки, потому что он должен использоваться обычными людьми, которые будут иметь только стандартные средства CMS. Один из вариантов — наличие задания cron (на большинстве простых хостингов оно есть), которое будет часто запускать скрипт, чтобы вместо долгой работы он выполнял действие шаг за шагом, сохраняя свое состояние от одного запуска к другому. Это не идеально, но я не вижу других решений. Если скрипт будет перенаправлять на себя, сервер прервет его. Какие еще варианты могут подойти?

Спасибо всем заранее!


person AndreyM    schedule 04.02.2012    source источник
comment
Правильно, мы не хотим вашей благодарности заранее, мы хотим вашей благодарности постфактум ;)   -  person andrewtweber    schedule 04.02.2012
comment
Функциональность в PHP не может быть удалена за одну ночь. Более чем вероятно, что ваша CMS (в зависимости от сложности) сломается из-за обновлений PHP до того, как это сделает ваш скрипт.   -  person kba    schedule 04.02.2012


Ответы (2)


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

Возможно, вы знакомы с ними в форме Apache и MySQL;) В любом случае PHP в целом в порядке в этом отношении, у него есть возможность работать с необработанными сокетами, а также разветвлять подпроцессы для одновременной обработки нескольких запросов.

Сказав, что демоны PHP — это инструмент, в котором YMMV. Некоторые люди скажут, что они отлично работают, другие люди, такие как я, скажут, что у них есть проблемы с межпроцессным взаимодействием и утечкой памяти даже среди множества вызовов unset().

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

Вот ссылка о написании демона PHP.

Кроме того, еще одно замечание. Демоны время от времени падают, и поэтому вам все равно может понадобиться хранить состояние о том, что происходит, на случай, если кто-то споткнется о шнур питания на вашем общем сервере :)

person quickshiftin    schedule 04.02.2012
comment
Спасибо. Это хороший вариант, но, поскольку он будет частью широко распространенного программного обеспечения, большинство людей не смогут запустить скрипт как демон php. - person AndreyM; 04.02.2012
comment
Хорошо, это хорошо, но по сути это и есть программа, которая «работает вечно». Если вы думаете о широком распространении, вы можете даже вычеркнуть cron из списка, если Windows является желаемой платформой. Существует несколько методов эмуляции долго работающих программ внутри Apache посмотрите здесь, но их лучше оставить для коротких программ. Любой, у кого есть root-доступ в системе *nix, может запустить/установить демон. Если целью программного обеспечения являются системы виртуального хостинга, возможно, cron — это то, что нужно. - person quickshiftin; 04.02.2012
comment
Да, я знаю, что такое демон, это был бы действительно отличный вариант, если только это не было для людей, которые могут только скачать расширение и установить его стандартными средствами CMS (выберите файл расширения и нажмите «Установить»). - person AndreyM; 04.02.2012

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

 set_time_limit(0);
 ignore_user_abort(true); 

вверху, чтобы сказать ему, чтобы он не истекал по тайм-ауту и ​​не прерывался ничем. Затем вызовите его из cron, чтобы запускать его каждый день или что-то еще. У меня это есть во многих ежедневных задачах с длительной обработкой, и это отлично работает для меня. Тем не менее, он не сможет легко общаться с внешним миром (другие скрипты не могут запрашивать его или что-то еще - если это то, что вы хотите, посмотрите на службы php), поэтому, как только вы запустите его, убедитесь, что он остановится и заставить его печатать свой прогресс в файл журнала.

person hackartist    schedule 04.02.2012
comment
Я тоже имел это в виду, но мне интересно, контролируют ли хостинг-провайдеры свои серверы, чтобы обнаруживать и прерывать такие сценарии. Также мне интересно, есть ли у хостинг-провайдеров способ отключить возможность изменять параметры, которые вы упомянули. - person AndreyM; 04.02.2012