在此处列出的 php 文档中,有迹象表明该函数使用读取、错误和写入数组值作为参考,但我无法在任何地方找到这些值中实际更改的内容。
我写了一个我现在使用的简单“服务器”,我注意到当提到的函数无法看到轮询客户端上的任何数据时,它会更改数组并使其无法再次轮询。这是我的代码:
<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 第一次检查没有要读取的数据的连接后,数组没有套接字资源。