如何在 Windows 中通过 PHP 运行后台进程?

发布时间:2021-02-25 08:35

我尝试在 Windows 上使用 exec() 以这种方式从 PHP 运行 Python 脚本作为后台进程:

<?PHP
    $python    = 'C:\\Users\\User\\anaconda3\\python.exe';
    $py_script = 'C:\\wamp\\www\\lab\\ex\\simple_test.py';
    $py_stdout    = '> temp\\'.session_id()."_std.txt";
    $py_stderror  = '2> temp\\'.session_id()."_stde.txt";

    exec("$py_bg $python $py_script $py_stdout $py_stderror &");

脚本调用并正常工作,但 PHP 仍在等待脚本。 我删除了结尾 &,因为我发现它只能在 Linux 上运行,并且在搜索其他问答后找到了这个选项:

    exec("start /B $py_bg $python $py_script $py_stdout $py_stderror");

但同样的结果。我该如何解决这个问题?

=== 更新:

我以错误的方式使用了 start /B ,我将代码更改为:

<?PHP
    $python    = 'C:\\Users\\User\\anaconda3\\python.exe';
    $py_script = 'C:\\wamp\\www\\lab\\ex\\simple_test.py';
    $py_stdout    = '> temp\\'.session_id()."_std.txt";
    $py_stderror  = '2> temp\\'.session_id()."_stde.txt";
    $py_cmd = "$python $py_script $py_arg_1 $py_std $py_stde";

    pclose(popen("start /B ". $py_cmd, "a"));

但现在 PHP 中的 popen() 警告:

<块引用>

警告:popen(start /B ...,a): C:\wamp\www\lab\start.php 第 50 行没有错误

和另一个pclose()

<块引用>

警告:pclose() 期望参数 1 是资源,布尔值在 ...

回答1

我检查了 PHP: popen - Manual 并看到 a 不是有效模式,但我在这里的几个答案中看到了这一点!

然而:

<块引用>

模式。 'r' 表示读取,或 'w' 表示写入。

通过将模式更改为 r,脚本在后台正确调用和运行,并且在 PHP 或 Py 上没有错误或警告。

<?PHP
    $python    = 'C:\\Users\\User\\anaconda3\\python.exe';
    $py_script = 'C:\\wamp\\www\\lab\\ex\\simple_test.py';
    $py_stdout    = '> temp\\'.session_id()."_std.txt";
    $py_stderror  = '2> temp\\'.session_id()."_stde.txt";
    $py_cmd = "$python $py_script $py_arg_1 $py_std $py_stde";

    pclose(popen("start /B ". $py_cmd, "r"));