代码之家  ›  专栏  ›  技术社区  ›  alex

用Kohana 3处理“警告:mysql_connect():连接太多”的最佳方法是什么?

  •  1
  • alex  · 技术社区  · 14 年前

    我有一个网络应用程序,公司用来记录员工的工作。

    很多人经常一次登录。

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

    我有时会收到。。。

    警告:mysql_connect()[函数.mysql connect]:连接太多

    然后让更多的错误层叠。。。喜欢错误 mysql_select_db() , mysql_error() , mysql_errnon() 最后是意外 Database_Eexception

    当我运行主请求时,我将其包装为 try 捕获任何异常并显示 找不到 第页。这是因为通常我的控制器会在找不到资源时抛出异常(尽管路由可能是有效的)。 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;
    

    谢谢你的帮助!

    3 回复  |  直到 14 年前
        1
  •  1
  •   zerkms    14 年前

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

    <?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:我的引导程序没有修改

        2
  •  1
  •   Bruno Vieira    12 年前

    /etc/my.cnf [mysqld] 章节添加:

    max_connections = 500
    

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

        3
  •  1
  •   alex    12 年前

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

    您还可以查看您的代码是否占用连接太长时间(即,不必要地),并更正此问题。也许可以调查连接池。