【问题标题】:PHP WebSocket: connection to MySQL server still on but not workingPHP WebSocket:与 MySQL 服务器的连接仍在但无法正常工作
【发布时间】:2015-09-10 09:32:27
【问题描述】:

我有一个奇怪的问题困扰了我好几天:我正在使用 php websocket script 作为 Intranet 站点来提醒员工某些事情。这是一个便宜且相当容易实施的解决方案,而且效果很好。但是,我每天早上都必须重新启动服务器。

由于 php 代码在无限循环中运行,并且每个任务都按顺序而不是同时运行,我假设一个与数据库的持久连接就足够了,所以我只是在代码开头打开一个连接$GLOBALS 变量并一遍又一遍地重用它。它工作正常,直到第二天早上所有请求都将返回为假。连接仍然存在。诸如“->connect_error”和“->connect_stat()”之类的错误捕获器不会返回错误。

显然 MySQL 每晚午夜运行一次自我更新检查。我不确定这是导致问题的原因,但我希望不必禁用此功能。

我设法解决此问题的唯一方法是发送只能返回肯定响应的查询。如果不是,它会关闭并重新打开连接。这对我来说似乎并不聪明。必须有一种方法来检测连接何时变得不可靠。

我正在使用最新版本的 PHP 和 MySQL。

有什么想法吗?

【问题讨论】:

    标签: php mysql phpwebsocket


    【解决方案1】:

    可能没有连接错误,因为它首先成功连接...检查最后一个错误,而不是$mysqli->error。您可能会收到“Mysql Server has gone away”。如果你这样做了,你可以关闭连接并重新启动一个新的。

    【讨论】:

    • 我试过了,因为我可以看到带有该代码的行已被注释。我根本没有看到那个错误。当第一个用户尝试使用该服务时,日志中显示的唯一错误是“发送 QUERY 数据包时出错。PID=[number] 以及文件名和行号。
    • 这不应该是相关的......但无论如何你处理问题的方式似乎都是正确的。
    • 我在 Windows 中找到了手动触发更新任务的计划任务,但之后它仍然有效,这让整个事情变得更加混乱。如果不是这样做的自我更新过程,我不知道是什么。我正在使用 $GLOBALS["Conn"] = new MySQLi("p:localhost", "xxxxxxxxxx", "xxxxxxxxxx") 和 $GLOBALS["Conn"]->options(MYSQLI_OPT_CONNECT_TIMEOUT, 86400)打开连接>
    • 其他评论者说得对。您不能指望 tcp 套接字永远存在,您必须能够处理连接已断开的情况并在需要时重新连接
    • @delatbabel:我接受你的论点。我的意图是永远不要让它永远保持打开状态(因此我的 24 小时超时),而是想找到一种正确的方法来检测这种连接似乎是打开的特殊类型的情况,错误检测机制并不可靠,但数据没有被传递到/从。如果我有 1600 个用户而不是 16 个呢?在每个查询之前发送一个测试查询会给服务器带来不必要的压力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2018-10-28
    • 2012-10-17
    • 2018-04-24
    相关资源
    最近更新 更多