我有一个非常简单的服务器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
答案 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);
迟到总比没有好? ; - )