我在项目中需要运行一个websocket服务(nodejs的代码),为了防止服务器重启之后此服务未启动,所以在中间件中对此服务进行了监控,如果服务未开启,则通过bat文件开启此服务。但现在遇到一个问题,就是exec()执行bat文件时会一直在执行,导致页面连接超时~
中间件代码:
public function handle($request, Closure $next)
{
//功能:监控laravel-echo-server 是否运行,如果没运行就运行laravel-echo.bat脚本
$cmd = 'tasklist|find /c "node.exe"';
$ret = exec("$cmd");
if($ret == 0){
$path = base_path().'\laravel-echo.bat';
exec($path,$out,$stu);
var_dump(1);
}
return $next($request);
}
laravel-echo.bat 代码:
cd ..
start /b laravel-echo-server start >websocket_log.txt
现象:每当走到中间件时,通过资源管理器可以看到服务已经被拉起来了,但是var_dump(1)一直没有执行,所以这个要怎么解决呢?有没有大佬指点一下~
PS: 官方手册上exec()函数有解释,"程序使用此函数启动,为了能保持在后台运行,此程序必须将输出重定向到文件或其它输出流。否则会导致 PHP 挂起,直至程序执行结束。"但是我在bat中已经重定向到一个日志文件了啊。
改成这样试试,注意后面的 &