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

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

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

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

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

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

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

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

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

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

set_time_limit(0); ignore_user_abort(true); 

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