在页面上,我有2个不同的jquery ajax调用2个不同的php脚本。
在每个中,MySQLI连接都是在远程服务器上使用数据库建立的(2个不同的远程服务器(。
有时,第一个脚本试图连接到的服务器可以离线。在这种情况下,$ db-> real_connect命令超时(我将其设置为几秒钟(,这不是问题。
我不明白的是,当$ db-> real_connect命令正在运行(等待超时(,而第二个脚本是ajax clain的,第二个脚本将在其$ 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的顺序,则"脚本2完成"即时出现,"脚本1完成" 5秒后。似乎只允许使用1个同时连接操作,这是有任何解决方案吗?您将如何解决此问题?
谢谢
感谢史密斯在解决方案的评论中。
问题是会话阻止。正如我所忽略的那样,一旦您调用session_start((,php写入$ _session变量的文件就会锁定,并且其他脚本都无法访问它,直到您关闭或使用脚本结束脚本为止。我的第二个脚本正在等待此文件可用。
一个简单的解决方案是,如果您不打算编写会话变量,则在session_start((之后立即添加session_write_close((。(变量保持加载(。
我检查了此页面以获取更多信息:http://konrness.com/php5/how-to-prevent-blocking-php-requests/