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

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

在一个页面上,我有两个不同的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)。与此相关的任何其他设置?如果没有,这种行为的原因是什么?
以下是应该复制问题的简化代码:
页码:

  1. <script>
  2. var session_id = '<?php echo session_id();?>';
  3. $.ajax({
  4. type: "POST",
  5. url: "script1.php",
  6. beforeSend: function (xhr) {
  7. xhr.setRequestHeader('Set-Cookie', 'PHPSESSID=' + session_id);
  8. },
  9. success: function(result) {
  10. console.log("Script 1 done");
  11. }
  12. });
  13. $.ajax({
  14. type: "POST",
  15. url: "script2.php",
  16. beforeSend: function (xhr) {
  17. xhr.setRequestHeader('Set-Cookie', 'PHPSESSID=' + session_id);
  18. },
  19. success: function(result) {
  20. console.log("Script 2 done");
  21. }
  22. });
  23. <script>

script1.php(脱机mysql主机):

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

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

  1. session_start();
  2. $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/

相关问题