在Apache启动/重启(Windows Server)后台运行PHP脚本

时间:2013-02-05 23:24:05

标签: php windows apache windows-server-2008-r2

我已按照本手册中的说明在Windows Server 2008上安装了Apache 2.4和PHP 5.4: Apache installing manual。 Apache现在作为服务运行。

我的应用程序需要一个php websocket脚本才能在后台运行。我正在使用以下方式运行它:

php myscript.php

问题是:有没有办法在系统(apache)重启时自动启动后台脚本?

我找到了以下topic,但我不知道在哪里可以找到适用于Windows的apache启动脚本。

任何帮助都会很受欢迎。

8 个答案:

答案 0 :(得分:12)

我想出了一个解决方案:)

  • 创建指向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

    答案 1 :(得分:2)

    使用内置的Windows任务计划程序触发.bat脚本,该脚本使用已定义的URL调用curl。

    1. http://curl.haxx.se/download.html下载curl并在任何目录中提取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

    答案 2 :(得分:2)

    这里最好的方法是使用Windows服务依赖项。

    使用最后一行创建包含任何必要环境设置的php-websocket-server.cmd文件(例如,更改为目录,设置PATH等等):

    php myscript.php
    

    安装Windows Server Resource Kit Tools,以获取srvanyinstsrv以创建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 SrvStartanother 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 &");  
      } 
    }
    ?>
    

    请务必查看filemtimeexec的工作方式以及您需要注意的事项。它们在Windows / * nix上的工作略有不同。

    答案 7 :(得分:0)

    汇总批处理文件中的所有必需流程并使用RunAsService 通过一些调整,您可以确保您的服务在Apache之前启动。