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

时间:2010-11-15 23:50:35

标签: php exception-handling kohana kohana-3

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

很多人经常一次登录。

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

我有时会收到......

  

警告: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;

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您可能希望首先检查您的MySQL系统属性max_connections当前设置的内容,并了解如何比较使用要求。如果您没有很好地处理使用要求,那么您可能会比检测代码记录有关同时连接的数据更糟糕;或者你的实时数据库分析工具来监控它。

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

答案 1 :(得分: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:我的引导程序未被修改

答案 2 :(得分:1)

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

max_connections = 500

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