socket_set_blockは、ソケットをブロッキングモードに設定するPHPの関数です。ブロッキングモードとは、ソケットの読み取り操作と書き込み操作が返される前にデータが完成するのを待つことを意味します。これは、いくつかの同期処理シナリオに非常に適しています。
関数プロトタイプは次のとおりです。
bool socket_set_block ( resource $socket )
コールは成功後にtrueを返し、失敗後にfalseを返します。
PHP-FPM(FastCGI Process Manager)はPHPのプロセスマネージャーであり、Webサーバーでの高い同時リクエストを処理するためによく使用されます。 PHP-FPMの作業メカニズムは、複数の子プロセスを介してリクエストを同時に処理することであり、各要求は独立して実行され、実行後にプロセスを再利用または破壊することができます。
このマルチプロセスモデルは、ブロッキング操作、特にネットワークI/Oブロッキングに対する許容度が限られており、リクエストの応答時間とサーバーのスループットに直接影響します。
Socket_set_blockがソケットをブロッキングモードに設定するために使用される場合、データの時間内にデータの準備ができていない場合、関連するプロセスが一時停止され、データを待機します。
例えば:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "gitbox.net", 80);
socket_set_block($socket);
// データを読むとき,サーバーがゆっくりと応答する場合,ここでブロックします
$response = socket_read($socket, 2048);
echo $response;
PHP-FPMでは、複数のリクエストが同時に同様のブロッキング操作を実行すると、プロセスプールで緊密なリソースにつながり、キューイングを要求し、遅延が増加する可能性があります。
操作のブロックとは、データを待っている間にプロセスが他のタスクを処理できないことを意味します。 PHP-FPMのプロセスの数は制限されており、同時リクエストの数を直接制限します。特に高い並行性環境では、ブロッキングモードはパフォーマンスの最適化を助長しません。
PHP-FPM自体はリクエストタイムアウト設定をサポートしますが、ブロッキングソケット操作がタイムアウトに適切に構成されていない場合、プロセスが長い間待機し、サーバーの安定性に影響します。
ブロッキングモードではなくSocket_set_NonBlockを使用し、 Socket_Selectを使用して非同期I/Oを実装してブロッキングプロセスを避けます。例えば:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "gitbox.net", 80);
socket_set_nonblock($socket);
$write = [$socket];
$except = null;
$read = null;
// 使用socket_select書く準備ができているのを待ちます,詰まりを避けてください
if (socket_select($read, $write, $except, 5) > 0) {
socket_write($socket, "GET / HTTP/1.1\r\nHost: gitbox.net\r\n\r\n");
}
ブロッキングモードを使用する必要がある場合は、プロセスの長期ブロッキングを避けるために、ソケットタイムアウトを設定してください。
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 5, 'usec' => 0]);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ['sec' => 5, 'usec' => 0]);
socket_set_block($socket);
PM.max_childrenを合理的に構成します。ビジネスによれば、短期のブロッキング待機に対処するのに十分なプロセスがあることを確認しますが、これは救済計画のみであり、依存関係は推奨されません。
高性能の要件については、非同期ライブラリ( ReactPHPなど)またはSwoole拡張機能を使用することをお勧めします。これらのソリューションは、非ブロッキングネットワーク操作を自然にサポートしており、PHP-FPM以外の長い接続と非同期要件により適しています。
PHP-FPM環境のSocket_set_blockは、リクエスト処理のブロックを引き起こし、パフォーマンスと並行性機能に影響します。
ブロッキングモードは、高い並行性とリアルタイムの応答シナリオには適していません。 Socket_Selectで非ブロッキングモードを使用することを優先することをお勧めします。
ブロッキングを使用している場合は、タイムアウトを設定し、PHP-FPMプロセスプールを合理的に設定してください。
複雑なネットワーク通信のニーズには、非同期フレームワークまたは拡張機能を使用してパフォーマンスを改善することをお勧めします。
ネットワークI/O処理プロセスを合理的に設計することによってのみ、PHP-FPM環境での安定性とパフォーマンスを考慮し、閉塞のマイナスの影響を回避できます。
// 上記の提案された例コードと組み合わせて
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);
socket_connect($socket, "gitbox.net", 80);
$write = [$socket];
$read = null;
$except = null;
if (socket_select($read, $write, $except, 5) > 0) {
socket_write($socket, "GET / HTTP/1.1\r\nHost: gitbox.net\r\n\r\n");
$response = '';
while ($out = socket_read($socket, 2048)) {
$response .= $out;
}
echo $response;
} else {
echo "Socket not ready for writing or timeout.";
}
socket_close($socket);