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

2019-07-19 08:45发布

我已经安装了Apache 2.4和PHP 5.4的Windows Server 2008下,从本手册的说明上: Apache的安装手册 。 阿帕奇现在作为服务运行。

我的应用程序需要一个PHP WebSocket的脚本在后台运行。 我用手动运行它:

php myscript.php

现在的问题是:有没有一个自动启动一个后台脚本上系统(阿帕奇)重启呢?

我发现下面的话题 ,但我不知道我在哪里可以找到适用于Windows的Apache的启动脚本。

任何帮助将大大appriciated。

Answer 1:

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

  • 创建一个环境变量指向你的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



    Answer 2:

    使用内置的Windows任务计划触发.bat脚本,该脚本调用卷曲与定义的URL。

    1. 从下载卷曲http://curl.haxx.se/download.html和提取上的任何目录curl.exe,但我们将使用c:\backgroundtasks
    2. 下面调整到您的需要的脚本:

      CD C:\

      CD C:\ backgroundtasks

      卷曲的http://localhost/path/to/script.php

      出口

    3. 配置任务计划的基本任务运行:

      • 常规选项卡 - 为系统帐户(当你还没有登录到服务器上运行)
      • 触发器标签 - 调整频率
      • 设置选项卡-在底部设置If the task is already running...Stop the existing instance


    Answer 3:

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

    做一个php-websocket-server.cmd文件与任何必要的环境设置(例如,改变到一个目录,设置PATH,等等)与最后一行:

    php myscript.php
    

    安装在Windows Server Resource Kit工具 ,让srvanyinstsrv创建用户定义的服务 。 请注意,你会需要它在下一步的安装路径。

    打开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”但你可能要在您的安装进行验证。



    Answer 4:

    当作为服务运行时,你不会有启动脚本。

    执行,允许运行的其他程序作为服务一些服务实现,然后再进行新的服务(这是运行脚本)Apache服务的依赖。 然而,阿帕奇重新启动时,这将不会重新启动脚本。

    使用SrvStart一个可能的解决方案 ,以及另一个使用ServiceEx 。

    也许不Apache安装为服务,然后编辑启动/重新启动脚本,并使用上述方法来运行Apache作为服务(而不是使用Apache自己的安装程序)。



    Answer 5:

    创建批处理文件,电子例如,含有“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”出现在命令行窗口“来获得所有正确的语法为“在”命令,但你现在可以找到详细的解释在这里 。



    Answer 6:

    我发现了另一个答案C:\ WAMP \脚本\ wampserver.lib.php你WAMP启动时,这个文件是每次运行

    包括你的文件路径include_once("file_path"); 这个文件和对其做。 这是您要的完美解决方案

    请享用!!!!!!!!!



    Answer 7:

    虽然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中略有不同。



    Answer 8:

    结束语你所有需要的工艺在一个批处理文件,并使用RunAsService有了一些调整,你可以确保你的服务的Apache之前启动。



    文章来源: Run PHP script in background on Apache start/restart(Windows Server)