我在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+c
或start-stop-daemon --stop --pidfile
关闭,并且套接字仍处于打开状态,并且可能有一些自动化服务可以清除死套接字。如何正确关闭服务器?我可以通过STDIN
发送输入来终止进程以终止服务器套接字吗?或者我在这个问题上错了吗?完整代码可在github上找到:https://github.com/dude920228/php-cache