在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+c
或start-stop-daemon --stop --pidfile
关闭,并且套接字仍然是打开的,并且可能有一些自动化服务可以清除死套接字。如何正确关闭服务器?我可以通过STDIN
发送输入以终止服务器套接字来以某种方式终止进程吗?或者我在这个问题上错了吗?完整的代码可以在github上找到:https://github.com/dude920228/php-cache
答案
也许它与TIME_WAIT状态有关。长话短说 - socket_close()可能会关闭套接字,但仍有可能要发送的数据。在发送数据之前,端口将不可用。
更多信息是:
以上是关于在PHP中关闭套接字的主要内容,如果未能解决你的问题,请参考以下文章
如何在导航控件片段中关闭导航 DrawerLayout onBackPressed