近来遇到一个问题,就是在高并发下,mysql功能呈现了瓶颈,由于PHP是一种弱类型的言语,没有类型一说。因而,当mysql回来并非预期成果时,会致使后续逻辑过错。
1)线程堵塞测验
当sql句子履行太慢,会致使mysql的衔接数被耗尽,无法处理新的请求。
测验方法
履行set global max_connections=1;句子,并在另一个程序中开启长衔接占用该衔接,此刻,mysql效劳现已无衔接可用。
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。程序中应当判断这种过错。
(责任编辑:最模板)