【问题标题】:Can I set distinct connection vs. query timeout values for MySQL on Linux?我可以在 Linux 上为 MySQL 设置不同的连接与查询超时值吗?
【发布时间】:2011-11-29 22:58:29
【问题描述】:

我希望 MySQL 查询有一个较长的超时,但初始连接超时很短。例如。如果一个进程在 3 秒内无法连接,假设服务器可能过载并立即失败(而不是排队 httpd 连接),但如果 MySQL 连接很快发生,请给查询足够的时间来完成。

虽然我假设我可以通过 MySQL 的配置指定服务器范围的连接超时,但在 PHP 中配置似乎是不可能的,因为正如manual 所说,“在 Linux 上 [mysql.connect_timeout] 设置也用于等待获取服务器的第一个答案。”

“第一个答案”是指第一个查询的结果吗? SET NAMES 'utf8' 算不算?

这是否暗示mysql.connect_timeout 适用于Linux 上的所有 查询?

【问题讨论】:

    标签: php mysql timeout database-connection


    【解决方案1】:

    查看 PHP 文档页面:

    http://www.php.net/manual/en/mysqli.real-connect.php

    例子#1

    编辑 1

    一旦您连接到 mysql,客户端就会收到一个“横幅”,服务器会在其中声明他的版本和其他内容。

    “在 Linux 上 [mysql.connect_timeout] 设置也用于等待来自服务器的第一个答复。”意味着客户端使用相同的连接超时等待此“横幅通信”。

    在我的测试中,我设置了 4 秒的超时时间(请参阅投票中的 4000):

    connect(3, {sa_family=AF_INET, sin_port=htons(3306), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
    fcntl64(3, F_SETFL, O_RDWR)             = 0
    poll([{fd=3, events=POLLIN|POLLPRI}], 1, **4000**) = 1 ([{fd=3, revents=POLLIN}])
    setsockopt(3, SOL_SOCKET, SO_RCVTIMEO, "\2003\341\1\0\0\0\0", 8) = 0
    setsockopt(3, SOL_SOCKET, SO_SNDTIMEO, "\2003\341\1\0\0\0\0", 8) = 0
    setsockopt(3, SOL_IP, IP_TOS, [8], 4)   = 0
    setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0
    setsockopt(3, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
    poll([{fd=3, events=POLLIN}], 1, **4000**)  = 1 ([{fd=3, revents=POLLIN}])
    read(3, "4\0\0\0\n5.1.55"..., 16384) = 56
    

    我的服务器是5.1.55版本!

    简而言之:connection_timeout 与查询超时无关

    【讨论】:

    • 注意这是mysqli驱动。
    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多