[英]shell_exec problems in PHP
我有一些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启动它时,它会永远等待第一次输入。 我不知道该怎么避免这个!
如果PHP脚本正在生成输入 ,请使用popen() 。 这样,您可以避免使用命名管道。
如果输入来自其他来源 ,最好不要直接从FIFO中读取PHP脚本(或它执行的Ruby脚本)。 我知道这是因为尝试编写一个Web界面,用于实时显示多年前捕获的网络数据包,并遇到类似的问题。
我会写一个接受Unix套接字连接的简单服务器程序。 此服务器可以接受来自FIFO或其他套接字连接的输入,然后将其发送到PHP或Ruby脚本的所有正在运行的实例。 虽然Node.js (适用于JavaScript), Twisted (适用于Python)和EventMachine (适用于Ruby)是为此类设计的,但您可以仅使用核心 功能在CLI的CLI版本中编写此类服务器。
您可以尝试在shell调用中使用nohup
命令。 这应该导致程序立即返回,因此PHP没有等待。 您的案例中的代码如下所示:
shell_exec("nohup ./fifo_test.r < input.fifo > buffer &");
希望有所帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.