我有一些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启动它时,它会永远等待第一次输入。我不确定如何避免这种情况!
答案 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 &");
希望有所帮助!