异步过程似乎不适用于我的prod环境

时间:2017-03-09 14:14:20

标签: php symfony asynchronous process command

我目前正在开发一个相当复杂的PHP5 / Symfony 2.8项目。在这个项目中,我有一个命令,可以通过Crontab调用,在控制台中手动调用,或者使用网站上的按钮,用于调用外部站点上的Web服务,这给我一个xml文件,我管理使用SimpleXML导入我的数据库。

该命令就像我的本地开发环境中的魅力一样,无论它如何调用。

但由于未知原因(这就是我在这里发布的原因),在我的int或prod环境中,它们位于外部服务器上,从站点上的按钮调用命令不起作用。

我的按钮正在触发此操作:

$process = new Process('php '.$kernelRootDir.'/console my:super:command');
$process->start(); 

由于命令有点沉重,我无法等待命令完成,这就是为什么我使用process->启动而不是运行。我不需要它的日志,所以它很好,它只是启动命令并让它运行,而用户可以在另一页上。

同样,这在我的本地环境(debian 7 VM)上运行良好,但在远程服务器上却不行(不确定它在使用什么)。但是,如果我通过控制台手动启动命令或让crontab调用它,它会完美运行直到结束。这只是通过我的控制器通过不起作用的进程触发它。

这是从昨天起我的头发脱了我的头,但我无法弄清楚为什么命令甚至没有开始在prod环境..任何提示?

更新:尝试使我的命令只转储一个小的“it ​​working”消息,并使用wait()和getOutput()方法在我的控制器中获取结果。在我的本地环境中,我立即从控制器使用dump / die组合得到了我的消息。在远程服务器上,我的命令触发ProcessTimedOutException:进程超过60秒超时。

因此,Process无法启动自定义命令确实存在问题,尽管该命令在控制台上手动调用时仍然有效。

1 个答案:

答案 0 :(得分:0)

好的,经过两天的挣扎,我发现远程服务器可能对此负责,似乎如果我不等待进程回答,那么该进程会立即被终止。我不知道为什么,我不知道怎么做,但似乎是这样。

所以我开始寻找一种不使用Process的替代解决方案。我找到了一些东西。我可以使用php exec()方法启动异步调用:

exec('php '.$kernelRootDir.'/console my:super:command > /dev/null &');
//Apparently, using "&" launch the command asynchronously. 

到目前为止,我的所有测试都在我的生产服务器上运行,所以我会保留它。