1

リモートソケットからデータを受信するためのミニ「デーモン」として機能するPHPスクリプトを作成しようとしています。リモートサーバーはAsteriskVoIPサーバーであり、AMIイベント通知を受信するためにAsterisk Management Interface(AMI)に接続します。接続は、これまでの使用に十分安定している常時接続のSSHトンネル(autosshを使用)を介して行われます。

これが計画です...

  • SSHトンネルのローカルポートに接続するPHPスクリプト。これは、他端のリモートポートに転送しますfsockopen()pfsockopen()
  • PHPスクリプトはCLIから実行されます。何らかの理由で、PHPスクリプトが停止していないことを確認するために、cronジョブに何らかのシェルスクリプトが必要だと思います。
  • このPHPスクリプトを永続的に実行し、ソケットに永続的に接続して、データが相手側から公開されるたびにデータを受信する必要があります。
  • イントラネットサーバーには十分なリソースがあるため(犯罪的に十分に使用されていないため)、メモリとCPUは問題になりませんが、同様に、このスクリプトが制御不能になることは望ましくありません。
  • PHPスクリプトは、ソケットの反対側に時折表示されるデータに反応し、MySQLデータベースにデータを挿入または更新する場合があります。もちろん、MySQL接続をハングさせたままにするのではなく、必要に応じて開閉します。

まず第一に、これは決してうまくいかないひどい考えですか?

PHPは、このような小さなデーモンにはおそらく最適な言語ではないことを認識していますが、以前はCLIでPHPを使用して成功したことがあり、最近では最も快適な言語です。

ソケットのもう一方の端でデータが公開されたときに動作を開始できるPHP関数はありますか?
またはfread()、このようにループするだけでしょうか...

while (!feof($socket)) {
$output .= fread($socket, 8192);
}

ループオプションは少し混乱しているように見えるので、スクリプトがソケットに接続されたままで、基本的にデータが表示されるまでアイドル状態になる別の方法があるかどうか疑問に思っています。

永続的に実行されているPHPスクリプトをソケットに接続することを検討する場合、どのような短所/落とし穴に注意する必要がありますか?

乾杯、B

4

2 に答える 2

1
  • PHP デーモンを作成するときは、メモリ消費に注意する必要があります。慎重に unset()/free()d しないと、デーモンは時間の経過とともにますます多くのメモリを消費する可能性があります。

  • すでに述べたように、PHP はこれに最適な言語ではありませんが、確実に機能します。私はすでにその「ハック」を数回行いました。

  • TCP ソケットの fread() はノンブロッキングになることに注意してください。各行は CR/LF で終了し (\r\n)、2 つの CR/LF が AMI イベント/コマンドの終わりを示すため、「\r\n\r\n」が発生するまで読み込んでから、これを処理することをお勧めします。し、再び読み取りを開始します。ソケット ブロッキングを設定し、fread() の代わりに fgets() を使用します。そうすれば、文字列の魔法や分割を行う必要なく、AMI イベントの終了を検出するのがはるかに簡単になります。

于 2011-10-28T12:15:38.650 に答える
1

非同期メッセージ ライブラリである ZeroMQ をご覧ください。 http://en.wikipedia.org/wiki/ZeroMQ

PHPバインディングへのリンクは次のとおりです。

http://www.zeromq.org/bindings:php

于 2011-10-28T12:19:39.573 に答える