我已经安装了Apache 2.4和PHP 5.4的Windows Server 2008下,从本手册的说明上: Apache的安装手册 。 阿帕奇现在作为服务运行。
我的应用程序需要一个PHP WebSocket的脚本在后台运行。 我用手动运行它:
php myscript.php
现在的问题是:有没有一个自动启动一个后台脚本上系统(阿帕奇)重启呢?
我发现下面的话题 ,但我不知道我在哪里可以找到适用于Windows的Apache的启动脚本。
任何帮助将大大appriciated。
我想出了一个解决方案:)
创建一个环境变量指向你的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中,阿帕奇2.4,高级蝙蝠为EXE转换器2.92
使用内置的Windows任务计划触发.bat
脚本,该脚本调用卷曲与定义的URL。
- 从下载卷曲http://curl.haxx.se/download.html和提取上的任何目录curl.exe,但我们将使用
c:\backgroundtasks
下面调整到您的需要的脚本:
CD C:\
CD C:\ backgroundtasks
卷曲的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 Resource Kit工具 ,让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服务的依赖。 然而,阿帕奇重新启动时,这将不会重新启动脚本。
使用SrvStart一个可能的解决方案 ,以及另一个使用ServiceEx 。
也许不Apache安装为服务,然后编辑启动/重新启动脚本,并使用上述方法来运行Apache作为服务(而不是使用Apache自己的安装程序)。
创建批处理文件,电子例如,含有“myphp.bat” path/php myscript.php
。 包括正确的路径到PHP,如果它不path'd。
创建一个bat文件,如runmyphp.bat含
AT 00:00 /每个:M,T,W,Th时,F “CMD / C /path/myphp.bat”,又包括了正确的路径。
然后使用资源管理器将runmyphp到启动文件夹,所以它总是会在系统启动时运行。
谷歌或“窗口的cron”出现在命令行窗口“来获得所有正确的语法为“在”命令,但你现在可以找到详细的解释在这里 。
我发现了另一个答案C:\ WAMP \脚本\ wampserver.lib.php你WAMP启动时,这个文件是每次运行
包括你的文件路径include_once("file_path");
这个文件和对其做。 这是您要的完美解决方案
请享用!!!!!!!!!
虽然Halayem阿尼斯的解决方案是非常有创意,我认为它需要注意的是,你永远不能肯定是一个PHP
脚本,保持在后台运行。 所以,如果你选择开始“阿帕奇启动”你的脚本,那么你可能最终运复位阿帕奇很多时候,简单的重新启动你的脚本。
我想这就是你甚至如何来到这个问题,作为一个正常的服务器上,你从来没有接触到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中略有不同。
结束语你所有需要的工艺在一个批处理文件,并使用RunAsService有了一些调整,你可以确保你的服务的Apache之前启动。