PHP中的shell_exec问题

时间:2013-01-03 00:41:50

标签: php linux

我有一些PHP代码,我需要在服务器后台启动ruby脚本。但脚本不想工作。现在所有的脚本都是输入并回显它。

我这样调用它:

shell_exec("./fifo_test.r < input.fifo > buffer &");

这会导致PHP无限期挂起。但是当我直接运行它时它工作正常。

root@ip-xxxxx:/var/www/test# su www-data
$ sh -c ./fifo_test.r < input.fifo > buffer &
$ echo test > input.fifo
$ cat buffer
Got: test

以下是流程信息:

ubuntu@ip-xxxxx:~$ ps -ef | grep fifo
www-data  1076     1  0 00:39 ?        00:00:00 sh -c ./fifo_test.r < input.fifo > buffer &

有什么想法?谢谢!

编辑:我可以通过手动添加到input.fifo来解冻PHP。然后它工作正常。但是,当PHP启动它时,它会永远等待第一次输入。我不确定如何避免这种情况!

2 个答案:

答案 0 :(得分:1)

如果PHP脚本正在生成输入,请使用popen()。这样,您可以避免使用命名管道。

如果输入来自其他来源,最好不要直接从FIFO中读取PHP脚本(或它执行的Ruby脚本)。我知道这是因为尝试编写一个Web界面,用于实时显示多年前捕获的网络数据包并遇到类似的问题。

我会写一个接受Unix套接字连接的简单服务器程序。此服务器可以接受来自FIFO或其他套接字连接的输入,然后将其发送到PHP或Ruby脚本的所有正在运行的实例。您可以使用only core features在CLI的CLI版本中编写此类服务器,尽管Node.js(对于JavaScript),Twisted(对于Python),和EventMachine(对于Ruby)是为这类事物而设计的。

答案 1 :(得分:1)

您可以尝试在shell调用中使用nohup命令。这应该导致程序立即返回,因此PHP没有等待。您案例中的代码如下所示:

shell_exec("nohup ./fifo_test.r < input.fifo > buffer &");

希望有所帮助!