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

最近遇到一个问题,就是在高并发下,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)总结

函数名称 线程阻塞 锁阻塞
mysql_connect 函数值返回false,并抛出一个warning级别错误,并不会终止程序。 返回resource(3, mysql link),正常
mysql_query 函数值返回false,并抛出一个warning级别错误,并不会终止程序。如果mysql_connect返回false,即使连接被释放,mysql_query不会重新连接到mysql 返回false,但不抛出异常。对正常的mysql_query,执行失败返回false。程序中应当判断这种错误。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。