为什么php的fsockopen返回(资源暂时不可用)?

时间:2009-05-28 21:07:40

标签: php performance unix sockets

我有一个非常简单的服务器PHP代码,如此

function listenForClients()
 {
      $this->serviceConnection = socket_create(AF_UNIX, SOCK_STREAM, 0);
      socket_bind($this->serviceConnection, "\tmp\mysock", 0);
      socket_listen($this->serviceConnection, 10000000);

      while($clientSocket = socket_accept($this->serviceConnection))
      {
           $clientMessage = socket_read($clientSocket, 1024);
           socket_close($clientSocket);
      }
 }


然后我有一个非常简单的客户端来完成这个

for ( $counter = 0; $counter <= 1000; $counter ++) {    
   $fp = fsockopen("unix///tmp/mysock", 0, $errno, $errstr);

   if (!$fp){
      echo  "Error: Could not open socket connection at " . $counter . "\n";
      exit;
   }else{    
      fputs ($fp, "hello", strlen("hello"));
      fclose($fp);
   }
}

出于某种原因,在随机数量的连接(大约300-500)之后,fsockopen将返回警告资源暂时不可用。一开始,我在大约20-30个连接处收到警告。但是一旦我增加了socket_listen中的backlog参数,它就会好一些,大约300-500。我该如何克服这个问题?

构建php服务器套接字以便每秒接受大量传入连接(持续)的方法是什么。

谢谢!

完整错误:

  

PHP警告:fsockopen():无法   连接到unix:/// tmp / mysock:0   (资源暂时不可用)   第22行的test.php

2 个答案:

答案 0 :(得分:1)

检查ulimit。你溢出了文件描述符表吗?

编辑:您在accept()中的待办事项值是假的。大多数操作系统的最大传入连接队列大小为几十,而不是几千。

答案 1 :(得分:0)

我刚刚看过这个问题(通过谷歌来到这里),我找到了摆脱错误的解决方案:

PHP Warning: fsockopen(): unable to connect to unix:///tmp/mysock:0 (Resource temporarily unavailable) in test.php on line 22

..是不在编写器线程中使用fsockopen();尝试这样的事情:

if (! ($cSock = socket_create(AF_UNIX, SOCK_STREAM, 0))) {
    exit("Failed to create socket");
    continue;
} else if (! socket_connect($cSock, IPC_SOCK)) {
    exit("Failed to connect socket");
} else {
    $bw = socket_write($cSock, $msg);
    if ($bw === false) {
        exit("Socket write failed, %s", array(socket_strerror(socket_last_error())));
    } else {
        exit("Wrote $bw bytes to socket");
    }
}
socket_shutdown($cSock);
socket_close($cSock);

迟到总比没有好? ; - )