2016-11-03 13 views
1

PHPサーバからノードサーバにデータを送る必要があります。成功した私のノードサーバおよび出力するにメッセージを送信再度書き込む前にsocket_writeが完了するのを待つ

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
$result = socket_connect($socket, '127.0.0.1', '3000'); 
socket_write($socket, "Hello World", 11); 
socket_close($socket); 

このコードを実行:

は、ここで私はこれまでPHP側で持っているものの簡易版です。

しかし、私はソケットに複数のメッセージを送り返す必要があります。私は実際に数千の回答を送る必要があります。私はそうのようなループ内socket_write()関数を呼び出すした場合でも:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
$result = socket_connect($socket, '127.0.0.1', '3000'); 
for($i=0;$i<1000;$i++){ 
    socket_write($socket, "Hello World", 11); 
} 
socket_close($socket); 

一緒にすべてのデータを追加し、スクリプトの終了時に一度にそれを送信するようです。私はリアルタイムでデータを送り返す必要があります。 PHPでこれを行う方法はありますか?

+0

あなたのソケットは成功した回答を送信しますか?リソースが利用可能であることを確認する方法送信し、正常にメッセージを取り、再度送信します。なぜソケットを使用して答えが必要ないのですか?静的ファイルとして扱います。 – dsgdfg

+0

@dsgdfgノードサーバーがデータを受信したという確認を受け取る必要はありません。ソケットへの接続が失敗した場合、私は例外をスローする –

+0

@dsgdfg Nodeサーバに成功応答を返さなければならないと思いますか?多分、PHPにループの次の繰り返しに行くのが嬉しいという私の唯一の方法でしょう。 –

答えて

1

多くのPHPソケットライブラリを調べたところ、ほぼすべてがソケットを送信した後にusleep(1000000)を実装したことに気付きました。これが最善の方法であるかどうかは分かりませんが、PHPの制限により唯一の方法かもしれません。

最後に、データが最後に書き込まれた時刻をソケットに保存することにしました。その後、経過した時間を計算し、1000000マイクロ秒からそれを減算します。この方法では、スクリプトは必要以上に長く待機しません。

public function send(array $payload){ 
    $json = json_encode($payload); 
    $write = socket_write($this->socket, $json, strlen($json); 
    $sleep_time = 1000000 - (microtime(true) - $this->last_sent); 
    if($sleep_time > 0) usleep($sleep_time); 
    $this->last_sent = microtime(true); 
    return $write !== false ? true : false; 
} 
+0

'socket_write'が複数のJSONオブジェクトを一緒に追加したように見える問題にも遭遇しています。なぜこれが起こったのか正確に把握しましたか? 'usleep(1000000)'を実装していますが、すべてうまく動作します。 –

+0

@ Stephan-v私の漠然とした推測では、ソケットが送信されたときに、まだ送信されている場合、それらは一緒に混乱することに終わります。私は実際に上記のソリューションを使用する小さなクラスを書いた:https://github.com/danjohnson95/PHP-Socket-Emitter –

+0

良いもの、ありがとう。それは私のプロジェクトで私を助けてくれるでしょう。私はまだこれを正確に引き起こす原因を知りたいです:) –

関連する問題