在PHP

时间:2018-06-04 12:51:51

标签: php sockets tcp

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

1 个答案:

答案 0 :(得分:1)

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

更多信息是: