【问题标题】:What is the best way to handle "Warning: mysql_connect(): Too many connections" with Kohana 3?使用 Kohana 3 处理“警告:mysql_connect():连接太多”的最佳方法是什么?
【发布时间】:2010-11-15 23:50:35
【问题描述】:

我有一个 Web 应用程序,公司使用它来记录员工的工作。

很多人经常同时登录。

应用程序在共享主机上运行。

我有时会收到...

警告:mysql_connect() [function.mysql-connect]:连接太多

这会让更多的错误级联...比如mysql_select_db()、mysql_error()、mysql_errnon() 的错误,最后是未捕获的Database_Eexception。

当我运行我的主请求时,我将它包装在一个 try 中并捕获任何异常并显示一个 not found 页面。这是因为如果找不到资源(尽管路由可能有效),我的控制器通常会抛出异常,例如http://example.com/products/30 是有效路线,但产品 #30 不存在。

处理太多连接的最佳方法是什么?理想情况下,我想单独捕获该异常,然后显示一个漂亮的页面,通知员工在 5 分钟后重试。

在application/bootstrap.php 中运行我的主要请求的代码如下所示...

$request = Request::instance();

try {
    $request->execute();
} catch (Exception $e) {

    if (Kohana::$environment === Kohana::DEVELOPMENT) throw $e;

    // Log the error
    Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));

    // Create a 404 response
    $request->status = 404;
    $request->response = Request::factory(Route::get('catch_all')->uri(array('path' => 'errors/404')))->execute();
}

$request->send_headers();
echo $request->response;

感谢您的帮助!

【问题讨论】:

    标签: php exception-handling kohana kohana-3


    【解决方案1】:

    我刚刚创建了这样的文件来处理所有错误:

    <?php
    
    class Kohana extends Kohana_Core
    {
      /**
       * Redirect to custom exception_handler
       */
      public static function exception_handler(Exception $e)
      {
        if (Kohana::DEVELOPMENT === Kohana::$environment)
        {
          // Pass to Kohana if we're in the development environment
          parent::exception_handler($e);
        }
        else
        {
          Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));
    
          // Default route
          $route = Route::url('default', array('controller' => 'error', 'action' => '404'));
    
          // Error sub-request.
          echo Request::factory($route)
            ->execute()
            ->send_headers()
            ->response;
        }
      }
    }
    

    目前这只是一个草图,但它可以给你一些想法。

    ps:我的引导程序没有修改

    【讨论】:

    • 也许你应该使用set_exception_handler()而不是改变系统核心类逻辑? bootstrap.php 中的 if (Kohana::DEVELOPMENT !== Kohana::$environment) {set_exception_handler(array('Kohana', 'exception_handler'));} 之类的东西
    • @biakaveron:什么原因?这是一个静态多态性——所以我刚刚重写了一个方法。
    【解决方案2】:

    在/etc/my.cnf 下的[mysqld] 部分添加:

    max_connections = 500
    

    然后要么在 MySQL 中执行SET GLOBAL max_connections = 500;,要么重启 MySQL。

    【讨论】:

      【解决方案3】:

      您可能希望首先检查一下您的 MySQL 系统属性 max_connections 当前设置为什么,并查看它如何比较使用要求。如果您没有很好地处理使用要求,那么您可能会比使用代码记录有关同时连接的数据做得更糟;或您的实时数据库分析工具来监控这一点。

      您还可以查看您的代码是否占用连接时间过长(即不必要地)并纠正此问题。或许调查一下连接池。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-17
        • 2014-01-25
        • 1970-01-01
        • 2022-01-06
        • 2016-05-26
        • 1970-01-01
        • 2019-10-18
        • 1970-01-01
        相关资源
        最近更新 更多