在PHP中关闭套接字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在PHP中关闭套接字相关的知识,希望对你有一定的参考价值。

我在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

答案

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

更多信息是:

以上是关于在PHP中关闭套接字的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rust 中关闭 Unix 套接字?

如何在导航控件片段中关闭导航 DrawerLayout onBackPressed

如何在线程中关闭 QWebSocket?

如何在 Apollo 中关闭 GraphQL 订阅的套接字连接

如何在 socket.io 1.0 中关闭服务器?

如何在 python 程序中关闭 Ctrl-C 上的套接字连接