【问题标题】:mysql connectionmysql连接
【发布时间】:2009-07-06 07:05:39
【问题描述】:

我用这段代码连接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 等。请帮助!!

【问题讨论】:

    标签: php mysql database-connection


    【解决方案1】:

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

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

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

    Artem 的建议也很中肯。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        您可以滚动自己的单例或从框架中获取一个,但根据您正在处理的内容,认为这可能有点矫枉过正。基本情况是这样的:

        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
        

        希望对您有所帮助!

        【讨论】:

          【解决方案4】:
          1. 不要对公众display errors,尤其是在生产中。

          2. 使用exceptions 而不是die

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

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

          【讨论】:

          • 前三个都是好主意,但与 OP 的问题并不真正相关。最后一个在一般情况下不是一个好主意,需要非常仔细地考虑,仅作为更大部署的一部分,并评估其所有警告。
          【解决方案5】:

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

          mysql_connect() 正在打开新连接而不是关闭旧连接。你可以使用 mysql_pconnect 来解决这个问题。 Take a look @ this function documentation of mysql pconnect

          【讨论】:

          • 使用 mysql_pconnect 几乎肯定只会让事情变得更糟,即使它不再需要它们也会挂在连接上。
          【解决方案6】:

          你也可以使用 mysql_pconnect:

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

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

          • 它将尝试重用一个打开的 连接是一样的。

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

          【讨论】:

            猜你喜欢
            • 2012-10-13
            • 2012-11-13
            • 2016-10-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多