Запустить PHP-скрипт в фоновом режиме при запуске / перезагрузке Apache (Windows Server)

Я установил Apache 2.4 с PHP 5.4 на Windows Server 2008, следуя инструкциям из этого руководства: Руководство по установке Apache . Теперь Apache работает как услуга.

Для моего приложения требуется, чтобы скрипт php websocket работал в фоновом режиме. Я запускаю его вручную:

php myscript.php 

Возникает вопрос: есть ли способ запустить фоновый скрипт автоматически при перезапуске системы (apache)?

Я нашел следующую тему , но я не знал, где найти сценарий запуска Apache для Windows.

Любая помощь будет очень полезна.

Solutions Collecting From Web of "Запустить PHP-скрипт в фоновом режиме при запуске / перезагрузке Apache (Windows Server)"

Я придумал решение 🙂

  • Создайте переменную окружения, указывающую на ваш каталог Apache
  •  APACHE_HOME = C:/PATH/TO_APACHE 

  • Переименуйте %APACHE_HOME%\bin\httpd.exe в %APACHE_HOME%\bin\httpdVendor.exe
  • Создайте командный файл и поместите следующий код:
  •  php myscript.php %APACHE_HOME%\bin\httpdVendor.exe -k runservice exit 0 
  • Загрузите / установите бесплатное программное обеспечение BatToExeConverter (следующее, следующее, …)
  • Откройте установленный конвертер и откройте только что созданный пакетный файл
  • Нажмите кнопку « Создать EXE» (укажите конфигурацию по умолчанию)
  • Сохраните файл: %APACHE_HOME%\bin\httpd.exe
  • Запустите свой сервер Apache
  • Протестировано на: Windows 7, Apache 2.4, Advanced Bat to Exe Converter 2.92

    Используйте встроенный планировщик задач Windows, который запускает скрипт .bat , который вызывает завиток с определенным URL-адресом.

    1. Загрузите curl из http://curl.haxx.se/download.html и извлеките curl.exe в любой каталог, но мы будем использовать c:\backgroundtasks
    2. Откорректируйте сценарий ниже для ваших нужд:

      cd c: \

      cd c: \ backgroundtasks

      curl http: //localhost/path/to/script.php

      Выход

    3. Настройте планировщик заданий для выполнения как основной задачи:

      • Вкладка «Общие» – как системная учетная запись (для запуска, когда вы не авторизованы на сервере)
      • Вкладка «Триггеры» – настройка частоты
      • Вкладка «Настройки» – внизу внизу. If the task is already running... чтобы Stop the existing instance

    Лучший способ здесь – использовать зависимости служб Windows.

    Создайте файл php-websocket-server.cmd с любыми необходимыми настройками среды (например, сменив на каталог, установив PATH и т. Д.) С последней строкой:

     php myscript.php 

    Установите средства набора ресурсов Windows Server , чтобы получить srvany и instsrv для создания пользовательской службы . Обратите внимание на путь установки, который вам понадобится в следующем шаге.

    Откройте оболочку cmd и запустите:

     <path_to_resource_kit>\instsrv PHPWebSocketServer <path_to_resource_kit>\srvany.exe 

    Затем создайте файл php-websocket-server.reg содержащий следующее (обновление для вашей среды):

     Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PHPWebSocketServer\Parameters] "Application"="c:\\path\\to\\php-websocket-server.cmd" 

    Импортируйте его двойным щелчком или regedit /s php-websocket-server.reg

    Вернемся в оболочку cmd :

     sc config Apache2.4 depend= PHPWebSocketServer 

    чтобы служба Apache2.4 * зависела от вашего php-сервиса. Теперь, когда Apache запущен, сначала будет поднят сервис php. Точно так же, если вы остановите службу php, Apache остановится вместе с ней.

    * howto указывает, что служба называется «Apache2.4», но вы можете проверить ее при установке.

    При работе в качестве службы у вас не будет сценария запуска.

    Выполните некоторую реализацию службы, которая позволяет запускать другие программы в качестве сервисов, а затем заставлять новую службу (которая запускает ваш скрипт) зависимость от службы Apache. Однако это не приведет к перезагрузке скрипта при перезапуске apache.

    Одно возможное решение с использованием SrvStart , а другое – с помощью ServiceEx .

    Возможно, не устанавливайте Apache в качестве службы, а затем отредактируйте сценарий запуска / перезапуска и используйте вышеуказанный метод для запуска Apache в качестве сервиса (вместо использования собственного установщика Apache).

    Создайте файл bat, например, «myphp.bat», содержащий path/php myscript.php . Включите правильный путь к php, если это не путь.

    создать файл bat, например runmyphp.bat, содержащий

    AT 00:00 / каждый: M, T, W, Th, F "cmd / c /path/myphp.bat", снова включающий правильный путь.

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

    Google «windows at command» или «cron» для получения правильного синтаксиса команды «at», но вы можете найти здесь подробное объяснение.

    Я нашел еще один ответ C: \ wamp \ scripts \ wampserver.lib.php этот файл запускается каждый раз, когда начинается ваша игра

    укажите путь к файлу include_once("file_path"); к этому файлу и его завершению. это идеальное решение, которое вы хотите

    Наслаждаться!!!!!!!!!

    Завершите все необходимые процессы в пакетном файле и используйте RunAsService. С некоторой настройкой вы можете убедиться, что ваш сервис запускается до Apache.

    Хотя решение Halayem Anis очень креативное, я думаю, важно отметить, что вы никогда не можете быть уверены, что PHP скрипт работает в фоновом режиме. Поэтому, если вы решите запустить свой скрипт в начале «Apache start», вы, вероятно, закончите операцию по возврату Apache довольно часто, просто перезагрузите свой скрипт.

    Я предполагаю, что даже когда вы пришли к этому вопросу, так как на обычном сервере вам никогда не придется прикасаться к кнопке сброса Apache. Он запускается при запуске системы, а затем запускается. Если это так, вы можете просто запустить команду php myscript.php при запуске.

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

    Итак, первый шаг – дать возможность отслеживать, работает ли скрипт. Я бы пошел на простой подход, когда ваш myscript.php записывает один байт в файл каждые 5 секунд или около того. Таким образом, я могу использовать последнее модифицированное время для файла, чтобы увидеть, все еще работает, потому что last modified time + 5 seconds < now == not running .

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

    Вторая часть состоит в том, чтобы каждый запрос проверял, работает ли скрипт. Для этой двух работ я бы использовал PHP.ini для добавления сценария php для каждого запроса. Вы можете сделать это с помощью опции auto_append_file .

    Этот скрипт preend будет работать следующим образом:

     <?php $filename = 'checkonline.txt'; $cmd = "php myscript.php"; if (filemtime($filename)+5<time()) { //run in background without freezing php //based on code posted on PHP exec manual, linked below if (substr(php_uname(), 0, 7) == "Windows"){ pclose(popen("start /B ". $cmd, "r")); } else { exec($cmd . " > /dev/null &"); } } ?> 

    Обязательно проверьте, как работают файлы filemtime и exec, и что вам нужно иметь в виду. Они немного отличаются в Windows / * nix.

    Создайте командные файлы Windows для запуска Apache и скрипта PHP:

     net start apache || (pause && exit /b) start "PHP Script 01" /DC:\inetpub\scripts php script01.php || (pause && exit /b) 

    Аналогично, вы можете создать командный файл, который завершает скрипт PHP и останавливает Apache:

     taskkill /FI "WINDOWTITLE eq PHP Script 01" net stop apache 

    В приведенных выше примерах:

    • Apache – это имя службы, которое отображается в Services.msc; может быть вместо Apache2.1 или Apache2.2
    • C:\inetpub\scripts – это каталог, содержащий скрипт; команда « Пуск» изменится на этот каталог
    • PHP Script 01 – это метка, которая используется в команде Taskkill для поиска процесса