Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP套接字多个客户端读/写_Php_Sockets_Caching_Tcp - Fatal编程技术网

PHP套接字多个客户端读/写

PHP套接字多个客户端读/写,php,sockets,caching,tcp,Php,Sockets,Caching,Tcp,我有一个关于PHP中的并行套接字连接的问题。 我不是插座专家,所以我在这里问这个问题。 我创建了一个库,它能够在PHP中持久化数据(string/int/float/array/object或任何可以无损序列化的数据),比如缓存。我提供了我的代码的一部分,我认为这是导致问题的原因,但是如果您需要其他信息,请访问: 这一概念是: 创建TCP套接字服务器 接受连接 从连接客户端读取序列化的PHP数组 调用从客户机接收的操作的操作处理程序,并在必要时对发送的数据进行处理,或者写回客户机 关闭客户端上

我有一个关于PHP中的并行套接字连接的问题。 我不是插座专家,所以我在这里问这个问题。 我创建了一个库,它能够在PHP中持久化数据(string/int/float/array/object或任何可以无损序列化的数据),比如缓存。我提供了我的代码的一部分,我认为这是导致问题的原因,但是如果您需要其他信息,请访问:

这一概念是:

  • 创建TCP套接字服务器
  • 接受连接
  • 从连接客户端读取序列化的PHP数组
  • 调用从客户机接收的操作的操作处理程序,并在必要时对发送的数据进行处理,或者写回客户机
  • 关闭客户端上的连接
它的工作原理与25个并行连接类似,但由于某些原因,客户机没有收到他们应该获得的数据。在100个并行连接中,只有一半的客户机获得数据。程序不会发出任何错误,我使用的唯一错误控制操作符是主循环中的
socket\u accept
调用。主循环如下所示:

public function run()
{
    $this->socket = $this->ioHandler->createServerSocket();
    while ($this->running) {
        $this->maintainer->checkBackup(time(), $this->bucket);
        $this->maintainer->maintainBucket($this->bucket);
        if (($connection = @socket_accept($this->socket))) {
            $clientId = uniqid();
            socket_set_nonblock($connection);
            $this->clients[$clientId] = $connection;
            $read = $this->clients;
            $write = array();
            $except = array();
            socket_select($read, $write, $except, null);
            $dataString = $this->ioHandler->readFromSocket($connection);
            $data = unserialize($dataString);
            ($this->actionHandler)($data, $this->bucket, $this->ioHandler, $connection);
            $this->ioHandler->closeSocket($connection);
            unset($this->clients[$clientId]);
        }
    }
    $this->close();
}

我是否误用了
socket\u select
呼叫?或者问题是在另一个班级?提前感谢您的回答

错误抑制操作符(@)几乎总是比它的价值更麻烦。如果您将其删除并重新配置PHP以记录到文件中,而不是打印错误以输出,则调试会更加容易。@GordonM我将错误记录到文件中,因为我将服务器作为linux守护程序运行。该文件的最后一个条目是6月8日,在我在github上发布之前。是否真的是
socket\u accept
导致了错误?正如我所看到的,所有数据都会被存储(我记录了传入的数据),但并不是所有的客户机都会将数据返回。这是我在代码中看到的唯一一件可以由于@operator而无声失败的事情,所以在没有@operator的情况下尝试它是值得的。