PHPネットワークプログラミングでは、パフォーマンスの改善とリソース消費の削減には、永続的な接続が重要です。長い接続を実装する一般的な方法は、TCPのSO_KEEPALIVEオプションを設定することです。これにより、オペレーティングシステムが定期的に「ライブ」パケットを送信して、接続がまだ有効かどうかを検出します。この記事では、PHPのsocket_set_option関数を組み合わせて、 So_keepaliveを使用して長い接続保持を実現する方法を詳細に説明します。
So_Keepaliveは、TCPプロトコルのソケットオプションです。このオプションをオンにした後、オペレーティングシステムは、接続がアイドル状態であることを検出した場合、特定の期間、ピーアーブプローブを一定の期間ピアに自動的に送信し、接続がまだ生きているかどうかを確認します。相手が応答しない場合、接続は切断されると見なされます。
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の原則と使用方法を習得することは、長い接続を実現するための基本的なツールです。