为什么php';s fsockopen正在返回(资源暂时不可用)?
我有一个非常简单的服务器php代码如下为什么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
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)