私はphpソケットクライアントスクリプトに取り組んでいます。スクリプトでサーバーのダウンタイムを処理できるようにしたい。
次のように接続を開始します
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
function connect()
{
global $socket;
global $ip;
global $port;
$connected = FALSE;
while( $connected === FALSE )
{
sleep(5);
$connected = socket_connect($socket, $ip, $port);
}
}
connect();
サーバーが利用可能になるまで接続を試みます。
さらに下に進むと、サーバーが応答していないことがわかり、ソケットを切断して、サーバーへの再接続を試みます。
$ret = socket_write($socket, $str, strlen($str));
if ($ret === false)
{
socket_shutdown($socket, 2);
socket_close($socket);
connect();
}
ただし、socket_connect から次のエラーが発生します。
A connect request was made on an already connected socket.
この時点で、サーバーがオンラインに戻ったとしても、スクリプトを再接続する唯一の方法は、サーバーを強制終了して再起動することです。クライアント側のソケット接続をシャットダウンするには、他に何かありますか? このトピックで見つけたもののほとんどは、着信接続をリッスンするソケットを扱っています。
「unset」に続いて「socket_create」を使用して $socket を再作成しようとしましたが、どちらも役に立ちませんでした。
編集:私が意味するのは、コードの最後のチャンクを次のように変更した場合です
$ret = socket_write($socket, $str, strlen($str));
if ($ret === false)
{
socket_shutdown($socket, 2);
socket_close($socket);
unset($socket);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
connect();
}
その後も同じエラーが発生します。
どんな助けでも大歓迎です。
解決済み: これは実際にはグローバル変数の設定解除の問題であることが判明しました。socket_write を使用したそのコードのチャンクは、別の関数にありました。関数の先頭に「global $socket」を追加しましたが、設定を解除した後にも追加する必要があることがわかりました。また、グローバルの設定を解除するには、unset($GLOBALS['socket']); を使用する必要があります。これを再検討させてくれたEJPに感謝します。