2010-11-15 77 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。

相關問題