0

我有一些 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 启动它时,它会永远等待第一个输入。我不知道如何避免这种情况!

4

2 回答 2

1

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

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

希望有帮助!

于 2013-01-03T02:46:40.720 回答
1

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

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

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

于 2013-01-03T02:12:05.380 回答