Linux上的PHP套接字-PHP通过命令退出后立即释放tcp端口


PHP Sockets on Linux - Free tcp port immediately after/when php exits via command?

我有一个nginx服务器,它全天候运行php脚本,通过套接字接收消息,并使用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套接字选项。

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

基于@Joni的回答,您将希望在绑定套接字之前使用socket_set_option()函数(http://php.net/manual/en/function.socket-set-option.php-是的,这个代码是无耻地从那个页面复制/粘贴的):

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

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