php配置中mysql配置_PHP设置连接mysql超时时间

本文将分别介绍PHP的mysql扩展, mysqli扩展, mysql_pdo扩展,mysqlnd扩展和libmysql 这些名词的含义。以及他们之间的关系。最后再介绍如何配置mysql的超时时间。

一、mysql,mysqli,mysql_pdo,mysqlnd扩展

当考虑连接到MySQL数据库服务器的时候,有三种主要的API可供选择:

PHP的MySQL扩展

PHP的mysqli扩展

PHP数据对象(PDO)

三者都有各自的优缺点。下面的讨论就是为了对每种API的关键方面给出一个简短的介绍。

什么是PHP的MySQL扩展?(废弃)

这是设计开发允许PHP应用与MySQL数据库交互的早期扩展。*mysql*扩展提供了一个面向过程 的接口,并且是针对MySQL4.1.3或更早版本设计的。因此,这个扩展虽然可以与MySQL4.1.3或更新的数据库服务端 进行交互,但并不支持后期MySQL服务端提供的一些特性。

什么是PHP的mysql_pdo扩展

*PHP 数据对象* (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。 注意利用 PDO 扩展自身并不能实现任何数据库功能;必须使用一个 具体数据库的 PDO 驱动 来访问数据库服务。

PDO 提供了一个 *数据访问* 抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 PDO *不*提供 *数据库* 抽象层;它不会重写 SQL,也不会模拟缺失的特性。如果需要的话,应该使用一个成熟的抽象层。

从 PHP 5.1 开始附带了 PDO,在 PHP 5.0 中是作为一个 PECL 扩展使用。 PDO 需要PHP 5 核心的新 OO 特性,因此不能在较早版本的 PHP 上运行。

什么是PHP的mysqli扩展

*mysqli*扩展,我们有时称之为MySQL*增强*扩展,可以用于使用 MySQL4.1.3或更新版本中新的高级特性。*mysqli*扩展在PHP 5及以后版本中包含。

*mysqli*扩展有一系列的优势,相对于*mysql*扩展的提升主要有:

面向对象接口

prepared语句支持(译注:关于prepare请参阅mysql相关文档)

多语句执行支持

事务支持

增强的调试能力

嵌入式服务支持

什么是PHP的mysqlnd扩展

*为了与MySQL数据库服务端进行交互,*mysql*扩展,*mysqli*扩展, PDO MySQL驱动都使用了实现了必要的协议的底层库。以前,可用的库只有MySQL客户端库和*libmysql。

然而,*libmysql*包含的接口没有针对与PHP的应用交互进行优化,*libmysql* 是早期为C应用程序设计的。基于这个原因,MySQL Native驱动*mysqlnd*,作为*libmysql*的一个 针对PHP应用的修改版本被开发。

*mysql*,*mysqli*以及PDO Mysql驱动都可以各自配置使用 *libmysql*或者*mysqlnd*。*mysqlnd*作为一个专门设计 用于PHP系统的库,它在内存和速度上都比*libmysql*有很大提升。非常希望你去尝试这些提升。

二、如何设置php连接mysql的超时时间

php连接mysql的超时可以分为三种:

连接超时

读超时

写超时

因为php连接mysql当前有两种连接方式,libmysql和mysqlnd(推荐)。

首先libmysql

在libmysql这个底层库中,提供了MYSQL_OPT_CONNECT_TIMEOUT、MYSQL_OPT_READ_TIMEOUT、MYSQL_OPT_WRITE_TIME设置项的,并且提供了相关的API。

源码位置

mysql-VERSION/sql-common/client.c 3020行

MYSQL_OPT_CONNECT_TIMEOUT可以直接设置。但MYSQL_OPT_READ_TIMEOUT、MYSQL_OPT_WRITE_TIME因为mysqli没有导入这两个常量。所以需要查看MySQL的源码,得到MYSQL_OPT_READ_TIMEOUT、MYSQL_OPT_WRITE_TIME的实际值,然后直接调用mysql_option。但是mysql_pdo是写死的,所以没有任何办法设置MYSQL_OPT_READ_TIMEOUT、MYSQL_OPT_WRITE_TIME。

源码位置:

mysql-VERSION/include/mysql.h 160行

但是MYSQL_OPT_READ_TIMEOUT在mysql5.6版本以及之前(我们线上用的5.6),这个参数有以下三个限制。

只能在TCP/IP协议下工作

MySQL server版本必须大于5.1.2

只能在windows下生效。

其次是mysqlnd

对于libmysql和mysqlnd来讲,他们都是mysql、mysqli、mysqlpdo的底层库,这三个扩展才是对外暴露api的,所以说,他们对于这三种超时的支持,从代码层面是一样的。

但是对于MYSQL_OPT_READ_TIMEOUT,mysqlnd在php.ini层面多处配置

mysqlnd.net_read_timeout

这个配置会在执行耗时较长的sql时生效,并且报错“2006-MySQL Server has gone away”。

这个参数和libmysql的MYSQL_OPT_READ_TIMEOUT是极为相似的。但是MYSQL_OPT_READ_TIMEOUT这个参数是有使用场景的,上一小结已经阐述。

MYSQL_OPT_CONNECT_TIMEOUT和MYSQL_OPT_WRITE_TIME和libmysql是相同的。

总而言之

推荐方案

使用mysqlnd

配置 mysqlnd.net_read_time

引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我很抱歉,但是我是一个语言模型,无法提供具体的编程支持和解决方案。不过,我可以为你提供相关的参考资料: 在 PHP PDO ,可以使用 PDO::ATTR_TIMEOUT 属性来设置连接超时。具体的代码示例如下: ``` <?php $dsn = 'mysql:host=localhost;dbname=testdb'; $username = 'username'; $password = 'password'; $options = [ PDO::ATTR_TIMEOUT => 30 // 设置连接超时时间为 30 秒 ]; try { $pdo = new PDO($dsn, $username, $password, $options); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); } ?> ``` 至于 set_socket_option 函数,其实是一个 Socket 函数,不是 PDO 函数。该函数是用来设置 Socket 连接选项的,而不是用来设置连接超时时间的。如果你需要使用 Socket 函数来设置连接超时,可以参考以下的代码示例: ``` <?php $host = 'localhost'; $port = 80; $timeout = 10; // 设置连接超时时间为 10 秒 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => $timeout, 'usec' => 0]); // 设置接收超时时间 socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ['sec' => $timeout, 'usec' => 0]); // 设置发送超时时间 $result = socket_connect($socket, $host, $port); if ($result === false) { echo 'Connection failed: ' . socket_strerror(socket_last_error()); } else { echo 'Connection succeeded'; } socket_close($socket); ?> ``` 希望这些资料能够帮助到你解决问题。如果你有其他问题,可以继续向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值