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

时间:2018-06-29 13:54:03

标签: php sockets caching tcp

我对PHP中的并行套接字连接有疑问。 我不是套接字专家,所以才在这里问这个问题。 我创建了一个库,可以在PHP中持久存储数据(字符串/整数/浮点数/数组/对象或无损可序列化的任何东西),例如缓存。我提供了部分代码,我认为这会导致问题,但是如果您需要其他信息,请访问:https://github.com/dude920228/php-cache

概念是:

  • 创建一个TCP套接字服务器
  • 接受连接
  • 从连接的客户端读取序列化的PHP数组
  • 调用从客户端收到的操作的操作处理程序,并在必要时对发送的数据进行处理,或者写回客户端
  • 在客户端关闭连接

它像具有25个并行连接的超级按钮一样工作,但是由于某些原因,客户端没有收到他们应该获取的数据。在100个并行连接时,只有大约一半的客户端可以获取数据。该程序不会发出任何错误,并且我使用的唯一错误控制运算符是在主循环中的socket_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_select电话吗?还是其他班的问题?预先感谢您的回答!

0 个答案:

没有答案