2000秒的PHP pdo-mysql超时(太长了!)

时间:2017-06-08 06:21:19

标签: php mysql amazon-web-services pdo

在高流量环境中,某些PHP会话大约需要30分钟,最终会在PDO构造函数中显示PDOException: SQLSTATE[HY000] [2002] connection timed out
根据New Relic的追踪,等待时间仅为2000秒 漫长的等待似乎PHP已经达到了MySQL服务器,但连接建立已经停止了一半。

我想将等待时间缩短到30秒,但我找不到任何配置设置。 有什么建议吗?

环境

  • PHP7.0.16
  • Amazon Aurora
  • AWS Ubuntu Linux

我测试但没有工作

  • 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             |
+---------------------------------+-------------------+

1 个答案:

答案 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;
}