2

在此处列出的 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 第一次检查没有要读取的数据的连接后,数组没有套接字资源。

4

1 回答 1

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
于 2012-04-23T17:31:16.030 回答