【发布时间】: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