【问题标题】:Run PHP script in background on Apache start/restart(Windows Server)在 Apache 启动/重启(Windows Server)的后台运行 PHP 脚本
【发布时间】:2013-01-21 01:10:19
【问题描述】:

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

我的应用程序需要一个 php websocket 脚本才能在后台运行。我正在手动运行它:

php myscript.php

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 后台运行是什么意思?一个cron?自动前置?
  • 那么脚本可以 24/7 运行并且应该监听传入的请求。所以在系统重置时它应该自动启动,就像我在控制台中输入'php myscript.php'并让控制台保持打开状态。
  • 没有可靠的方法来保持 php 脚本 24/7 全天候运行。传入请求是如何生成的?他们是做什么的?
  • 脚本是这样的websocket服务器:github.com/GulDmitry/php-websocket-server.
  • 只是需要一种方法来刷新一些浏览器,以防另一个事件发生。应用程序仅在几台机器上本地运行,这是我想出的解决方案。可能不是最佳做法:P 那你有什么建议?

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


【解决方案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、Apache 2.4、Advanced Bat to Exe Converter 2.92

    【讨论】:

    • 一个非常有创意的解决方案:)
    • 这很聪明,但也是每次更新 Apache 二进制文件时都必须重新实现的 hack。
    【解决方案2】:

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

    1. http://curl.haxx.se/download.html下载curl并解压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

    【讨论】:

      【解决方案3】:

      这里最好的方法是使用 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 表明该服务名为“Apache2.4”,但您可能需要在安装中进行验证。

      【讨论】:

        【解决方案4】:

        作为服务运行时,您将没有启动脚本。

        执行一些允许将其他程序作为服务运行的服务实现,然后使新服务(正在运行您的脚本)成为 Apache 服务的依赖项。但是,这不会在 apache 重新启动时重新启动脚本。

        One possible solution using SrvStartanother using ServiceEx

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

        【讨论】:

          【解决方案5】:

          创建 bat 文件,例如包含 path/php myscript.php 的“myphp.bat”。如果不是路径,请包含正确的 php 路径。

          创建一个bat文件,例如包含

          的runmyphp.bat

          AT 00:00 /every:M,T,W,Th,F "cmd /c /path/myphp.bat",再次包含正确的路径。

          然后用资源管理器将runmyphp拖到启动文件夹中,这样它就会一直在系统启动时运行。

          Google 'windows at command' 或 'windows cron' 以获取 'at' 命令的所有正确语法,但您目前可以找到详细说明 here

          【讨论】:

            【解决方案6】:

            我找到了另一个答案 C:\wamp\scripts\wampserver.lib.php 这个文件每次你的 wamp 启动时都会运行

            将您的文件路径 include_once("file_path"); 包含到此文件并完成。这是您想要的完美解决方案

            享受!!!!!!!!!

            【讨论】:

            • 这只是因为 wamp 使用它自己的经理:wampmanager.tpl。如果您使用WAMP,您也可以更改wampmanager.ini 并更改[StartupAction] 部分。
            • @HugoDelsing 是的先生,首先我想使用 cron 作业,但它不是完美的解决方案,我找到了这种方式,我认为没有其他方式比这更容易
            【解决方案7】:

            虽然 Halayem Anis 的解决方案非常有创意,但我认为重要的是要注意,您永远无法确定 PHP 脚本会一直在后台运行。因此,如果您选择在“Apache start”上启动脚本,那么您可能会经常结束操作重置 Apache,重启脚本很简单。

            我认为这就是您提出这个问题的方式,因为在普通服务器上,您永远不必触摸 Apache 重置按钮。它在系统启动时启动,然后运行。如果是这种情况,您可以在启动时简单地运行 php myscript.php 命令。

            考虑到无法确保脚本继续运行,我将使用不同的方法,检查它是否正在运行,如果没有,则重新启动它。

            所以第一步是让跟踪脚本是否正在运行成为可能。我会采用简单的方法,您的myscript.php 每 5 秒左右将一个字节写入文件。这样我可以使用文件的最后修改时间来查看它是否仍在运行,因为last modified time + 5 seconds &lt; 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 上的工作方式略有不同。

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-02-01
                • 1970-01-01
                • 1970-01-01
                • 2012-07-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-12-05
                相关资源
                最近更新 更多