繁体   English   中英

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

[英]Asynchronous Process doesn't seem to work on my prod environment

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

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

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM