我已按照本手册中的说明在Windows Server 2008上安装了Apache 2.4和PHP 5.4: Apache installing manual。 Apache现在作为服务运行。
我的应用程序需要一个php websocket脚本才能在后台运行。我正在使用以下方式运行它:
php myscript.php
问题是:有没有办法在系统(apache)重启时自动启动后台脚本?
我找到了以下topic,但我不知道在哪里可以找到适用于Windows的apache启动脚本。
任何帮助都会很受欢迎。
答案 0 :(得分:12)
我想出了一个解决方案:)
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
答案 1 :(得分:2)
使用内置的Windows任务计划程序触发.bat
脚本,该脚本使用已定义的URL调用curl。
c:\backgroundtasks
根据您的需要调整下面的脚本:
cd c:\
cd c:\ backgroundtasks
curl http://localhost/path/to/script.php
出口
将任务计划程序配置为基本任务:
If the task is already running...
至Stop the existing instance
答案 2 :(得分:2)
这里最好的方法是使用Windows服务依赖项。
使用最后一行创建包含任何必要环境设置的php-websocket-server.cmd
文件(例如,更改为目录,设置PATH等等):
php myscript.php
安装Windows Server Resource Kit Tools,以获取srvany
和instsrv
以创建user defined service。请注意安装路径,因为您将在下一步中需要它。
打开cmd
shell并运行:
<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
shell:
sc config Apache2.4 depend= PHPWebSocketServer
使Apache2.4 *服务依赖于您的php服务。现在,当Apache启动时,将首先启动php服务。同样,如果停止php服务,Apache将随之停止。
* howto表示该服务被命名为#34; Apache2.4&#34;但您可能需要在安装中进行验证。
答案 3 :(得分:1)
作为服务运行时,您将没有启动脚本。
执行一些允许将其他程序作为服务运行的服务实现,然后使新服务(运行脚本)成为Apache服务的依赖项。但是,当apache重新启动时,这不会重新启动脚本。
One possible solution using SrvStart和another using ServiceEx。
也许不要将Apache作为服务安装,然后编辑启动/重启脚本,并使用上面的方法将Apache作为服务运行(而不是使用Apache自己的安装程序)。
答案 4 :(得分:1)
创建bat文件,例如包含path/php myscript.php
的'myphp.bat'。如果没有路径,请包含正确的php路径。
创建一个bat文件,例如包含
的runmyphp.bat在00:00 /每个:M,T,W,Th,F“cmd / c /path/myphp.bat”,再次包括正确的路径。
然后使用explorer将runmyphp拖到启动文件夹中,因此它将始终在系统启动时运行。
谷歌'windows at command'或'windows cron'获取'at'命令的所有正确语法,但您目前可以找到详细解释here。
答案 5 :(得分:1)
我找到了另一个答案C:\ wamp \ scripts \ wampserver.lib.php这个文件每次运行时都会运行
将此文件路径include_once("file_path");
包含在此文件中并完成。这是你想要的完美解决方案
享受!!!!!!!!!
答案 6 :(得分:1)
尽管Halayem Anis的解决方案非常具有创造性,但我认为重要的是要注意,您永远无法确定PHP
脚本是否在后台运行。因此,如果您选择在#34; Apache start&#34;上启动脚本,那么您可能会经常停止重置Apache,简单地重新启动脚本。
我认为甚至你是如何解决这个问题的,因为在普通服务器上你永远不必触摸Apache重置按钮。它从系统启动开始然后运行。如果是这种情况,您可以在启动时简单地运行php myscript.php
命令。
考虑到没有办法确保脚本继续运行,我会使用不同的方法,检查它是否正在运行,如果没有,重新启动它。
因此,第一步是可以跟踪脚本是否正在运行。我会选择一种简单的方法,即myscript.php
每隔5秒左右将一个字节写入一个文件。这样我可以使用文件的最后修改时间来查看它是否仍在运行,因为last modified time + 5 seconds < now == not running
。
您还可以每隔5秒左右将最后一次访问时间存储在数据库中。如果你有很多流量,那么访问文件可能会稍快一些。
第二部分是让每个请求检查脚本是否正在运行。对于这两项工作,我会使用PHP.ini
在每个请求上添加一个php脚本。您可以使用auto_append_file选项执行此操作。
这个前置脚本的工作原理如下:
<?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上的工作略有不同。
答案 7 :(得分:0)
汇总批处理文件中的所有必需流程并使用RunAsService 通过一些调整,您可以确保您的服务在Apache之前启动。