Magento 2.4.2调用API出现Connection timed out错误,该如何解决?
解决Magento调用API时Azure MySQL连接超时问题
排查Azure MySQL端配置
- 检查防火墙规则:确认Magento服务器的公网IP已加入Azure MySQL的允许访问列表,包括生产环境固定IP和测试时的临时IP。注意Azure MySQL防火墙规则存在优先级,避免冲突的拒绝规则拦截连接。
- 监控连接数上限:Azure MySQL不同服务层级有连接数限制(如Basic tier默认50个),执行
SHOW GLOBAL STATUS LIKE 'Threads_connected';查询当前连接数,若接近上限,可升级服务层级或优化Magento连接池配置。 - 查看服务器资源负载:在Azure门户查看MySQL服务器的CPU、内存、磁盘使用率,排查是否有突发资源耗尽情况(如磁盘IO过高),这类情况会直接引发连接超时。
优化Magento数据库连接配置
- 调整连接池参数:修改
app/etc/env.php中的db节点配置,增加连接池大小、超时设置等参数示例:
'db' => [ 'table_prefix' => '', 'connection' => [ 'default' => [ 'host' => '<你的Azure MySQL主机名>', 'dbname' => '<数据库名>', 'username' => '<用户名>', 'password' => '<密码>', 'active' => '1', 'pool_size' => 10, // 根据服务器资源合理调整 'initStatements' => 'SET NAMES utf8mb4; SET time_zone = "+00:00";', 'driver_options' => [ PDO::ATTR_TIMEOUT => 10, // 设置连接超时时间(秒) PDO::MYSQL_ATTR_READ_DEFAULT_FILE => '/etc/my.cnf' ] ] ] ]
- 启用持久连接:在
env.php的数据库连接配置中添加'persistent' => true,减少重复创建连接的开销,但需注意总连接数不超过Azure MySQL的上限。 - 自动释放无效连接:在Azure门户的MySQL服务器参数中,调整
wait_timeout和interactive_timeout为300秒左右,让超时未使用的连接自动释放,避免连接池耗尽。
网络层面排查
- 测试连通性稳定性:在Magento服务器上持续执行
telnet <Azure MySQL主机名> 3306或nc -zv <Azure MySQL主机名> 3306,检查是否存在间歇性端口不通或丢包情况。 - 验证DNS解析:确认Magento服务器能正确解析Azure MySQL的主机名,可尝试刷新DNS缓存或手动指定可靠的DNS服务器,避免解析错误导致连接失败。
- 检查VNet配置(若使用):如果Magento和Azure MySQL通过虚拟网络集成,确认虚拟网络 peering、路由表配置正确,无网络隔离或路由异常问题。
代码与API调用优化
- 精简数据库查询:检查API对应的Magento业务代码,合并重复查询、移除不必要的数据库请求,同时启用Redis等缓存机制,减少数据库访问频率。
- 添加连接重试逻辑:在API调用的代码中针对SQL连接超时异常,添加有限次数的重试机制(如重试2-3次),避免单次连接失败导致整个请求挂起。
内容的提问来源于stack exchange,提问作者PRINCE KUMAR
相关产品推荐
相关产品推荐

