Я установил Apache 2.4 с PHP 5.4 на Windows Server 2008, следуя инструкциям из этого руководства: Руководство по установке Apache . Теперь Apache работает как услуга.
Для моего приложения требуется, чтобы скрипт php websocket работал в фоновом режиме. Я запускаю его вручную:
php myscript.php
Возникает вопрос: есть ли способ запустить фоновый скрипт автоматически при перезапуске системы (apache)?
Я нашел следующую тему , но я не знал, где найти сценарий запуска Apache для Windows.
Любая помощь будет очень полезна.
Я придумал решение 🙂
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
%APACHE_HOME%\bin\httpd.exe
Протестировано на: Windows 7, Apache 2.4, Advanced Bat to Exe Converter 2.92
Используйте встроенный планировщик задач Windows, который запускает скрипт .bat
, который вызывает завиток с определенным URL-адресом.
c:\backgroundtasks
Откорректируйте сценарий ниже для ваших нужд:
cd c: \
cd c: \ backgroundtasks
curl http: //localhost/path/to/script.php
Выход
Настройте планировщик заданий для выполнения как основной задачи:
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 для поиска процесса