php mysqli->real\u connect防止在超时时以不同的脚本连接到不同的数据库

enxuqcxy  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(377)

在一个页面上,我有两个不同的jqueryajax调用,分别调用两个不同的php脚本。
在每种情况下,mysqli都与远程服务器(2个不同的远程服务器)上的数据库建立连接。
有时,第一个脚本尝试连接到的服务器可以脱机。在这种情况下,$db->real\u connect命令超时(我设置为几秒钟),这不是问题。
我不明白的是,当$db->real\u connect命令在第一个脚本中运行(等待超时)时,第二个脚本调用了ajax,第二个脚本将在$db->real\u connect行暂停,直到第一个脚本尝试连接完成。
我认为is可能是mysqli设置,但我有max\u links和max\u persistents都设置为no limit(-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的顺序,“script2 done”会立即出现,而“script1 done”会在5秒钟后出现。似乎只有一个同时连接操作是允许的,有什么办法吗?你将如何解决这个问题?
谢谢

wwtsj6pe

wwtsj6pe1#

感谢史密斯在评论中提出的解决方案。
问题是会话阻塞。正如我所忽略的,一旦调用session\u start(),用户的php write$\u session变量所在的文件就会被锁定,在您关闭或使用它的脚本结束之前,其他脚本都无法访问它。我的第二个脚本正在等待此文件可用。
一个简单的解决方案是在session\u start()之后立即添加session\u write\u close(),如果您不打算编写会话变量的话(变量保持加载状态)。
我查看了此页以了解更多信息:http://konrness.com/php5/how-to-prevent-blocking-php-requests/

相关问题