我有一个 nginx 服务器运行一个 php 脚本 24/7,它通过套接字接收消息并使用 mysql 存储它们。
有时出于某种原因我不得不停止它的运行,我需要一种方法让它尽快重新启动以避免丢失消息。
我使用此脚本 (.sh) 停止并再次运行该进程:
pkill -f socketserver.php
#<Line that frees the tcp port>
/usr/bin/php /var/www/webroot/ROOT/socketserver.php #uses tcp port: 20491
如果我不使用释放 tcp 端口的命令,我必须(并且将不得不)等待 2 到 5 分钟,直到操作系统认为没有进程使用该 tcp 端口并释放/释放它。
我应该使用:fuser、tcpkill 还是什么? 我更喜欢 ubuntu 服务器 14.04 上已经安装的东西
谢谢。
最佳答案
您不能强行“释放”一个 TCP 端口。要删除强制等待时间,套接字服务器应在创建监听套接字时设置 SO_REUSEADDR
套接字选项。
这样,如果服务器在您重新启动时正忙,您仍然会丢失消息。更好的解决方案是做其他人所做的事情:让“主”进程创建和绑定(bind)监听套接字,并将接受连接和处理连接委托(delegate)给子进程。您重启的大多数原因,例如重新加载配置,都可以通过仅重启子进程来完成,同时监听套接字保持打开状态以进行连接。
关于Linux 上的 PHP 套接字 - 在通过命令退出 php 之后/当 php 退出时立即释放 tcp 端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25650050/