最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP訪問MySQL查詢超時處理的方法

 更新時間:2011年05月02日 13:21:15   作者:  
PHP連接MySQL主要是使用Mysql提供的 libmysqlclient 的客戶端庫,同時也延伸出來 mysql 和 mysqli 兩套PHP的擴展,相對來說 mysqli 比 mysql 更好,更穩(wěn)定。
目前兩個客戶端擴展庫連接超時可以設(shè)置選項來操作,比如mysqli:
復(fù)制代碼 代碼如下:

<?php
//創(chuàng)建對象
$mysqli = mysqli_init();
//設(shè)置超時選項
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
//連接
$mysqli->real_connect('localhost', 'my_user', 'my_password', 'world');
//如果超時或者其他連接失敗打印錯誤信息
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
//成功輸出連接信息
printf ("Connection: %s\n.", $mysqli->host_info);
$mysqli->close();
?>

這個是連接超時,但是有些時候我們需要查詢讀寫超時,比如說我們一個數(shù)據(jù)庫壓力很大,或者連接很多,那么數(shù)據(jù)庫查詢就很緩慢,但是我希望某些不重要的數(shù)據(jù),比如說文章點擊數(shù)這種如果查詢超時了就不顯示,至少能夠保證主體頁面正確顯示,但是查遍PHP手冊沒有發(fā)現(xiàn)這個操作選項或者函數(shù)。

 

手冊里只有這么四個選項

跟蹤 mysqli 的擴展源代碼發(fā)現(xiàn)它底層調(diào)用的是 libmysqlclient 的 mysql_options:

php-5.2.8/ext/mysqli/mysqli_api.c

并且在mysqli的PHP擴展中就只導(dǎo)出了幾個變量:

php-5.2.8/ext/mysqli/mysqli.c

大概看了一下 libmysqlclient 的代碼,發(fā)現(xiàn)其實它自帶是有讀寫超時設(shè)置的:

mysql-5.1.30/sql-common/client.c

因為它自己定義了很多操作選項,只是php擴展里沒有:

mysql-5.1.30/include/mysql.h

看看mysql中的讀寫超時是如何實現(xiàn)的:

mysql-5.1.30/sql-common/client.c

讀寫超時真正操作的地方,超時處理這里重試了兩次,還是寫死了:

mysql-5.1.30/sql/net_serv.cc

現(xiàn)在基本得出了結(jié)論:

按照上面查看代碼來看,目前PHP針對MySQL查詢超時以下限制:

1. 超時設(shè)置單位為秒,最少配置1秒

2. 但mysql底層的read會重試兩次,所以實際會是 3 秒

 

重試兩次 + 自身一次 = 3倍超時時間。

 

那么就是說最少超時時間是3秒,不會低于這個值,對于大部分應(yīng)用來說可以接受,但是對于小部分應(yīng)用需要優(yōu)化。
現(xiàn)在我們來看看如果我們自己要設(shè)置超時,我們自己壓入 MYSQL_OPT_READ_TIMEOUT 也是可以達到讀寫超時效果的,寫一段代碼來測試一下:

復(fù)制代碼 代碼如下:

<?php
//自己定義讀寫超時常量
if (!defined('MYSQL_OPT_READ_TIMEOUT')) {
define('MYSQL_OPT_READ_TIMEOUT', 11);
}
if (!defined('MYSQL_OPT_WRITE_TIMEOUT')) {
define('MYSQL_OPT_WRITE_TIMEOUT', 12);
}

//設(shè)置超時
$mysqli = mysqli_init();
$mysqli->options(MYSQL_OPT_READ_TIMEOUT, 3);
$mysqli->options(MYSQL_OPT_WRITE_TIMEOUT, 1);

//連接數(shù)據(jù)庫
$mysqli->real_connect("localhost", "root", "root", "test");
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

//執(zhí)行查詢 sleep 1秒不超時
printf("Host information: %s\n", $mysqli->host_info);
if (!($res=$mysqli->query('select sleep(1)'))) {
echo "query1 error: ". $mysqli->error ."\n";
} else {
echo "Query1: query success\n";
}

//執(zhí)行查詢 sleep 9秒會超時
if (!($res=$mysqli->query('select sleep(9)'))) {
echo "query2 error: ". $mysqli->error ."\n";
} else {
echo "Query2: query success\n";
}

$mysqli->close();
echo "close mysql connection\n";
?>

查看上面代碼的執(zhí)行結(jié)果,驗證了上面的觀點,第一個查詢成功了,第二個查詢連接被斷開了:

如果需要修改這個秒級別的超時,比如改成毫秒級別的超時,只能兩個地方修改:

 

1.  修改客戶端,比如 mysqli query 代碼,加入定時器,超時則返回

2.  修改 Mysql 中的vio代碼,因為mysql的網(wǎng)絡(luò)處理底層都是經(jīng)過vio的操作

MySQL相關(guān)的vio代碼:

poll 超時:

setsockopt 超時:

基本上到這里就基本能夠解決PHP在針對MySQL讀寫查詢操作超時的處理了,希望對你有幫助。
heiyeluren的blog

相關(guān)文章

  • MySQL數(shù)據(jù)中很多換行符和回車符的解決方法

    MySQL數(shù)據(jù)中很多換行符和回車符的解決方法

    這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)中很多換行符和回車符的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • 帶你了解MySQL中的事件調(diào)度器EVENT

    帶你了解MySQL中的事件調(diào)度器EVENT

    這篇文章主要介紹了帶你了解MySQL中的事件調(diào)度器EVENT,幫助大家更好的理解和學習MySQL,感興趣的朋友可以了解下
    2020-08-08
  • MySQL實現(xiàn)定時自動備份的流程步驟(Windows環(huán)境)

    MySQL實現(xiàn)定時自動備份的流程步驟(Windows環(huán)境)

    這篇文章主要介紹了MySQL實現(xiàn)定時自動備份的流程步驟(Windows環(huán)境),文中通過圖文結(jié)合的方式介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-12-12
  • 淺談Mysql指定順序排序查詢

    淺談Mysql指定順序排序查詢

    給大家用過實例分析了Mysql查詢中指定順序排序的相關(guān)技術(shù)問題,需要的朋友參考一下吧。
    2017-12-12
  • mysql drop database刪除數(shù)據(jù)庫命令實例講解

    mysql drop database刪除數(shù)據(jù)庫命令實例講解

    這篇文章主要介紹了mysql drop database刪除數(shù)據(jù)庫命令實例講解的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • MySQL深入詳解delete與Truncate及drop的使用區(qū)別

    MySQL深入詳解delete與Truncate及drop的使用區(qū)別

    對于drop、truncate和delete雖然簡單,但是真要使用或者面試時候問到還是需要有一定的總結(jié),下面這篇文章主要給大家介紹了關(guān)于mysql中drop、truncate與delete區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • MySQL限制查詢和數(shù)據(jù)排序介紹

    MySQL限制查詢和數(shù)據(jù)排序介紹

    這篇文章主要介紹了MySQL限制查詢和數(shù)據(jù)排序介紹,通過limit可以限制返回結(jié)果的行數(shù),而當數(shù)據(jù)查詢出來以后,我們可以對數(shù)據(jù)進行排序處理。在末尾使用order?by語句,下文相關(guān)詳細介紹,需要的小伙伴可以參考一下
    2022-03-03
  • sql如何使用group by分組,同時查詢其它字段

    sql如何使用group by分組,同時查詢其它字段

    文章介紹了使用SQL的GROUP BY進行分組查詢時的一些規(guī)則和技巧,主要強調(diào)了在SELECT后面的字段要么是聚合函數(shù)的一部分,要么必須包含在GROUP BY子句中,此外,文章還討論了如何在GROUP BY時查詢其他字段,通過使用MAX或MIN函數(shù)來實現(xiàn)
    2024-12-12
  • 解決MySQL因不能創(chuàng)建臨時文件而導(dǎo)致無法啟動的方法

    解決MySQL因不能創(chuàng)建臨時文件而導(dǎo)致無法啟動的方法

    這篇文章主要跟大家介紹了關(guān)于解決MySQL因不能創(chuàng)建臨時文件而導(dǎo)致無法啟動的方法,文中通過示例代碼介紹了詳細的解決方法,對大家具有一定的的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • CenOS6.7下mysql 8.0.22 安裝配置方法圖文教程

    CenOS6.7下mysql 8.0.22 安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了CenOS6.7下mysql 8.0.22 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評論

石景山区| 唐河县| 江阴市| 锦屏县| 宁津县| 乌兰县| 阿瓦提县| 永德县| 柯坪县| 驻马店市| 徐闻县| 大足县| 安龙县| 临清市| 宁河县| 葵青区| 镇雄县| 天全县| 田林县| 宁明县| 泰兴市| 玉田县| 新和县| 金寨县| 新巴尔虎右旗| 郧西县| 凭祥市| 蒙城县| 洛扎县| 项城市| 岚皋县| 大渡口区| 石渠县| 阜城县| 永登县| 会泽县| 津市市| 宁波市| 华坪县| 叶城县| 多伦县|