0

サーバーのバックグラウンドで Ruby スクリプトを開始するために必要な PHP コードがいくつかあります。しかし、スクリプトは機能したくありません。現時点でスクリプトが行うことは、入力を取得してエコー バックすることだけです。

私はそれを次のように呼び出します:

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

PHP スクリプトが input を生成している場合は、popen()を使用します。そうすれば、名前付きパイプの使用を避けることができます。

入力が他のソースから来ている場合は、PHP スクリプト (またはそれが実行する Ruby スクリプト) を FIFO から直接読み取らないことをお勧めします。これは、何年も前にキャプチャしたネットワーク パケットをリアルタイムで表示するための Web インターフェイスを作成しようとして、同様の問題に遭遇したことからわかります。

代わりに、Unix ソケット接続を受け入れる単純なサーバー プログラムを作成します。このサーバーは、FIFO または別のソケット接続からの入力を受け入れ、実行中の PHP または Ruby スクリプトのすべてのインスタンスに送信できます。Node.js (JavaScript の場合)、Twisted (Python の場合)、およびEventMachine (Ruby の場合) はこの種のことのために設計されていますが、コア機能のみ を使用して PHP の CLI バージョンでそのようなサーバーを作成できます。

于 2013-01-03T02:12:05.380 に答える
1

nohupシェル呼び出しでコマンドを使用してみてください。これにより、プログラムがすぐに戻るため、PHP は待機しません。あなたの場合のコードは次のようになります。

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

それが役立つことを願っています!

于 2013-01-03T02:46:40.720 に答える