PHP套接字,告知连接何时因服务器脱机而中断

PHP套接字,告知连接何时因服务器脱机而中断,php,sockets,Php,Sockets,我目前在php中使用非阻塞套接字连接到服务,我很难判断连接何时由于服务器端故障而中断。。。我得到的所有as错误都是10035,这是一个我忽略的非致命错误,但我从未得到适当的错误,因此无法判断何时由于服务器关闭而断开连接。。。对这件事有什么建议吗 我的听力程序看起来是这样的 $this->shouldListen = true; $fullResponse = ''; while ($this->shouldListen) { //read some data $tempR

我目前在php中使用非阻塞套接字连接到服务,我很难判断连接何时由于服务器端故障而中断。。。我得到的所有as错误都是10035,这是一个我忽略的非致命错误,但我从未得到适当的错误,因此无法判断何时由于服务器关闭而断开连接。。。对这件事有什么建议吗

我的听力程序看起来是这样的

$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;
}
函数连接(){
/*打开隐式输出刷新,以便我们看到得到的结果
*当它进来的时候*/
ob_implicit_flush();
if($this->sock=socket\u create(AF\u INET,sock\u STREAM,SOL\u TCP))==false){
返回false;
//echo“socket\u create()失败:原因:”.socket\u strerror(socket\u last\u error())。“\n”;
}否则{
//回声“成功1
”; } if(socket_bind($this->sock,'0.0.0')==false){ 返回false; //echo“socket\u bind()失败:原因:”.socket\u strerror(socket\u last\u error($sock))。“\n”; }否则{ //回声“成功2
”; } if(socket\u connect($this->sock,$this->ip,$this->port)==false){ //echo“socket\u connect()失败:原因:”.socket\u strerror(socket\u last\u error($sock))。“\n”; 返回false; }否则{ //回声“成功3
”; } 套接字设置非块($this->sock); 返回true; }
谢谢


Daniel

我们与许多远程服务合作,在这些远程服务中,我们必须结合“ping”方法来测试我们所连接的服务是否仍然具有活动连接。我建议在脚本中实现这个ping概念


有人在PHP页面上发布了一个使用socket_*库的实用程序ping方法

@Pekka刚刚发布了我用于监听和创建套接字连接的代码。这是我喜欢使用
fsockopen()
stream\u socket*()
的原因之一,因为这样你就可以在资源上调用
feof()
,检测关闭的流。当然,如果服务器宕机并且没有发送
FIN
RST
,您就无法检测到它,您只需要实现一个超时/keepalive/ACK系统。@DaveRandom这样,如果服务器发送正确的FIN或RST,您的方法会起作用吗?因此,如果服务器程序只是因为某种原因崩溃,那么这种方法将无法正常工作?是的,这是正确的。在套接字上使用流的另一个优点是它们更容易获得。许多服务器没有套接字,但大多数都有流。你在连接什么类型的服务?是的,如果没有其他事情发生,我想做类似的事情