【问题标题】:Running a PHP "exec()" in the background on Windows?在 Windows 的后台运行 PHP“exec()”?
【发布时间】:2011-10-07 19:55:51
【问题描述】:

我创建了一个脚本,它使用 psexec 调用另一个脚本,该脚本调用 psexec 来运行我的命令行程序。

对 psexec 和其他脚本进行如此多调用的原因仅仅是为了让我的 PHP 脚本不必等待进程完成再将其输出到浏览器。

有没有一种方法可以在不需要使用 psexec 的情况下做到这一点?我遇到了 psexec 的问题,所以我想将它从我的程序中完全删除。

我正在运行 Windows 2008

编辑:我更改了标题,我想这将是一个更准确的标题。我在exec() 的php.net 页面上找到了If a program is started with this function, in order for it to continue running in the background, the output of the program must be redirected to a file or another output stream. Failing to do so will cause PHP to hang until the execution of the program ends.,但不知道该怎么做。

【问题讨论】:

  • 你到底想做什么?只是好奇,因为我不确定除了使用后台脚本之外还有其他方法可以解决...

标签: php windows


【解决方案1】:

在命令行中包含重定向:

exec('program.exe > NUL')

或者您可以修改您的程序以显式关闭标准输出,在 C 中这将是

CloseHandle(GetStdHandle(STD_OUTPUT_HANDLE));

您可能需要重定向/关闭标准输出和标准错误(文档没有说明):

exec('program.exe > NUL 2> NUL')

CloseHandle(GetStdHandle(STD_OUTPUT_HANDLE));
CloseHandle(GetStdHandle(STD_ERROR_HANDLE));

【讨论】:

    【解决方案2】:
    $command = 'start /B program.exe  > NUL';
    pclose( popen( $command, 'r' ) );
    

    更多信息: http://humblecontributions.blogspot.com/2012/12/how-to-run-php-process-in-background.html

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 如果我尝试使用exec() 中的start,在PHP 脚本完成之前我是否还需要等待该过程完成?
      • @Rob 哦,对不起,我试过了,你是绝对正确的。这很奇怪。我真的以为它是独立开始的。
      • 如果你在 windows 上使用 popen('start command', 'r') 那么它不会等待命令完成。几天前才发现的。
      • 喜欢php.net/manual/en/function.popen.php 吗? Example #2 popen() example,这就是你说的??
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多