【问题标题】:Executing command in background by shell_exec()通过 shell_exec() 在后台执行命令
【发布时间】:2018-10-29 09:54:25
【问题描述】:

在 Linux 上,我可以使用shell_exec() 如下在后台中运行命令:

shell_exec("/usr/bin/nohup curl -o /dev/null --data \"$data\" $url >/dev/null 2>&1 &");

请注意,以上行不等待结果,代码将立即恢复。

如何在 Windows 上实现它?最好是 Windows 内置的东西。

【问题讨论】:

  • 如果您只删除 /usr/bin/nohup 部分,您可以在 Windows 上执行相同操作。这在 Windows 上不是必需的,因为当父进程被杀死时进程不会退出。
  • @Xatenev 在我的编辑中我注意到我不想等待结果

标签: php windows shell-exec


【解决方案1】:

我会为这个用例检查 Symfony Process 组件。它提供了同步和异步执行的方法。它可以通过 Composer 轻松安装,但至少需要 PHP 7.1。
文档可以在这里找到:https://symfony.com/doc/current/components/process.html

您的用例示例如下所示:

$process = new Process(['curl', '--data', $data, $url]);
$process->start();

请注意,我省略了-o 选项,因为除非您明确请求,否则子进程的输出不会显示。 快速浏览后发现一些帖子说 start() 方法在 Windows 上会阻塞,但似乎已经实现并合并了一个补丁:https://github.com/symfony/symfony/pull/10420

编辑:如果您不想使用库,可以使用popen()pclose() 和 Windows 工具 start 的组合:

pclose(popen('start /B curl --data "'.$data.'" '.$url, 'r'));

这会在后台运行程序而不打开窗口并立即返回。

编辑 2:start /B 的技巧来源:http://php.net/manual/en/function.exec.php#86329

【讨论】:

  • 我更喜欢内置的东西和 PHP 5.6 版
  • 请看我的编辑。关于您的 PHP 版本(有点题外话):PHP 5.6 将在今年年底 EOL,并且不会再收到任何安全更新。所以你应该考虑尽快更新。但我编辑的解决方案也适用于 5.6 :)
  • popen 需要第二个参数 mode。我认为值'r''w' 在这种情况下有效。并感谢您的提醒。我会考虑的。
  • 哦,是的,当然。我从我的测试文件复制时犯了错误,对不起。我猜'r' 可能会更好地从过程中得到错误或其他东西以防万一,但两者都应该像你说的那样工作。
猜你喜欢
  • 1970-01-01
  • 2017-07-15
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 2018-05-26
相关资源
最近更新 更多