【问题标题】:PHP exec() as Background Process (Windows Wampserver Environment)PHP exec() 作为后台进程(Windows Wampserver 环境)
【发布时间】:2011-07-19 01:03:59
【问题描述】:

我正在尝试设置一个启动后台进程的 php 触发器文件。 (见this question

我在 Windows Wampserver 环境中执行此操作。

例如,我有 trigger.php 运行调用我的 backgroundProcess.php 被解析和执行的 exec 函数。

但是问题是我的trigger.php 文件正在等待exec() 命令在它停止之前完成运行backgroundProcess.php。后台进程运行大约 20-30 秒,trigger.php 一直在等待,直到 backgroundProcess.php 完全完成。

这有意义吗?这是运行exec() 命令的trigger.php 文件

exec('C:\wamp\bin\php\php'.phpversion().'\php.exe -f C:\path\to\backgroundProcess.php > C:\wamp\bin\php\php'.phpversion().'\dev\null &');

基本上,我希望trigger.php 只触发 backgroundProcess 而不是等待它完成。


编辑

使用以下命令解决问题:

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:\wamp\bin\php\phpVERSIONNUMBER\php-win.exe -f C:/wamp/www/path/to/backgroundProcess.php", 0, false);

【问题讨论】:

  • 这给我带来了随机的问题。抛出关于无法运行命令的异常。检查我的答案。
  • 文件 backgroundProcess.php 里有什么?

标签: php exec background-process


【解决方案1】:

除了上面 Rohit 的回答,我编辑了他的解决方案以在 Windows 10 PHP 7.0.3 上工作:

pclose(popen("start /B ". $cmd, "w"));

【讨论】:

    【解决方案2】:

    很可能在 Windows 环境中使用 exec() 时重定向到 NUL:/dev/null 是一个 *nix 空文件。

    【讨论】:

      【解决方案3】:

      尝试在装有 PHP 5.2.8 的 Windows 2000 服务器上实现同样的效果。

      没有一个解决方案对我有用。 PHP 一直在等待响应。

      找到解决办法:

      $cmd = "E:\PHP_folder_path\php.exe E:\some_folder_path\backgroundProcess.php";
      pclose(popen("start /B ". $cmd, "a"));  // mode = "a" since I had some logs to edit
      

      ps: 将相同的回复发布到另一个线程 (PHP on a windows machine; Start process in background),因为这两个链接对我做一些研究很有帮助。

      【讨论】:

      • 我发现这种方法在运行 PHP 5.4 的 Win7 上非常可靠
      • a 不是popen() 的有效模式,仅rw 或二进制rbrw 接受。
      【解决方案4】:

      使用以下命令解决问题:

      $WshShell = new COM("WScript.Shell");
      $oExec = $WshShell->Run("C:\wamp\bin\php\phpVERSIONNUMBER\php-win.exe -f C:/wamp/www/path/to/backgroundProcess.php", 0, false);
      

      【讨论】:

      • 这给我带来了随机的问题。抛出关于无法运行命令的异常。检查我的答案。
      • @Muhammad Gelbana 你在这个问题上没有答案。想更具体一点或链接到你所指的答案吗?
      • 已删除!无论如何,这里是我写的内容的总结exec("CMD /C start yourcommand here"); I think the /C parameter switch isn't necessary, but I'm just being extra sure. Prefix your command with dirname(__FILE__) if you want to execute in the current directory of the script. This can only work if the start command exists on your windows machine.
      【解决方案5】:

      来自手册:http://www.php.net/manual/en/function.exec.php

      注意:

      如果一个程序以此启动 功能,以使其继续 后台运行,输出 程序必须重定向到 文件或其他输出流。失败 这样做会导致 PHP 挂起,直到 程序执行结束。

      我回答了一个类似的问题:Call another PHP script and return control to user before the other script completes

      【讨论】:

      • @JohnP - 是的,但我以为我是在末尾加上 > C:\wamp\bin\php\php'.phpversion().'\dev\null & 位?
      • 我认为您需要创建一个文件描述符并将其作为第二个参数传入。不仅仅是管道。
      • @JohnP - 我以前没有听说过文件描述符......至少不是那个词。你能举个简单的例子吗?
      • 它只是一个指向文件的指针。 $fd = fopen('dump.txt', 'a')。只是 fd 的一个花哨的术语 :)
      • @JohnP - 不,添加文件描述符没有做任何事情。但是解决了其他问题,所以问题解决了!!!见上文编辑 :)
      【解决方案6】:

      您可能需要更改实施方法。必须等待这么长时间对您的应用用户来说是一种烦恼,对整个应用来说都是致命的。

      对于此类任务,通常最好将任务排队,最好是在数据库中,并定期处理它们。基于 Linux 的系统上有 chron 作业。在 Windows 中,您可以使用调度程序来启动 backgroundProcess.php。

      【讨论】:

      • 这不是可以排队的东西。这是一个到远程服务器的 ssh 连接并处理一些事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      相关资源
      最近更新 更多