您的位置:首页 > 博客中心 > 数据库 >

mysql查询超时对PHP执行的影响

时间:2022-03-14 09:11

最近遇到一个问题,就是在高并发下,mysql性能出现了瓶颈,由于PHP是一种弱类型的语言,没有类型一说。因此,当mysql返回并非预期结果时,会导致后续逻辑错误。

1)线程阻塞测试

当sql语句执行太慢,会导致mysql的连接数被耗尽,无法处理新的请求。

测试方法

执行set global  max_connections=1;语句,并在另一个程序中开启长连接占用该连接,此时,mysql服务已经无连接可用。

PHP代码如下:

<?php
$con=mysql_connect('127.0.0.1','root','');
var_dump($con);
sleep(10);
mysql_select_db('test',$con);
$cursor=mysql_query("select * from `timeout_test` where `id`=2 for update");
var_dump($cursor);
var_dump(mysql_fetch_assoc($cursor));
echo "done!";
返回结果,mysql_connect 和mysql_query都返回false错误

2)锁阻塞测试

恢复正常的链接数,执行set autocomit=0; 我使用的是innodb引擎,myisam引擎没有事务概念,autocomit的值在myisam下总为1。

在mysql链接中,执行语句:

mysql> select * from `timeout_test` where `id`=2 for update;
+----+------+
| id | name |
+----+------+
|  2 | kk   |
+----+------+
1 row in set (0.00 sec)

接下来,执行上述PHP,返回结果如下:

resource(5) of type (mysql link)
bool(false)

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in D:\test\mysql-index\timeout.php on line 7

Call Stack:
    0.0002     234472   1. {main}() D:\test\mysql-index\timeout.php:0
   51.1252     242496   2. mysql_fetch_assoc() D:\test\mysql-index\timeout.php:7

NULL
done!PHP Warning:  mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in D:\test\mysql-index\timeout.php on line 7
PHP Stack trace:
PHP   1. {main}() D:\test\mysql-index\timeout.php:0
PHP   2. mysql_fetch_assoc() D:\test\mysql-index\timeout.php:7
mysql_query返回了false,此时如果强制使用mysql_fetch_assoc等获取结果的函数,将会返回NULL


3)总结

返回false,但不抛出异常。对正常的mysql_query,执行失败返回false。程序中应当判断这种错误。


本类排行

今日推荐

热门手游