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

3)总结

函数名称线程阻塞锁阻塞

mysql_connect函数值返回false,并抛出一个warning级别错误,并不会终止程序。返回resource(3,mysqllink),正常

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

爱情从希望开始,也由绝望结束。死心了,

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

相关文章:

你感兴趣的文章:

标签云: