2012-03-05 20 views
0

我有一个PHP passthru()阻塞时,它应该启动守护进程的问题。PHP passthru()块与进程更换

我有一个Node.js守护进程和一个bash脚本包装器。该bash脚本使用了一些进程替换,因为Node.js服务器不能直接登录到syslog。在bash脚本包含这样的命令:

forever -l app.log app.js 

但是,因为我希望它记录到系统日志,我使用:

forever -l >(logger) app.js 

logger处理替换创建的文件描述符像/dev/fd/63传递其路径以forever命令作为要使用的日志文件。

当我直接使用bash脚本启动守护程序时,这种方式很好用,但是当使用PHP passthru()或exec()执行bash脚本时,这些调用将会阻塞。如果我使用常规日志文件而不是进程替换,那么passthru()和exec()都可以正常工作,在后台启动守护进程。

我已经创建了一个完整的工作示例(使用一个简单的PHP后台程序代替的Node.js)在Github上的要点是:https://gist.github.com/1977896(需要PHP 5.3.6+)

为什么在过程中更换passthru()通话块?我能做些什么来解决它吗?

回答

0

passthru()会阻塞在PHP中,即使你启动了一个守护进程,这也是不幸的。我听说有些人有运气的nohup重写它:

exec('/path/to/cmd'); 

就变成了:

exec('nohup /path/to/cmd &'); 

就个人而言,我经历过最多的运气是EXEC()'荷兰国际集团一高管的wget调用另一个脚本(或相同的脚本)来实际运行阻塞exec。通过将呼叫过程提供给与活动用户无关的另一个http进程,可以避免呼叫进程被阻止。使用合适的标志,wget的将立即返回,而不是等待响应:

exec('wget --quiet --tries=1 -O - --timeout=1 --no-cache http://localhost/path/to/cmd'); 

的HTTP处理程序将最终超时这是很好的,应该离开后台程序。如果您需要输出(因此您正在进行passthru()调用),只需运行脚本将输出重定向到一个文件,然后轮询该文件以查看实时进程中的更改。