PHPの開発では、長い接続を処理する際のパフォーマンスと応答速度が重要な考慮事項です。 PHPデフォルトソケット操作はブロックされています。つまり、プログラムが読み取りまたは書き込み操作を呼び出すと、操作が完了するまで待機し、長い接続を処理するときにパフォーマンスボトルネックを簡単に引き起こす可能性があります。この目的のために、 Socket_set_block関数は、Socketのブロッキングモードを調整するために合理的に使用され、PHP Long Connectionsのパフォーマンスを効果的に最適化できます。
socket_set_blockは、ソケットブロッキングモードを設定するPHPの関数です。その目的は、ソケットのブロックを維持することです。ブロッキングモードでは、読み取りまたは書き込み操作は、データの準備ができているか、操作が完了するまで待機します。
bool socket_set_block ( resource $socket )
パラメーター$ソケット:ブロッキングモードを設定するソケットリソース。
返品値:成功した場合はtrueを返し、失敗した場合はfalseを返します。
これに対応するのは、 socket_set_nonblockです。これは、非ブロッキングモードの設定に使用されます。
ブロッキングモード:読み取りおよび書き込み操作を実行するとき、プログラムは操作が完了またはタイムアウトするまで待ちます。
非ブロッキングモード:読み取りおよび書き込み操作を実行すると、プログラムはすぐに戻り、データがない場合があります。
長い接続で、ブロッキングモードを使用すると、データを待っている間にプログラムが掛けられ、その結果、他のリクエストを時間内に処理できなくなります。非ブロッキングモードは同時性を改善する可能性がありますが、コードの複雑さを高めるには、追加の投票と州の判断が必要です。
ブロッキングモードと非ブロッキングモードを合理的に切り替えることで、PHPは長いつながりでパフォーマンスと応答性の両方を考慮することができます。具体的な戦略には次のものがあります。
接続が確立されたばかりの場合、データを待っているためにプログラムがぶら下がっていないように、非ブロッキングモードに設定されます。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "gitbox.net", 80);
socket_set_nonblock($socket);
たとえば、固定長データを読み取る準備をするときは、ブロッキングモードを使用して、データがそのまま読み取られ、ハーフパケットの問題を回避します。
socket_set_block($socket);
$data = socket_read($socket, 1024);
socket_selectを使用して、ソケットに読み取りおよび削減するデータがあるかどうかを検出します。
$read = [$socket];
$write = $except = null;
if (socket_select($read, $write, $except, 5) > 0) {
socket_set_block($socket);
$data = socket_read($socket, 1024);
// データの処理
} else {
// タイムアウト処理またはその他のロジック
}
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create failed: " . socket_strerror(socket_last_error()));
}
$result = socket_connect($socket, "gitbox.net", 80);
if ($result === false) {
die("socket_connect failed: " . socket_strerror(socket_last_error($socket)));
}
// 最初に非ブロッキングを設定します,プログラムが立ち往生しないでください
socket_set_nonblock($socket);
// リクエストを送信します
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: keep-alive\r\n\r\n";
socket_write($socket, $request, strlen($request));
// 使用 socket_select データが読みやすくなるのを待ちます
$read = [$socket];
$write = $except = null;
$timeout_sec = 5;
if (socket_select($read, $write, $except, $timeout_sec) > 0) {
// データの準備ができたら、ブロッキングモードに切り替えます,完全なデータが読み取られていることを確認してください
socket_set_block($socket);
$response = '';
while ($out = socket_read($socket, 2048)) {
$response .= $out;
if (strlen($out) < 2048) {
break;
}
}
echo $response;
} else {
echo "データのタイムアウトまたはデータがないのを待っています";
}
socket_close($socket);
?>
socket_set_blockを使用すると、Socket操作は、決定された長さのデータを読み取り、整合性を確保するのに適したブロッキングモードに入ることができます。
非ブロッキングモードとsocket_selectを合理的に一致させて、長いつながりのプログラムを不必要に待つことを避け、パフォーマンスを向上させます。
長い接続パフォーマンスを最適化するための鍵は、ブロッキングとノンブロッキングを柔軟に制御し、イベント検出メカニズムと組み合わせてリソース廃棄物を減らすことです。
上記の方法により、PHP Long Connection Processingはより効率的で安定しており、高性能および応答時間要件を備えたネットワークアプリケーションシナリオに適しています。