Запуск и остановка PHP-скрипта с административной веб-страницы бэкэнда - PullRequest
0 голосов
/ 01 октября 2011

Я пытаюсь создать веб-страницу, которая позволит мне запускать и останавливать сценарий PHP. Сценарий является частью серверной части сайта и должен будет получать доступ, считывать данные, обрабатывать эти данные и обновлять базу данных на том же сервере, на котором существует сценарий. Кроме того, я хотел бы, чтобы веб-страница позволяла администратору просматривать текущее состояние (запущен или остановлен) и даже указывать ссылки на журналы, созданные сценарием. Я начинаю идти по пути изучения exec, passthru и связанных функций PHP. Это правильный путь? Есть ли другие способы сделать это, которые были бы более подходящими? Возможно ли сделать это независимым от платформы способом? Я занимаюсь разработкой стека LAMPP + CakePHP в Windows и хотел бы, чтобы эта функциональность существовала на любом веб-хосте, который я выберу.

Ответы [ 2 ]

3 голосов
/ 01 октября 2011

Я сделал это на недавней работе, но это, вероятно, излишне для вас.Я сделал процессор заданий, и он в основном устанавливает 2 таблицы в базе данных, минимум 2 объекта и минимум 2 контроллера.

Первая часть - это блок обработки задания, он состоит из контроллера обработчика заданий.он управляет запросом на запуск или продолжение работы и поставляется с двумя активными моделями JobQueue и Job.Вы можете удалить очередь, но всегда практично иметь очереди в таких системах, поэтому вы можете сказать, что 2,3,4 задания могут выполняться одновременно.

Очередь только в том, что это слот, который получает несколькоЗадания прикреплены к нему, и он имеет статус очереди, чтобы определить, выполняется ли он прямо сейчас или нет.

Задание - это виртуальный объект, который отображается в таблицу заданий с описанием того, что должно быть сделано.В моей реализации я создал интерфейс, который должен быть реализован в вызываемом контроллере и поле + тип в базе данных.Job создает экземпляр класса контроллера для вызова (не контроллер процессора задания, а другой контроллер, который управляет выполняемой операцией) и вызывает в нем метод для запуска обработки задачи.

Теперь, чтобы запутаться, я вынужденмоя система запускалась на выделенном сервере только для этой части, потому что я не хотел, чтобы задача загружала основной сервер или блокировала очередь обработки Apache.Таким образом, у меня было два сервера, и мой класс Queue отвечал за вызов через ip-адрес страницы на другом сервере, чтобы выполнить задание именно на этом сервере.Когда работа была выполнена, она перезвонила, используя HTTP-запрос, чтобы возобновить обработку и выполнить следующую задачу.Если не было оставлено ни одной задачи, то она просто умерла бы нормально.

Преимущество выполнения этого способа состоит в том, что он не требует cronjob (если ваш сценарий супер стабилен и не может аварийно завершиться), потому что онзапускается вами, когда вы этого хотите, а затем вы можете отпустить его, и он вызывает себя с помощью fsockopen, чтобы вызвать другой просмотр страницы, который запускает следующее задание.

Рабочие единицы

Важно понимать, что если ваши работы очень большие, вы должны их сегментировать.Я использовал принцип «рабочего блока», чтобы описать 1 часть, которую работа должна выполнять любое количество раз.Затем обработчик очередей тоже стал менеджером времени, так что он мог определить, заняло ли задание больше X секунд, он просто отложил бы остальные шаги на потом и перезвонил и продолжил, где бы он ни находился.Таким образом, вам не нужно «устанавливать ограничение по времени», и вы не заклиниваете свой сервер, пока выполняется сценарий 30 с.

Надеюсь, это поможет!

0 голосов
/ 03 октября 2011

Чтобы запустить скрипт, который выполняется постоянно, вам нужно подумать:

  • Ваш php-скрипт должен запускаться как CLI (командная строка) заданиемпланировщик типа cron или что-то еще.Не забывайте, что конфигурация вашего веб-сервера определила время ожидания для исполняемого скрипта.

  • Чтобы работать 24 часа в сутки, вы можете представить себе бесконечный цикл.В этом случае вы можете написать тест, такой как jobIsActive, который будет читать файл или базу данных каждый цикл, если задание будет выполнено или нет.Если вы нажмете на кнопку, просто измените статус работы (файл обновления, дБ ...).Ваша обе кнопки могут остановить обработку или активировать ее, но не остановят бесконечный цикл.

  • Бесконечный цикл - не самое элегантное решение, почему бы вам не написать записьна вкладке cron для выполнения задания каждую ночь, и нажатие на кнопку может привести к ее ручному запуску.

...