Linux 上的 PHP 套接字 - 在通过命令退出 php 之后/当 php 退出时立即释放 tcp 端口?

标签 php linux sockets nginx tcp

我有一个 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/

相关文章:

php - 未收到来自 Amazon SNS 的 GCM 推送通知

linux - 每次添加新用户时如何运行特定命令

c++ - 这个套接字绑定(bind)失败了吗?如果是,为什么?

java - 在 Windows linux 和 MAC 上安装和运行应用程序作为服务

c# - 发送或接收数据的请求被拒绝,因为套接字未连接。 .

c - 用 C 序列化包

c# - 从 PHP 最快访问密集型函数?

php - Composer 无法打开流 : Permission denied

PHP 为什么 !empty 不起作用?

c++ - 通过 C++ 套接字发送图像 (Linux)