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:7mysql_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。程序中应当判断这种错误。 |
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。