PHPネットワークプログラミングでは、接続にsocket_addrinfo_connect関数を使用し、 FWRITEを使用してデータを書き込むことは、一般的なネットワーク通信方法の1つです。データ送信のパフォーマンスを改善するために、バッファーテクノロジーを合理的に利用することが特に重要です。この記事では、 socket_addrinfo_connect function with fwriteでバッファーを使用する方法を詳細に説明し、関連するベストプラクティスを要約します。
socket_addrinfo_connectは、アドレス情報に基づいてソケット接続を実行する関数であり、TCP接続に使用されることがよくあります。接続が成功した後、通常、 FWRITEを介してソケットストリームにデータを書き込みます。
FWRITE自体には、バッファリングメカニズムがあります。書くときは、最初にPHP出力バッファーに書き込みます。バッファがいっぱいまたはリフレッシュされている場合にのみ、データは基礎となるソケットに送信されます。
fwriteを直接呼び出して多数の小さなデータを書き込むと、多数の小さなパケットが生成され、「パケット断片化」が生成され、伝送効率に影響し、レイテンシとCPU負荷が増加します。
バッファーを使用できます:
FWRITEと呼ぶ回数を減らします
複数の下層を1つの上writeにマージします
システムコールオーバーヘッドを削減します
TCPトラフィックの使用率を改善します
<?php
$addrinfo = socket_addrinfo_lookup('m66.net', '80', AF_UNSPEC, SOCK_STREAM);
$socket = socket_addrinfo_connect($addrinfo);
if ($socket === false) {
die("接続に失敗しました");
}
?>
最初にすべてのデータをメモリバッファー(文字列またはその他のキャッシュメカニズム)に書き込み、次にFWRITEで一度に送信することをお勧めします。
<?php
$buffer = '';
// 複数のデータステッチをシミュレートします
$dataPieces = ['Hello, ', 'this is ', 'a buffered ', 'write example.'];
foreach ($dataPieces as $piece) {
$buffer .= $piece;
}
// 一度書いてくださいsocket
fwrite($socket, $buffer);
?>
データが非常に大きい場合は、過度のメモリの使用量が増加するのを防ぐために、書き込みをブロックするために固定バッファサイズを設定することをお勧めします。
<?php
$bufferSize = 8192; // 8KBバッファ
$offset = 0;
$length = strlen($buffer);
while ($offset < $length) {
$chunk = substr($buffer, $offset, $bufferSize);
$written = fwrite($socket, $chunk);
if ($written === false) {
die("書き込みが失敗しました");
}
$offset += $written;
}
?>
書き込みデータをマージ:複数の下の下の書き込みを1つの上部書き込みにマージして、システムコールを削減してみてください。
適切なバッファサイズを使用します。ネットワーク環境とサーバーのパフォーマンスに従ってバッファサイズを調整して、メモリ圧力を回避します。
時間内にバッファをフラッシュする:書き込み後、 fflush()に電話してバッファを更新して、データが時間内に送信されるようにすることができます。
エラー処理: FWRITEの返品値を確認して、書き込み障害と部分的な書き込みを処理します。
ノンブロッキング書き込みとselect :高性能の需要シナリオでは、非ブロッキングソケットとstream_selectを使用して、ブロッキングを避け、効率を待ち、改善します。
永続的な接続の使用:頻繁な接続切断を避け、接続確立のオーバーヘッドを減らします。
ネットワークレイヤーの最適化:TCP_NODELAYをオンにするか、TCPバッファーサイズを調整します(PHP環境と基礎となるソケットサポートに応じて)。