PHP通过命令退出后/何时立即在Linux自由tcp端口上安装PHP套接字?

PHP通过命令退出后/何时立即在Linux自由tcp端口上安装PHP套接字?,php,linux,sockets,nginx,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: 2

我有一个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
pkill-f socketserver.php # /usr/bin/php/var/www/webroot/ROOT/socketserver.php使用tcp端口:20491 如果我不使用释放tcp端口的命令,我必须(并且将不得不)等待2到5分钟,直到操作系统发现没有进程使用该tcp端口并释放/释放它

我应该使用:fuser,Tpkill,什么? 我更喜欢已经安装在ubuntu服务器14.04上的东西

谢谢。

您不能强制“释放”TCP端口。要删除强制等待时间,套接字服务器应在创建侦听套接字时设置
SO\u REUSEADDR
socket选项

这样,如果重新启动服务器时服务器正忙,您仍然会丢失消息。更好的解决方案是像其他人那样做:让一个“主”进程创建和绑定侦听套接字,并将接受连接和处理连接的任务委托给一个子进程。重新启动的大多数原因(如重新加载配置)只能通过重新启动子端口来完成,而侦听套接字保持打开状态以进行连接。

您不能强制“释放”TCP端口。要删除强制等待时间,套接字服务器应在创建侦听套接字时设置
SO\u REUSEADDR
socket选项


这样,如果重新启动服务器时服务器正忙,您仍然会丢失消息。更好的解决方案是像其他人那样做:让一个“主”进程创建和绑定侦听套接字,并将接受连接和处理连接的任务委托给一个子进程。重新启动的大多数原因,如重新加载配置,都可以通过仅重新启动子进程来完成,而侦听套接字保持打开状态以进行连接。

基于@Joni的答案,您需要在绑定套接字之前使用
socket\u set\u option():


使用此选项后,脚本的后续重新启动应该可以正常工作,而无需手动释放套接字。

基于@Joni的答案,您需要在绑定套接字之前使用
socket\u set\u option()
函数(-是的,此代码是从该页面无耻地复制/粘贴的):

一旦您使用了它,脚本的后续重新启动应该可以正常工作,而无需手动释放套接字

if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) {
    echo 'Unable to set option on socket: '. socket_strerror(socket_last_error()) . PHP_EOL;
}