gpt4 book ai didi

php - Socket_select : it affects its inputs, 但究竟如何?

转载 作者:行者123 更新时间:2023-12-03 11:51:19 28 4
gpt4 key购买 nike

在列出的 php 文档中 here有迹象表明该函数使用读取、错误和写入数组值作为引用,但我无法在任何地方找到这些值中实际发生的变化。

我写了一个我现在使用的简单“服务器”,我注意到当提到的函数无法看到轮询客户端上的任何数据时,它会更改数组并使其无法再次轮询。这是我的代码:

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

最佳答案

这些数组是套接字资源的数组。 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

关于php - Socket_select : it affects its inputs, 但究竟如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10284578/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com