7

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

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

php myscript.php

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

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

任何帮助将不胜感激。

4

8 回答 8

13

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

  • 创建一个指向 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 (next, next, ...)
  • 打开已安装的转换器并打开新创建的批处理文件
  • 点击按钮Build EXE(让默认配置)
  • 保存文件:%APACHE_HOME%\bin\httpd.exe
  • 启动您的 Apache 服务器
  • 测试:Windows 7、Apache 2.4、Advanced Bat to Exe Converter 2.92

    于 2015-01-21T22:24:49.950 回答
    2

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

    1. 从http://curl.haxx.se/download.html下载 curl并将 curl.exe 解压到任意目录,但我们将使用c:\backgroundtasks
    2. 根据您的需要调整以下脚本:

      CDC:\

      cd c:\backgroundtasks

      curl http://localhost/path/to/script.php

      出口

    3. 将任务计划程序配置为作为基本任务运行:

      • 常规选项卡 - 作为系统帐户(在您未登录服务器时运行)
      • 触发器选项卡 - 调整频率
      • 设置选项卡 - 在底部设置If the task is already running...Stop the existing instance
    于 2015-01-22T17:38:09.210 回答
    2

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

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

    php myscript.php
    

    安装Windows Server Resource Kit Tools,以获取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”,但您可能需要在安装中进行验证。

    于 2015-01-27T18:19:07.097 回答
    1

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

    包括该文件的文件路径include_once("file_path");及其完成。这是您想要的完美解决方案

    享受!!!!!!!!!

    于 2015-01-23T13:46:45.230 回答
    1

    尽管 Halayem Anis 的解决方案非常有创意,但我认为重要的是要注意,您永远无法确定PHP脚本会在后台继续运行。因此,如果您选择在“Apache start”上启动脚本,那么您可能会经常结束操作重置 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 上的工作方式略有不同。

    于 2015-01-27T09:06:47.877 回答
    1

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

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

    一种使用 SrvStart 的可能解决方案另一种使用 ServiceEx的解决方案。

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

    于 2013-02-06T08:07:09.033 回答
    1

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

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

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

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

    谷歌“windows at command”或“windows cron”以获得“at”命令的所有正确语法,但您目前可以在此处找到详细说明。

    于 2015-01-23T06:44:47.120 回答
    0

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

    于 2015-01-26T03:44:58.970 回答