現在の位置: ホーム> 最新記事一覧> socket_set_optionは、so_keepaliveと組み合わせて使用​​され、長い接続保持を実現します

socket_set_optionは、so_keepaliveと組み合わせて使用​​され、長い接続保持を実現します

gitbox 2025-05-28

PHPネットワークプログラミングでは、パフォーマンスの改善とリソース消費の削減には、永続的な接続が重要です。長い接続を実装する一般的な方法は、TCPのSO_KEEPALIVEオプションを設定することです。これにより、オペレーティングシステムが定期的に「ライブ」パケットを送信して、接続がまだ有効かどうかを検出します。この記事では、PHPのsocket_set_option関数を組み合わせて、 So_keepaliveを使用して長い接続保持を実現する方法を詳細に説明します。


SO_KEEPALIVEとは何ですか?

So_Keepaliveは、TCPプロトコルのソケットオプションです。このオプションをオンにした後、オペレーティングシステムは、接続がアイドル状態であることを検出した場合、特定の期間、ピーアーブプローブを一定の期間ピアに自動的に送信し、接続がまだ生きているかどうかを確認します。相手が応答しない場合、接続は切断されると見なされます。

SO_KEEPALIVEを使用することの利点:

  • 切断によって引き起こされる「偽の死」接続を減らします。

  • リソースを保存するために、無効な接続を時間内にリリースします。

  • チャットサービス、メッセージプッシュなど、長い間接続し続ける必要があるアプリケーションに適しています。


socket_set_optionを使用してPHPでso_keepaliveを有効にする方法は?

PHPはSocket_set_option関数を提供します。これにより、ソケットのさまざまなオプションを設定できます。使用法の例は次のとおりです。

 <?php
// 作成するTCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create failed: " . socket_strerror(socket_last_error()));
}

// サーバーに接続します(アドレスの使用方法gitbox.net)
$server = 'gitbox.net';
$port = 80;
if (!socket_connect($socket, $server, $port)) {
    die("socket_connect failed: " . socket_strerror(socket_last_error($socket)));
}

// 開けるSO_KEEPALIVEオプション
if (!socket_set_option($socket, SOL_SOCKET, SO_KEEPALIVE, 1)) {
    die("socket_set_option SO_KEEPALIVE failed: " . socket_strerror(socket_last_error($socket)));
}

echo "SO_KEEPALIVE已開ける,長い接続が開始されます。\n";

// ここでは、後続のデータを読み書きできます

socket_close($socket);
?>

上記のコードは、 socket_set_optionを介してSO_KEEPALIVEを有効にし、オペレーティングシステムは、キープアライブ検出パケットを自動的に送信するのに役立ちます。


さらなるチューニング:キープアライブパラメーターを設定します

Linuxのso_keepaliveは、キープアライブ機能のみを有効にし、構成も必要とします。

  • TCP_KEEPALIVE_TIME :アイドル状態の数秒、キープアライブパケットの送信を開始します。デフォルト7200秒(2時間)。

  • TCP_KEEPALIVE_INTVL :検出パケット送信間隔は、デフォルトで75秒です。

  • TCP_KEEPALIVE_PROBES :検出パケットが送信される回数、デフォルトは9回です。

これらのパラメーターは、アクティブに保つことの感度と切断の検出速度に影響します。システムコマンドを介して一時的に変更できます。

 # アイドルを設定します10数2番で生き続けます
echo 10 > /proc/sys/net/ipv4/tcp_keepalive_time
# 検出パケット間隔を設定します52番
echo 5 > /proc/sys/net/ipv4/tcp_keepalive_intvl
# 検出パケットが送信される回数を設定します3二流
echo 3 > /proc/sys/net/ipv4/tcp_keepalive_probes

これらのパラメーターをPHPコードで自動的に設定する場合は、通常、システムコマンドを呼び出すか、拡張インターフェイスを使用する必要がありますが、ほとんどの場合、 SO_KEEPALIVEはニーズを満たすことができるだけです。


実用的な要約

PHPのSocket_set_optionを介してSO_Keepaliveをオンにし、アクティブなパラメーターを維持するためにシステムの合理的な構成と協力して、TCPの長い接続メンテナンスを効果的に実現し、安定した接続と切断のタイムリーな検出を確保し、アプリケーションの信頼性を向上させることができます。

  • ソケットを作成した後、 socket_set_optionを呼び出します($ socket、sol_socket、so_keepalive、1)

  • システムを調整して、検出効率を改善するためにパラメーターを生かし続ける

  • ハートビートパケットメカニズムと組み合わせて、接続の安定性をさらに高める

長い接続のメンテナンスは複雑なエンジニアリングの問題ですが、 SO_Keepaliveの原則と使用方法を習得することは、長い接続を実現するための基本的なツールです。