【问题标题】:PHP Check slave status without mysql_connect timeout issuesPHP检查从属状态没有mysql_connect超时问题
【发布时间】:2011-02-20 13:18:30
【问题描述】:

我有一个网络应用程序,它有一个主 mysql 数据库和四个从属数据库。我想处理来自奴隶的所有(或几乎所有)只读(SELECT)查询。我们的负载均衡器会自动将用户发送到其中一台从属机器,因为它们也在运行 Apache/PHP 并提供网页服务。我正在使用包含文件来设置与数据库的连接,例如:

//for master server (i.e. - UPDATE/INSERT/DELETE statements)
$Host = "10.0.0.x";
$User = "xx";
$Password = "xx";
$Link = mysql_connect( $Host, $User, $Password );
if( !$Link ) )
{
   die( "Master database is currently unavailable.  Please try again later." );
}

//this connection can be used for READ-ONLY (i.e. - SELECT statements) on the localhost
$Host_Local = "localhost";
$User_Local = "xx";
$Password_Local = "xx";
$Link_Local = mysql_connect( $Host_Local, $User_Local, $Password_Local );

//fail back to master if slave db is down
if( !$Link_Local ) )
{
   $Link_Local = mysql_connect( $Host, $User, $Password );
}

然后我将 $Link 用于所有更新查询并使用 $Link_Local 作为 SELECT 语句的连接。一切正常,直到从服务器数据库关闭。如果本地数据库已关闭,则 $Link_Local = mysql_connect() 调用至少需要 30 秒才能放弃尝试连接到本地主机并返回脚本。这会导致页面服务大量积压,并且基本上会关闭系统(由于响应时间极慢)。

有谁知道通过 PHP 处理与从服务器的连接的更好方法?或者,是否有某种超时功能可用于在 2-3 秒后停止 mysql_connect 调用?

感谢您的帮助。我搜索了其他 mysql_connect 线程,但没有看到任何解决此问题的线程。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    在 php.ini 的 [MySQL] 部分下,设置此值:

    ; Maximum time (in secondes) for connect timeout. -1 means no limit
    mysql.connect_timeout = 1
    

    如果你有 4 个 db 从站,那么你应该有一个相当不错的网络,可以在 1 秒内响应一个 db 请求。相信您的服务器构建。

    那就把你的奴隶修好!!这是个问题!!

    最后,不是每个页面请求都需要指向主数据库的链接。您应该尝试放置一个连接管理器类,该类将根据查询类型决定使用哪个数据库。这也会减少与主数据库的连接数。

    【讨论】:

    • 太棒了!谢谢(你的)信息。我将研究连接器类。我仍在学习 PHP 的 OO 方面,所以让课程工作可能是个问题!不过,您的回答非常适合我目前的情况。
    • 我想给你点赞,但系统说我必须至少有 15 个声望点!对不起!
    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 2022-01-07
    • 2017-02-28
    • 1970-01-01
    • 2020-01-30
    相关资源
    最近更新 更多