信推网

PHP访问MySQL数据库,设定查询连接超时处理时间

 

PHP连接MySQL主要是使用Mysql提供的 libmysqlclient 的客户端库,同时也延伸出来 mysql 和  mysqli 两套PHP的扩展,相对来说 mysqli 比 mysql 更好,更稳定。 copyright xjjgjt

目前两个客户端扩展库连接超时可以设置选项来操作,比如mysqli: xjjtjt.cn

<?php
//创建对象
$mysqli = mysqli_init(); 本文来自信推网xjjtjt.cn

//设置超时选项
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); copyright xjjgjt

//连接
$mysqli->real_connect('localhost', 'my_user', 'my_password', 'world'); 内容来自xjjgjt.cn

//如果超时或者其他连接失败打印错误信息
if (mysqli_connect_errno()) {
    printf("Connect failed: %s/n", mysqli_connect_error());
    exit();
}
//成功输出连接信息
printf ("Connection: %s/n.", $mysqli->host_info); 来自信推网xjjtjt.cn

$mysqli->close();
?>

xjjtjt.cn

这个是连接超时,但是有些时候我们需要查询读写超时,比如说我们一个数据库压力很大,或者连接很多,那么数据库查询就很缓慢,但是我希望某些不重要的数据,比如说文章点击数这种如果查询超时了就不显示,至少能够保证主体页面正确显示,但是查遍PHP手册没有发现这个操作选项或者函数。

copyright xjjgjt

手册里只有这么四个选项

来自信推网xjjtjt.cn

本文来自信推网xjjtjt.cn

跟踪 mysqli 的扩展源代码发现它底层调用的是 libmysqlclient 的 mysql_options:

内容来自xjjgjt.cn

php-5.2.8/ext/mysqli/mysqli_api.c

来自信推网xjjtjt.cn

本文来自信推网xjjtjt.cn

并且在mysqli的PHP扩展中就只导出了几个变量: 本文来自信推网xjjtjt.cn

php-5.2.8/ext/mysqli/mysqli.c

信推网,北京网络营销

来自信推网xjjtjt.cn

大概看了一下 libmysqlclient 的代码,发现其实它自带是有读写超时设置的: copyright xjjgjt

mysql-5.1.30/sql-common/client.c 信推网,北京网络营销

来自信推网xjjtjt.cn

因为它自己定义了很多操作选项,只是php扩展里没有:

信推网,北京网络营销

mysql-5.1.30/include/mysql.h

来自信推网xjjtjt.cn

xjjtjt.cn

看看mysql中的读写超时是如何实现的:

内容来自xjjgjt.cn

mysql-5.1.30/sql-common/client.c xjjtjt.cn

信推网,北京网络营销

信推网,北京网络营销

读写超时真正操作的地方,超时处理这里重试了两次,还是写死了: 信推网,北京网络营销

mysql-5.1.30/sql/net_serv.cc

copyright xjjgjt

内容来自xjjgjt.cn

来自信推网xjjtjt.cn

现在基本得出了结论: xjjtjt.cn

现在我们来看看如果我们自己要设置超时,我们自己压入 MYSQL_OPT_READ_TIMEOUT 也是可以达到读写超时效果的,写一段代码来测试一下:

copyright xjjgjt

<?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);
}

copyright xjjgjt

//设置超时
$mysqli = mysqli_init();
$mysqli->options(MYSQL_OPT_READ_TIMEOUT, 3);
$mysqli->options(MYSQL_OPT_WRITE_TIMEOUT, 1);

来自信推网xjjtjt.cn

//连接数据库
$mysqli->real_connect("localhost", "root", "root", "test");
if (mysqli_connect_errno()) {
   printf("Connect failed: %s/n", mysqli_connect_error());
   exit();
}

本文来自信推网xjjtjt.cn

//执行查询 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";
} 本文来自信推网xjjtjt.cn

//执行查询 sleep 9秒会超时
if (!($res=$mysqli->query('select sleep(9)'))) {
    echo "query2 error: ". $mysqli->error ."/n";
} else {
    echo "Query2: query success/n";
} copyright xjjgjt

$mysqli->close();
echo "close mysql connection/n";
?> 信推网,北京网络营销

查看上面代码的执行结果,验证了上面的观点,第一个查询成功了,第二个查询连接被断开了:

xjjtjt.cn

内容来自xjjgjt.cn

如果需要修改这个秒级别的超时,比如改成毫秒级别的超时,只能两个地方修改:

来自信推网xjjtjt.cn

1.  修改客户端,比如 mysqli 的 query 代码,加入定时器,超时则返回

信推网,北京网络营销

2.  修改 Mysql 中的vio代码,因为mysql的网络处理底层都是经过vio的操作 来自信推网xjjtjt.cn

MySQL相关的vio代码:

内容来自xjjgjt.cn

poll 超时: 内容来自xjjgjt.cn

本文来自信推网xjjtjt.cn

setsockopt 超时: 本文来自信推网xjjtjt.cn

xjjtjt.cn

基本上到这里就基本能够解决PHP在针对MySQL读写查询操作超时的处理了,希望对你有帮助。

来自信推网xjjtjt.cn

按照上面查看代码来看,目前PHP针对MySQL查询超时以下限制: 来自信推网xjjtjt.cn

1. 超时设置单位为秒,最少配置1秒 copyright xjjgjt

2. 但mysql底层的read会重试两次,所以实际会是 3 秒

本文来自信推网xjjtjt.cn

重试两次 + 自身一次 = 3倍超时时间。 xjjtjt.cn

那么就是说最少超时时间是3秒,不会低于这个值,对于大部分应用来说可以接受,但是对于小部分应用需要优化。 信推网,北京网络营销

责任编辑:admin

相关推荐

网友评论:

验证码: 点击我更换图片

评论仅代表网友看法!请遵守阆中地方相关法律!
返回 信推网

本周排行

本月热点

百度优化 SEO优化 网站优化 淘宝商城 PHP PDF 百度搜索营销 北京网络营销 网站优化排名 外部链接 Javascript 北京网络营销策划 专业删帖公司 百度收录快 phpmailer B2C Ajax BaiduSpider 关键词优化 企业网络营销模式 网页的跳出率 网络营销方式 SEO 产品设计 网络推广 网络传媒 产品营销 北京seo优化 媒体营销模式 dreamweaver 垂直型网站 电子商务资源 phpmailer多收件 上海网站关键词排名 电子商务 保健品 营销模式 垂直B2C网站 负面信息 在线配色 代运营公司 整合策略 信息化技术 php访问mysql 北京网络推广 网络营销 百度快照更新 错误代码-2146893 搜索引擎偏见 用户体验 电子商务平台 网站开发 电子商务大军 整合营销 网络营销推广 网页开发者 网络推广策划 百度排名优化 百度新闻源 北京百度优化 网站地图 配色 百度搜索平台 黑客攻击 关键词竞争性 SEO作弊 中国电子商务 企业电子商务 百度掌门人 卓越亚马逊 搜索引擎优化 浏览器加载 群发供求消息 新闻自由 搜索引擎优化技术 Chrome插件 北京SEO技术 电子商务企业 网站被k 电子商务的发展 搜索引擎 网站建设 信息化发展 DDOS攻击 网站优化,网站建设 前端 支付宝官方 b2c电子商务 微博营销 马云 网络经销商 搜索引擎上做优化 个性化 页面性能优化 团购网站 前端开发 网站设计 虚拟机实施攻击 在线营销 网站作弊 phpmailer群发
关于信推 | 关于网邦 | 服务条款 | 广告服务 | 信推招聘 | 信推服务 | 客服中心 |
Copyright © 2010 - 2015 xjjgjt. All Rights Reserved
信推网 版权所有,信推网属西安网邦网络科技有限公司旗下品牌.联系电话029-87872554