現在、PHPでサービスに接続するための非ブロックソケットを使用しています。私が無視する致命的ではないエラーですが、私は決して適切なエラーを取得しないため、接続がサーバーの終了に伴っていつドロップされたかを知ることができませんでした。この問題に関する提案はありますか?PHPソケットは、サーバーがオフラインになったために接続が終了したときに通知します。
マイリスニングルーチンは我々がどこリモートサービスの数と協力ので
$this->shouldListen = true;
$fullResponse = '';
while ($this->shouldListen) {
//read some data
$tempResponse=socket_read($this->sock,1000);
if ($this->shouldBeRunning() == false) {
break;
}
if ($tempResponse == FALSE) {
//ignore ignorable error
$error = socket_last_error($this->sock);
if ($error!=11 && $error!=115 && $error!=10035) {
$this->writeLogFile("got an error ".$error);
break;
}
} else {
//do something with the response
}
}
のように見えるので、
function connect() {
/* Turn on implicit output flushing so we see what we're getting
* as it comes in. */
ob_implicit_flush();
if (($this->sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
return false;
// echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
} else {
//echo 'success1<br />';
}
if (socket_bind($this->sock, '0.0.0.0') === false) {
return false;
//echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
} else {
//echo 'success2<br />';
}
if (socket_connect($this->sock, $this->ip, $this->port) === false) {
//echo "socket_connect() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
return false;
} else {
//echo 'success3<br />';
}
socket_set_nonblock($this->sock);
return true;
}
おかげ
ダニエル
いくつかのコードを表示できますか? –
@Pekkaは私がリッスンしてソケット接続を作成するために使用するコードを投稿しました – Daniel
これは、 'fsockopen()'または 'stream_socket _ *()'を使用するのが好きな理由の1つです。クローズドストリームを検出するためのリソースもちろん、サーバがダウンして、 'FIN'や' RST'を送信しない場合、それを検出することはできません。タイムアウト/キープアライブ/ ACKシステムを実装するだけです。 – DaveRandom