非ブロッキング方式で大量のデータ (~250K) をストリームに書き込もうとしています。
複雑さとオブジェクト構造を抽象化して、これが私が実行しているものです。
$fp = fsockopen('host', 80);
socket_set_blocking( $fp, false );
fwrite( $fp, $string, $length ); // Where $string is a 250K string
ただし、データがすべて書き込まれるわけではありません。これは PHP の書き込みバッファが機能していると仮定して、設定stream_set_write_buffer( $fp, 0 )
しましたが、それでも問題は解決しませんでした。
fwrite を 4096B のチャンクに分割しました。クライアントが 3 つの完全なバッチ (4096 バイト) と 4 つ目のバッチの ~1500B を送信したようです。fwrite を連続して呼び出すと、書き込まれた 0 バイトが返されます。
このデータをすべて非ブロッキング方式で送信するためにキューに入れる方法を知っている人はいますか? 削除するsocket_set_blocking( $fp, false );
と、すべて正常に動作します。明らかに、非同期で実行する際の問題です。
あなたの考えは何ですか?ソケット拡張機能はここでまったく役に立ちますか? バッファの扱いは異なりますか?
注: さまざまな理由で curl を使用しないように、意図的にこのソケット トランスポート レイヤーを作成しています。使用curl_multi()
はオプションではありません。