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