在高流量环境中,某些PHP会话大约需要30分钟,最终会在PDO构造函数中显示PDOException: SQLSTATE[HY000] [2002] connection timed out
。
根据New Relic的追踪,等待时间仅为2000秒
漫长的等待似乎PHP已经达到了MySQL服务器,但连接建立已经停止了一半。
我想将等待时间缩短到30秒,但我找不到任何配置设置。 有什么建议吗?
环境
我测试但没有工作
set_time_limit(30)
ini_set("default_socket_timeout", 30)
new PDO($dsn, 'user', 'pass', [PDO::ATTR_TIMEOUT => 30])
pcntl_signal()
尝试中止PHP脚本的任何异步库
但是当主线程停在new PDO()
MySQL变量包含time
+---------------------------------+-------------------+
| Variable_name | Value |
+---------------------------------+-------------------+
| binlog_max_flush_queue_time | 0 |
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| flush_time | 0 |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_old_blocks_time | 1000 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| long_query_time | 0.010000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 3600 |
| slow_launch_time | 2 |
| timed_mutexes | OFF |
| wait_timeout | 28800 |
+---------------------------------+-------------------+
答案 0 :(得分:-1)
try {
$pdo = new PDO("mysql:host={$db_host};port={$db_port};dbname={$db_name};charset={$db_charset}", $db_user, $db_pass, [
PDO::ATTR_TIMEOUT=>2, // ATTR_TIMEOUT here means connection timeout, in senconds
]);
} catch(PDOException $e) {
echo $e->getMessage;
}