如何获取通过$mysqli->options()设置的各类配置选项值?
获取MySQLi已设置选项的当前值
好问题!我之前也碰到过类似的困惑——MySQLi扩展确实没有提供直接获取MYSQLI_OPT_CONNECT_TIMEOUT、MYSQLI_OPT_SSL_VERIFY_SERVER_CERT这类选项当前值的内置方法,但我们可以通过几种间接方式来解决这个问题:
1. 预先记录配置值(通用方案)
这是最可靠的方法:当你调用$mysqli->options()设置选项时,同时把配置值保存到一个变量、配置类或者全局数组里,后续需要读取时直接引用这个记录即可。比如:
// 保存配置值 $mysqliOptions = [ MYSQLI_OPT_CONNECT_TIMEOUT => 10, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT => false, MYSQLI_OPT_LOCAL_INFILE => true ]; // 应用配置 foreach ($mysqliOptions as $option => $value) { $mysqli->options($option, $value); } // 后续需要读取时直接用$mysqliOptions echo "连接超时当前值: " . $mysqliOptions[MYSQLI_OPT_CONNECT_TIMEOUT];
这种方式简单直接,完全不需要依赖MySQLi扩展的额外接口。
2. 通过MySQL系统变量查询对应选项
对于部分和MySQL服务器系统变量绑定的选项,比如MYSQLI_OPT_LOCAL_INFILE,可以通过执行SQL查询来获取当前生效的值:
// 查询LOCAL_INFILE的当前值 $result = $mysqli->query("SELECT @@local_infile"); if ($result) { $row = $result->fetch_row(); echo "LOCAL_INFILE 当前值: " . ($row[0] ? "开启" : "关闭"); $result->free(); }
3. 间接验证连接类选项(比如超时、SSL验证)
像MYSQLI_OPT_CONNECT_TIMEOUT这类连接阶段生效的选项,一旦连接建立后就没法直接读取,但可以通过测试来验证:
- 连接超时:可以尝试发起一个到无效IP/端口的连接,记录耗时是否符合你设置的超时值。
- SSL验证:可以用
mysqli_get_ssl_cipher()检查当前连接是否使用了SSL加密,但没法直接确认是否验证了服务器证书。如果需要精确确认,还是建议用前面提到的“预先记录配置值”的方案。
为什么get_object_vars($mysqli)看不到这些选项?
因为get_object_vars()只能获取mysqli对象公开的属性,而这些选项属于扩展内部维护的配置,并没有暴露为对象的公共属性,所以无法通过这种方式读取。
内容的提问来源于stack exchange,提问作者Stackoverflow
相关产品推荐
相关产品推荐

