0

我将此代码用于mysql连接

$con = mysql_connect("localhost:/var/lib/mysql/mysql.sock", "abc" , "xyz");
if (!$con)
{
    die('Could not connect: ');
}
mysql_select_db("database_name", $con);

我将此文件包含在我用于解析然后将数据存储在数据库中的每个 php 文件的顶部。现在,当原始站点关闭时,我的解析文件开始给出错误“警告:mysql_connect():/中的连接太多第 2 行的 home/clickindia/public_html/appuonline/db.php 无法连接:”

我应该怎么做才能从这些错误中拯救我的网站。你认为我应该使用 mysql_close($con); 但是如何以及在哪里???我在我的代码中使用 die 是正确的还是我应该使用 close 等。请帮助!

4

6 回答 6

1

这确实是一个系统管理员问题 - 您应该联系您的系统管理员。如果您有专用的 Web 主机和专用的数据库主机来管理其配置,则有两种明显的解决方案:

  1. 增加 max_connections
  2. 重新配置您的应用程序以减少消耗

在每个页面上连接的 Web 服务器可以使用很多。

于 2009-07-06T07:10:25.550 回答
1

你说你把这个连接代码“放在每个 php 文件的顶部”。

我的问题是:您是否在一个页面中使用了这些文件中的几个?

如果是这种情况,那么您应该只为一个页面打开一次连接。这可能是错误的解释。

Artem 的建议也很中肯。

于 2009-07-06T08:18:13.510 回答
1

您可能需要考虑围绕数据库访问包装一个单例。好处:

  • 您只能使用一个连接。
  • 只有在需要时才打开连接(而不是在每个页面上任意连接)。

您可以滚动自己的单例或从框架中获取一个,这可能会根据您正在处理的内容而过大。基础是这样的:

class DatabaseAccess {
     private static $instance;
     private $connection;

     //declare the constructor private so we can only use it in this class
     private function __construct( $host, $user, $pass, $db ) {
         $this->connection = mysql_connect( $host, $user, $pass );
         mysql_select_db( $db, $this->connection );
     }

     //provide access to a single instance
     public static function instance() {
         if ( ! isset( self::$instance ) ) {
             self::$instance = new DatabaseAccess('host', 'user', 'pass', 'db');
         }
         return self::$instance;
     }

     //functions to execute/query the db
     public function query( $query ) {
         return mysql_query( $query, $this->connection );
     }

}

如果我要走这条路,我可能会通过控制对 mysqli 实例的访问并直接使用它而不是包装 mysql_* 函数来做到这一点。您可以在 wikipedia 上找到有关单例模式的更多信息。

然后,您的应用程序将像这样使用该类:

$dba = DatabaseAccess::instance();
$result = $dba->query('select * from pages');
mysql_fetch_assoc($result);
//blah blah blah

希望有帮助!

于 2009-07-07T10:55:40.313 回答
0
  1. 不要向公众展示错误,尤其是在生产中。

  2. 使用异常而不是die.

  3. 优雅地处理你的失败——这与 #1 齐头并进。不要只是死 - 重定向到错误页面或显示临时“无法保存数据”消息。

  4. 如果可以,设置 MySQL 从属服务器并查询它们。复制将始终帮助您解决稳定性和单点故障(在一定程度上)。

于 2009-07-06T07:09:26.817 回答
0

mysql 对它可以提供给客户端的连接数有限制(在这种情况下是 php 客户端库)。

mysql_connect() 正在打开新连接而不是关闭旧连接。你可以使用 mysql_pconnect 来解决这个问题。看看@mysql pconnect的这个函数文档

于 2009-07-06T07:42:13.193 回答
0

你也可以使用 mysql_pconnect:

建立与 MySQL 服务器的持久连接。

mysql_pconnect() 的行为与 mysql_connect() 非常相似,但有两个主要区别。

  • 它将尝试重用相同的打开连接。

  • 它不会在脚本结束时关闭连接。

于 2009-07-07T11:00:13.130 回答