PHP скрипт, который работает вечно :) - PullRequest
0 голосов
/ 04 февраля 2012

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

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

Ответы [ 2 ]

2 голосов
/ 04 февраля 2012

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

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

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

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

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

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

1 голос
/ 04 февраля 2012

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

 set_time_limit(0);
 ignore_user_abort(true); 

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

...