【问题标题】:PHP mysqli->real_connect prevent other connection to different database in different script while timing outPHP mysqli->real_connect 在超时时防止在不同脚本中与不同数据库的其他连接
【发布时间】:2018-10-07 16:48:08
【问题描述】:

在一个页面上,我对 2 个不同的 php 脚本有 2 个不同的 jQuery ajax 调用。

在每一个中,都与远程服务器(2 个不同的远程服务器)上的数据库建立 mysqli 连接。

有时,第一个脚本尝试连接的服务器可能处于脱机状态。在这种情况下,$db->real_connect 命令超时(我设置为几秒钟),这不是问题。

我不明白的是,当 $db->real_connect 命令在第一个脚本中运行(等待超时)并且第二个脚本是 ajax 调用时,第二个脚本将在其 $db 处暂停->real_connect 行,直到第一个脚本完成尝试连接。

我认为可能是 mysqli 设置,但我将 max_links 和 max_persistents 都设置为无限制 (-1)。与此相关的任何其他设置?如果不是,这种行为的原因是什么?

以下是应该复制问题的删节代码:

页面:

<script>
var session_id = '<?php echo session_id();?>';
$.ajax({
    type: "POST",
    url: "script1.php",
    beforeSend: function (xhr) {
        xhr.setRequestHeader('Set-Cookie', 'PHPSESSID=' + session_id);
    },
    success: function(result) {
        console.log("Script 1 done");
    }
});
$.ajax({
    type: "POST",
    url: "script2.php",
    beforeSend: function (xhr) {
        xhr.setRequestHeader('Set-Cookie', 'PHPSESSID=' + session_id);
    },
    success: function(result) {
        console.log("Script 2 done");
    }
});
<script>

script1.php(离线mysql主机):

session_start();
$db = mysqli_init();
$db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
$db->real_connect($host, $username, $pass, $dbname); // This hangs for 5 seconds then fails.

script2.php(不同的mysql主机,在线):

session_start();
$db = new mysqli($host2, $username2, $pass2, $dbname2); // This also hangs for 5 seconds then succeed.

运行页面时,延迟 5 秒后,两个日志都会出现在控制台中。 如果我在 Javascript 中交换 script1 和 script2 的顺序,“Script 2 done”会立即出现,“Script 1 done”会在 5 秒后出现。似乎只允许同时进行 1 个连接操作,有什么办法吗?你会如何解决这个问题?

谢谢

【问题讨论】:

  • 您在使用会话吗?对我来说听起来很像会话阻塞。
  • @smith:确实!听起来我删减了太多代码,对此感到抱歉。我将搜索有关会话阻止的更多信息。
  • session_write_close(); 是简单的解决方案
  • 谢谢,现在很好用!如果你想写一个答案,我会删除我的并接受你的。

标签: php mysql mysqli timeout connection


【解决方案1】:

感谢 cmets 中的 smith 提供解决方案。

问题是会话阻塞。 正如我忽略的那样,一旦您调用 session_start(),PHP 为用户写入 $_SESSION 变量的文件就会被锁定,并且在您关闭或使用它的脚本结束之前,没有其他脚本可以访问它。我的第二个脚本正在等待此文件可用。

如果您不打算编写会话变量,一个简单的解决方案是在 session_start() 之后立即添加 session_write_close()。 (变量保持加载状态)。

我查看了此页面以获取更多信息:http://konrness.com/php5/how-to-prevent-blocking-php-requests/

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2017-11-11
    • 2016-05-06
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多