<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// この部分は、記事の内容とは何の関係もありません,たとえば、のみ</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"この記事を読んでください!"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
会うsocket_export_streamデータを読み取れない場合はどうすればよいですか?詳細な調査方法を共有します
存在するPHPで使用されますsocketプログラミング時,socket_export_stream関数はしばしば使用されますsocketへのリソース変換streamリソース,便利なためstream関連関数は、データの読み取りおよび書き込み操作を実行します。しかし,有时候我们会会う调用socket_export_stream後でデータを読むことができないという問題,プログラムがスタックまたはデータ処理の異常を引き起こします。この記事では、詳細な調査のアイデアとソリューションを共有します,開発者がこの問題をすぐに見つけて解決するのを支援します。
1つ、確認するsocket接続は正常ですか?
存在する调用socket_export_stream前に,まず、確認してくださいsocket接続は正常に確立されました。渡すことができますsocket_connectそしてsocket_accept関数の返品値が判断されます。接続が正常に確立されていない場合,変換されたstream当然、データを読み取ることができません。
サンプルチェックコード:
```php
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$address</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Socket接続に失敗しました,エラーコード:"</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span></span>
2。ソケットがブロッキングモードであるかどうかを確認します
ソケットはブロッキングモードです。データがない場合、データが到着するまで読み取り操作がブロックされます。ソケットを非ブロッキングモードに設定して、ジャミングを避けることができるかどうかを確認できます。
非ブロッキング例の設定例:
<span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>
非ブロッキングに設定されている場合、読み取り後に偽データまたは空のデータが返された場合、実際にデータがないことを意味し、プログラムロジックをそれに応じて処理する必要があります。
3.ストリームが正常にエクスポートされるかどうかを確認します
socket_export_streamはストリームリソースを返しますが、着信ソケットが無効または閉じている場合、ストリームが無効になる場合があります。返された結果タイプを確認することが重要です。
<span><span><span class="hljs-variable">$stream</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_export_stream</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">is_resource</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"streamエクスポートは失敗しました,お会計お願いしますsocketリソース"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span></span>
4。ストリーム_set_blockingを使用して、ストリームのブロッキングモードを調整します
エクスポート後、ストリームはデフォルトでブロックされ、要件に従って調整できます。
<span><span><span class="hljs-title function_ invoke__">stream_set_blocking</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>);
</span></span>
非ブロッキングモードは、非同期読み取りに便利であるか、Selectなどの関数で使用されます。
5.Stream_Selectを使用して、読みやすいデータの状態を監視する
Stream_Selectを使用して、直接読み取り中にブロックを避けるために、ストリームの読み取り可能な状態を監視することをお勧めします。
<span><span><span class="hljs-variable">$read</span></span><span> = [</span><span><span class="hljs-variable">$stream</span></span><span>];
</span><span><span class="hljs-variable">$write</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-variable">$except</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-variable">$tv_sec</span></span><span> = </span><span><span class="hljs-number">5</span></span><span>; </span><span><span class="hljs-comment">// 待って52番</span></span><span>
</span><span><span class="hljs-variable">$num_changed_streams</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_select</span></span><span>(</span><span><span class="hljs-variable">$read</span></span><span>, </span><span><span class="hljs-variable">$write</span></span><span>, </span><span><span class="hljs-variable">$except</span></span><span>, </span><span><span class="hljs-variable">$tv_sec</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$num_changed_streams</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"stream_selectエラーが発生しました"</span></span><span>;
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-variable">$num_changed_streams</span></span><span> > </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"データを読む:"</span></span><span> . </span><span><span class="hljs-variable">$data</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"待って超时,データは届きません"</span></span><span>;
}
</span></span>
6.データ送信端が正常に送信されているかどうかを確認します
データを読み取れないという問題は、ピアがデータを送信しないか、接続が切断されていることです。 TCPDUMP、Wireshark、その他のツールを使用して、パケットをキャプチャして、データフローが正常かどうかを確認できます。
7. PHP環境とバージョンを確認します
一部のPHPバージョンには、socket_export_streamの実装にバグがある場合があります。最新の安定したバージョンにアップグレードするか、公式のPHPバグレポートと修理記録を表示することをお勧めします。
要約します
socket_export_streamがデータを読み取れない場合、問題は次のとおりです。
ソケット接続のステータスが正常であることを確認してください
ソケットとストリームブロッキングモードを調整します
ストリームが正常にエクスポートされるかどうかを確認してください
Stream_Selectを使用して、読みやすいデータをリッスンします
ピアが正常にデータを送信するかどうかを確認します
PHP環境バージョンが安定していることを確認してください
上記の手順を通じて、基本的にSocket_Export_Streamのために読めないほとんどの問題を見つけて解決し、プログラムの安定性と堅牢性を向上させることができます。
この記事があなたを助けることを願っています!
<span></span>