关闭旧的 php websocket
Posted
技术标签:
【中文标题】关闭旧的 php websocket【英文标题】:Closing old php websocket 【发布时间】:2012-12-18 10:37:37 【问题描述】:我正在使用php-Websockets 创建一个简单的聊天服务器。当我第一次运行在我的服务器上创建 websocket 的 php 脚本时,我的一切工作正常。如果脚本由于某种原因停止并且我尝试重新运行它,我会收到一条错误消息,指出脚本无法绑定套接字,因为它已经存在。
我如何编写脚本来找到这个旧套接字(假设我知道它在哪个端口上运行)并关闭它以便建立新连接?
【问题讨论】:
如果已经连接,您可以使用该类中的disconnect
方法断开连接
你指的是什么断开方式?我在这个 php 函数页面上找不到它 - php.net/manual/en/ref.sockets.php
你需要弄清楚如何启用SO_REUSEADDR
。
你正在使用的websockets.php
中有github.com/ghedipunk/PHP-Websockets/blob/master/websockets.php
@DavidSchwartz 我目前正在使用此选项,但它仍然无法正常工作 - socket_set_option($this->master, SOL_SOCKET, SO_REUSEADDR, 1)
【参考方案1】:
如果你有 shell 访问权限,我会使用以下命令来推断使用该套接字(端口)的进程的 PID。
netstat --tcp --listening --program
然后杀死那个进程。
kill %pid%
为了防止这种情况发生,我会仔细检查您的脚本是否正常终止并首先关闭套接字。
【讨论】:
感谢乔恩,这将起作用,但我正在尝试找出一种方法让我的服务器在无需我手动登录的情况下处理此功能。至于正确结束的脚本,它确实如此。我正在尝试将其实现为最坏的情况,因此我的聊天功能始终在运行。 @anonymousfox:当您手动执行此操作时,您最终会杀死哪个进程? @DavidSchwartz 其实我说得太快了。我认为乔恩所说的会起作用,但是当我尝试时,没有列出连接到套接字的进程。当我杀死/重新启动 apache 时,它对 websocket 没有任何作用。我唯一能做的就是完全重启服务器。 两分钟左右还不清楚?如果没有进程拥有该端口并且几分钟后仍未清除,则您手上有内核或驱动程序错误。 不一定是驱动程序错误 - 请检查您的网络连接超时。我在使用 tcp-sockets 的 java 中遇到了类似的问题,并且在不同的计算机上行为完全不同。最后是不同的超时时间。【参考方案2】:在 Ubuntu(linux) 服务器上测试:
我是这样解决的:
使用exec()
函数,您可以轻松终止正在运行的网络套接字:
让一个名为socketControl.php
的php文件和代码:
exec('kill $(pidof php)');
这应该取消服务器中当前正在运行的 php websocket。
【讨论】:
以上是关于关闭旧的 php websocket的主要内容,如果未能解决你的问题,请参考以下文章