在列出的here的php文档中,有一个迹象表明该函数使用read,error和write数组值作为refference,但我无法找到这些值中实际更改的任何位置。
我写了一个简单的'服务器',我现在使用,并且我注意到当提到的函数无法在轮询的客户端上看到任何数据时,它会更改数组并使其无法再次轮询。这是我的代码:
<php - all socket creation binding and listening above..
socket_set_nonblock($mysock);
$w = $e = array();
$clients = array($mysock);
do {
$temp_client = @socket_accept($mysock);
if ($temp_client != FALSE)
$clients[] = $temp_client;
$clients_backup = $clients;
$select_socket = socket_select($clients,$w,$e,0);
if (($select_socket !== FALSE) AND ($select_socket != 0)) {
foreach ($clients as $value) {
$input = socket_read($value,1024,PHP_BINARY_READ);
echo $input;
}
}
$clients = $clients_backup;
} while(TRUE);
在测试时考虑到第一个连接没有被处理..我不知道为什么(非常感谢elightment)这个代码是我正在开发的一个条带,并且它工作正常。 socket_select问题在两个代码中保持不变。
基本上如果我没有对客户端数组进行备份,则它不起作用。错误:“没有资源数组被传递给select”,因为在socket_select首次检查没有要读取的数据的连接之后,数组没有套接字资源。
答案 0 :(得分:4)
这些数组是套接字资源的数组。 socket_select()
将通过从中删除任何未准备好分别读取,写入等的资源来修改数组。
您几乎总是想要传递数组的副本,因为它们会被修改,您不希望丢失对它们的原始引用:
$clients = [ ... ];
$r = $w = $e = $clients;
$numChanged = socket_select($r, $w, $e, ...);
// Here, $r, $w, and $e will only contain the resources that are ready for processing, which may be none at all