我有一个公司用来记录员工工作的网络应用程序。
很多人经常一次登录。
应用程序在共享主机上运行。
我有时会收到......
警告: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;
感谢您的帮助!
答案 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。