現在の位置: ホーム> 最新記事一覧> socket_export_streamがデータを読み取れないという問題に遭遇した場合はどうすればよいですか?詳細な調査方法を共有します

socket_export_streamがデータを読み取れないという問題に遭遇した場合はどうすればよいですか?詳細な調査方法を共有します

gitbox 2025-08-04
<span><span><span class="hljs-meta">&lt;?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">?&gt;</span></span><span>

&lt;hr&gt;

会う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> &gt; </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がデータを読み取れない場合、問題は次のとおりです。

  1. ソケット接続のステータスが正常であることを確認してください

  2. ソケットとストリームブロッキングモードを調整します

  3. ストリームが正常にエクスポートされるかどうかを確認してください

  4. Stream_Selectを使用して、読みやすいデータをリッスンします

  5. ピアが正常にデータを送信するかどうかを確認します

  6. PHP環境バージョンが安定していることを確認してください

上記の手順を通じて、基本的にSocket_Export_Streamのために読めないほとんどの問題を見つけて解決し、プログラムの安定性と堅牢性を向上させることができます。

この記事があなたを助けることを願っています!

 <span></span>