在PHP中关闭套接字

问题描述 投票:0回答:1

我在php中创建了一个缓存服务器和客户端,不需要问为什么,只是为了好玩。实施工作,但每次出现问题时:

  • 服务器启动
  • 客户连接
  • 服务器存储数据
  • 客户端断开连接

当我停止正在运行的服务器进程时,在客户端断开连接并尝试重新启动服务器之后,socket_bind会抛出一个错误,表明该地址已被使用。在发送或接收数据后,客户端始终关闭连接,当我通过sudo netstat检查端口是否正在使用时,端口未列出。服务器看起来像这样:

public function run()
{
    $this->socket = $this->ioHandler->createServerSocket();
    while ($this->running) {

        while ($connection = @socket_accept($this->socket)) {
            socket_set_nonblock($connection);
            $this->maintainer->maintainBucket($this->bucket);
            $this->maintainer->checkBackup(time(), $this->bucket);
            try {
                $dataString = $this->ioHandler->readFromSocket($connection);
                $data = unserialize($dataString);
                ($this->actionHandler)($data, $this->bucket, $this->ioHandler, $connection);
            } catch (Exception $ex) {
                $this->ioHandler->writeToSocket($connection, self::NACK);
                $this->ioHandler->closeSocket($connection);
            }
        }
    }
}

我认为问题可能是服务器通过简单的ctrl+cstart-stop-daemon --stop --pidfile关闭,并且套接字仍然是打开的,并且可能有一些自动化服务可以清除死套接字。如何正确关闭服务器?我可以通过STDIN发送输入以终止服务器套接字来以某种方式终止进程吗?或者我在这个问题上错了吗?完整的代码可以在github上找到:https://github.com/dude920228/php-cache

php sockets tcp
1个回答
1
投票

也许它与TIME_WAIT状态有关。长话短说 - socket_close()可能会关闭套接字,但仍有可能要发送的数据。在发送数据之前,端口将不可用。

更多信息是:

© www.soinside.com 2019 - 2024. All rights reserved.