2010-11-15 66 views
1

我有一个公司用来记录员工工作的Web应用程序。什么是处理“警告:mysql_connect():与Kohana 3太多连接”的最佳方式是什么?

很多人经常登录。

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

我有时会收到...

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

,然后让更多的错误级联......像有错误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; 

感谢您的帮助!

回答

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:我的引导是不是[mysqld]部分添加下修改

+0

可能你应该使用'set_exception_handler()'而不是改变系统核心类逻辑?就像'if(Kohana :: DEVELOPMENT!== Kohana :: $ environment){set_exception_handler(array('Kohana','exception_handler'));}'in bootstrap.php – biakaveron 2010-11-16 08:13:35

+0

@biakaveron:为什么?它是一个静态多态 - 所以我只是重写一个方法。 – zerkms 2010-11-16 10:10:00

1

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

你也可以看看你的代码是否连接过久(即不必要),并纠正这一点。也许调查连接池。

1

/etc/my.cnf

max_connections = 500 

然后无论是在MySQL的执行SET GLOBAL max_connections = 500;或重启MySQL。

相关问题