欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP訪(fǎng)問(wèn)MySQL查詢(xún)超時(shí)處理的方法

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

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

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

 

手冊(cè)里只有這么四個(gè)選項(xiàng)

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

php-5.2.8/ext/mysqli/mysqli_api.c

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

php-5.2.8/ext/mysqli/mysqli.c

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

mysql-5.1.30/sql-common/client.c

因?yàn)樗约憾x了很多操作選項(xiàng),只是php擴(kuò)展里沒(méi)有:

mysql-5.1.30/include/mysql.h

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

mysql-5.1.30/sql-common/client.c

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

mysql-5.1.30/sql/net_serv.cc

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

按照上面查看代碼來(lái)看,目前PHP針對(duì)MySQL查詢(xún)超時(shí)以下限制:

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

2. 但mysql底層的read會(huì)重試兩次,所以實(shí)際會(huì)是 3 秒

 

重試兩次 + 自身一次 = 3倍超時(shí)時(shí)間。

 

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

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

<?php
//自己定義讀寫(xiě)超時(shí)常量
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è)置超時(shí)
$mysqli = mysqli_init();
$mysqli->options(MYSQL_OPT_READ_TIMEOUT, 3);
$mysqli->options(MYSQL_OPT_WRITE_TIMEOUT, 1);

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

//執(zhí)行查詢(xún) sleep 1秒不超時(shí)
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í)行查詢(xún) sleep 9秒會(huì)超時(shí)
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é)果,驗(yàn)證了上面的觀點(diǎn),第一個(gè)查詢(xún)成功了,第二個(gè)查詢(xún)連接被斷開(kāi)了:

如果需要修改這個(gè)秒級(jí)別的超時(shí),比如改成毫秒級(jí)別的超時(shí),只能兩個(gè)地方修改:

 

1.  修改客戶(hù)端,比如 mysqli query 代碼,加入定時(shí)器,超時(shí)則返回

2.  修改 Mysql 中的vio代碼,因?yàn)?/SPAN>mysql的網(wǎng)絡(luò)處理底層都是經(jīng)過(guò)vio的操作

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

poll 超時(shí):

setsockopt 超時(shí):

基本上到這里就基本能夠解決PHP在針對(duì)MySQL讀寫(xiě)查詢(xún)操作超時(shí)的處理了,希望對(duì)你有幫助。
heiyeluren的blog

相關(guān)文章

  • MySQL報(bào)1366錯(cuò)誤的原因及解決

    MySQL報(bào)1366錯(cuò)誤的原因及解決

    SQL Error1366是一個(gè)常見(jiàn)的 MySQL 錯(cuò)誤,主要成因是數(shù)據(jù)類(lèi)型不匹配或數(shù)據(jù)超出了范圍,本文主要介紹了MySQL報(bào)1366錯(cuò)誤的原因及解決,感興趣的可以了解一下
    2024-02-02
  • mysql導(dǎo)入sql文件命令和mysql遠(yuǎn)程登陸使用詳解

    mysql導(dǎo)入sql文件命令和mysql遠(yuǎn)程登陸使用詳解

    這篇文章主要介紹了mysql導(dǎo)入sql文件命令和mysql遠(yuǎn)程登陸使用詳解,需要的朋友可以參考下
    2014-04-04
  • mysql實(shí)現(xiàn)隨機(jī)查詢(xún)經(jīng)驗(yàn)談

    mysql實(shí)現(xiàn)隨機(jī)查詢(xún)經(jīng)驗(yàn)談

    官方文檔中進(jìn)行說(shuō)明:Order By和RAND()連用,會(huì)多次掃描表,導(dǎo)致速度變慢,下面看下一些測(cè)試詳解
    2013-10-10
  • MySQL面試題講解之如何設(shè)置Hash索引

    MySQL面試題講解之如何設(shè)置Hash索引

    今天研究下mysql中索引,首先我應(yīng)該知道的是,mysql中不同存儲(chǔ)引擎的索引工作方式不一樣,并且不是所有的存儲(chǔ)引擎都支持所有類(lèi)型的索引。即使多個(gè)存儲(chǔ)引擎支持同一種類(lèi)型的索引,那么他們的實(shí)現(xiàn)原理也是不同的,本文將講解Hash索引該如何設(shè)置
    2021-10-10
  • centos7環(huán)境下二進(jìn)制安裝包安裝 mysql5.6的方法詳解

    centos7環(huán)境下二進(jìn)制安裝包安裝 mysql5.6的方法詳解

    這篇文章主要介紹了centos7環(huán)境下二進(jìn)制安裝包安裝 mysql5.6的方法,詳細(xì)分析了centos7環(huán)境下使用二進(jìn)制安裝包安裝 mysql5.6的具體步驟、相關(guān)命令、配置方法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • MySQL?根據(jù)表名稱(chēng)生成完整select語(yǔ)句詳情

    MySQL?根據(jù)表名稱(chēng)生成完整select語(yǔ)句詳情

    這篇文章主要介紹了MySQL?根據(jù)表名稱(chēng)生成完整select語(yǔ)句,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • MYSQL導(dǎo)入導(dǎo)出sql文件簡(jiǎn)析

    MYSQL導(dǎo)入導(dǎo)出sql文件簡(jiǎn)析

    這篇文章主要介紹了MYSQL導(dǎo)入導(dǎo)出.sql文件的相關(guān)資料,內(nèi)容包括MYSQL的命令行模式的設(shè)置、命令行進(jìn)入MYSQL的方法、數(shù)據(jù)庫(kù)導(dǎo)出數(shù)據(jù)庫(kù)文件、從外部文件導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫(kù),感興趣的小伙伴們可以參考一下
    2016-04-04
  • mysql中secure_file_priv=不生效問(wèn)題及解決

    mysql中secure_file_priv=不生效問(wèn)題及解決

    這篇文章主要介紹了mysql中secure_file_priv=不生效問(wèn)題及解決方案,以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家,
    2024-01-01
  • 淺析MySQL顯式類(lèi)型轉(zhuǎn)換

    淺析MySQL顯式類(lèi)型轉(zhuǎn)換

    這篇文章主要介紹了MySQL顯式類(lèi)型轉(zhuǎn)換的基礎(chǔ)知識(shí),通過(guò)實(shí)例給出了分析結(jié)果,一起學(xué)習(xí)下吧。
    2017-12-12
  • MySQL數(shù)據(jù)庫(kù)中null的知識(shí)點(diǎn)總結(jié)

    MySQL數(shù)據(jù)庫(kù)中null的知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于MySQL數(shù)據(jù)庫(kù)null的知識(shí)點(diǎn)以及相關(guān)實(shí)例,需要的朋友們可以學(xué)習(xí)下。
    2019-10-10

最新評(píng)論