程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql查詢超時對PHP執行的影響

mysql查詢超時對PHP執行的影響

編輯:MySQL綜合教程

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。程序中應當判斷這種錯誤。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved