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

来源:互联网 发布:软件配置管理办法 编辑:程序博客网 时间:2024/05/16 00:29

最近遇到一个问题,就是在高并发下,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.0002     234472   1. {main}() D:\test\mysql-index\timeout.php:0   51.1252     242496   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: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。
程序中应当判断这种错误。


0 0
原创粉丝点击