MySQL】
php中的mysql客户端都没有设置超时的选项,mysqli和mysql都没有,但是libmysql是提供超时选项的,只是我们在php中隐藏了而已。
那么如何在PHP中使用这个操作捏,就需要我们自己定义一些MySQL操作常量,主要涉及的常量有:
- MYSQL_OPT_READ_TIMEOUT=11;
- MYSQL_OPT_WRITE_TIMEOUT=12;
这两个,定义以后,可以使用 options 设置相应的值。
不过有个注意点,mysql内部实现:
1. 超时设置单位为秒,最少配置1秒
2. 但mysql底层的read会重试两次,所以实际会是 3 秒
重试两次 + 自身一次 = 3倍超时时间,那么就是说最少超时时间是3秒,不会低于这个值,对于大部分应用来说可以接受,但是对于小部分应用需要优化。
查看一个设置访问mysql超时的php实例:
- <?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);
- }
- //设置超时
- $mysqli = mysqli_init();
- $mysqli->options(MYSQL_OPT_READ_TIMEOUT, 3);
- $mysqli->options(MYSQL_OPT_WRITE_TIMEOUT, 1);
- //连接数据库
- $mysqli->real_connect("localhost", "root", "root", "test");
- if (mysqli_connect_errno()) {
- printf("Connect failed: %s/n", mysqli_connect_error());
- exit();
- }
- //执行查询 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";
- }
- //执行查询 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";
- ?>
延伸阅读:
http://blog.csdn.net/heiyeshuwu/article/details/5869813
PHP之友评论