PHP-Symfony-进程在执行后立即终止

时间:2020-04-15 13:54:23

标签: php laravel symfony

我使用的应用程序正在代理服务器和客户端之间的VNC连接。
因此,我想通过PHP中Symfony的Process组件运行此应用程序。
此项目中使用Laravel Framework,并尝试通过请求页面(路由)来运行应用程序。

问题是应用程序需要在后台连续运行。下面是从CMD.exe运行的进程的输出;

websockify run from CMD.exe

作为代码,我尝试了以下组合;

    $process = new Process(['websockify.exe', '7777', '127.0.0.1:5901']);
    $process->start();
    $process->waitUntil(function ($type, $output) {
        echo $output;
        return strpos($output, 'proxying from');
    });

输出: output

但是在获得此输出之后,进程终止了。我只希望它在后台连续运行。

我也尝试使用$process->run();,但是请求的页面一直等待应用程序终止,直到超时。 (进程成功运行,但无法完成页面请求)

我尝试使用exec函数(带有/不带有> /dev/null 2>&1 &);

exec('websockify.exe 7777 127.0.0.1:5901 > /dev/null 2>&1 &');

但仍与Process组件相同。它会立即终止该过程。
还尝试了以下代码,但是没有运气。

    $process = new Process(['websockify.exe', '7777', '127.0.0.1:5901', '&']);
    $process->disableOutput();
    $process->setTimeout(1800);
    $process->start();

作为总结,我想运行一个进程,该进程应在​​PHP中始终在后台运行。

环境:Windows 10和WAMP Server
PHP版本: 7.4.0
Laravel版本:v7.6.1
Symfony Process版本: v5.0.7

我使用的应用程序的GitHub链接:websockify

1 个答案:

答案 0 :(得分:0)

我已经解决了问题。它在不同的线程中运行应用程序。

$process = Process::fromShellCommandline('wmic process call create "<FilePath>websockify.exe 7777 127.0.0.1:5901"');
$process->start();

现在的输出是:

output

我可以使用“ ProcessId”来处理诸如停止,检查其是否正在运行等过程。

唯一的问题是我无法从实际应用程序获得输出。如果找到解决方案,我将更新答案。

PS:此解决方案适用于Windows。