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

标签 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 Warning: fsockopen(): unable to connect to unix:///tmp/mysock:0 (Resource temporarily unavailable) in test.php on line 22

最佳答案

检查您的ulimit。您是否在溢出文件描述符表?

编辑:您在accept()中拥有的积压值是虚假的。大多数OS-es的最大传入连接队列大小为几十个而不是数千个。

关于php - 为什么php的fsockopen返回(资源暂时不可用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/923208/

相关文章:

performance - 使用核心数据进行后台保存?

Android - 是否可以为静态成员和方法使用自定义类而不是扩展应用程序类

php - 使用sort函数进行排序和分组

php - 要求社会网络分析(SNA)算法

javascript - 在考虑 DOM 操作时,Angular 是否比纯 JavaScript 更快?

MySQL - 结合两个字段来创建一个 unix 时间戳?

java - 将 Java 程序的输出分配为 bash shell 变量

java - Apache POI SXSSFWorkbook 在单独自动运行时无法创建工作表

php - 使用 composer、gulp 和 Travis 的 PHP 网站的目录结构

php - 用于 PHP/Android 的 Xliff 工具