为什么php';s fsockopen正在返回(资源暂时不可用)?

为什么php';s fsockopen正在返回(资源暂时不可用)?,php,performance,unix,sockets,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

我有一个非常简单的服务器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);
   }
}

对于($counter=0;$counter请检查您的
ulimit
。您的文件描述符表是否溢出?


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

我刚刚研究了这个问题(通过谷歌获得),我发现了一个解决方案来消除错误:

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);

迟到总比不迟到好?;-)

当前设置为“无限制”;我应该说得更清楚些。检查打开文件限制(-n选项,或-a表示所有限制。)打开-n设置为1024,但多次打开同一文件套接字是否会使用此限制?特别是在我打开另一个后关闭每一个?很有趣。这是什么站台?从套接字路径名来看,您似乎在Unix和Windows上混合使用。我能够在普通用户下在Mac上重现您的结果,但在root下,它可以毫无问题地运行1000个连接。请记住,PHP本身会打开一些未知数量的文件。Nikolai,感谢您的尝试。您会发现,如果您的服务器实际计算了任何内容(比如将该字符串写入文件),您将无法在没有该警告的情况下通过1000。这有点道理,如果服务器只能有这么多积压的连接,并且在计算上花费时间,那么套接字迟早不会接受更多的连接。如果是这样的话,请告诉我,您认为我可以做些什么来提高限额。谢谢这个代码连接到哪里?您没有在任何地方指定端点!(/tmp/mysock)