繁体   English   中英

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

[英]PHP pdo-mysql timeouts on 2000sec(too long!)

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

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


环境

  • PHP7.0.16
  • 亚马逊极光
  • 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             |
+---------------------------------+-------------------+
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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM