从PHP连接MySQL的最有效方法?

时间:2011-03-31 12:26:31

标签: php mysql performance

使用PHP连接MySQL是很常见的。最常见的方法是这样的:

$sqlcon=mysql_connect("localhost","user","pw");
mysql_select_db('database');
$sqlcomm=mysql_query("SELECT id FROM bd");
while($row=mysql_fetch_row($sqlcomm))
{
   //do something
}
mysql_close($sqlcon);

我认为这是连接MySQL的最快直接方式。但是在项目中,php脚本中会有太多MySQL连接,我们应该使用“mysql_connect(”localhost“,”user“,”pw“)”代码在每个php脚本中连接MySQL。因此,您希望在文件中构建MySQL类或函数来连接MySQL:

function connect( $query )
{
   $sqlcon=mysql_connect("localhost","user","pw");
   mysql_select_db('database');
   $sqlcomm=mysql_query($query);
   while($row=mysql_fetch_row($sqlcomm))
   {
       //do something.
   }
   mysql_close($sqlcon);
}

然后使用include()进行连接。

include('connect.php');
$data = connect('SELECT id from db');

好的,这样,代码看起来更好。但是使用include()函数会让PHP读取并执行其他php脚本文件,再次对硬盘进行I / O操作,它也会降低性能

如果网页是100PV / s,php将在第一种方法中读取并执行一个PHP脚本100次/秒,但是在这种方法中读取和执行php脚本200次/秒!

我这里只展示一个查询的简单示例。尝试映像高网络多查询环境。

任何人都有其他更好的方法让MySQL连接更容易,更有效率吗?

6 个答案:

答案 0 :(得分:3)

你真的不需要打开那么多连接。您只需在脚本开头打开1个连接(生成<body>之前,让我们说),然后在脚本结束时关闭它(生成</body>之后,让我们说)。这只剩下一个连接。在这两者之间,您可以根据需要执行任意数量的查询。

答案 1 :(得分:1)

您是否看过使用PDO?它做连接池和什么不是但不限于mysql ...

答案 2 :(得分:1)

查看Dibi

答案 3 :(得分:0)

您使用一个打开MySQL连接的类(用户名/密码/ db继承自某种配置文件),当您查询数据库时,它会建立连接。 这导致您使用使用某些编程范例的框架,等等。

此外,您不必担心性能下降,因为您要包含文件。这应该是你最不担心的事情。操作系统正在做许多IO,而不仅仅是硬盘,你的1文件包含不会引人注意。

如果你问的是在没有使用mysql_,mysqli_,odbc或PDO的情况下是否有更有效的连接MySQL数据库的方法 - 不,那就没有了。

答案 4 :(得分:0)

表现缺乏是微不足道的。你必须更关心代码结构的正确方法而不是性能。

您可以将主机/用户/密码转换为常量,并将其包含在您需要的任何位置,您可以使用一些设计模式来存储数据库对象。像Singleton或Factory。它们将为您的系统提供更大的灵活性。

答案 5 :(得分:-1)

  

但是在项目中,MySQL连接太多,我们每次都应该输入用户名和密码代码

这句话有很多问题 - 即使你不算语法。

如果您的意思是您有多个服务器上有不同的数据集,那么您一定要考虑合并它们或使用联合引擎来提供单一访问点。

如果您需要为每个脚本执行多个查询,则每次运行查询时打开一个新连接并关闭它是非常有用的。

真的,您需要花费大量时间考虑为什么需要多个数据库连接并消除它们,但与此同时,请记住,当脚本完成时,连接会自动关闭.....

class connection_pool {
  var $conxns=array(
          'db1.example.com'=> 
              array ('host'=>'db1.example.com', 'user'=>'fred', 'password'=>'secret'),
          'db2.example.com'=> 
              array ('host'=>'db1.example.com', 'user'=>'admin', 'password'=>'xxx4'),
           ....
         );
  function get_handle($db)
  {
     if (!array_key_exists($db, $this->conxns)) {
          return false;
     }
     if (!@is_resource($this->conxns[$db]['handle'])) {
          $this->conxns[$db]['handle']=mysql_connect(
                 $this->conxns[$db]['host'],
                 $this->conxns[$db]['user'],
                 $this->conxns[$db]['password']
                 );
     }
     return $this->conxns[$db]['handle'];
  }
}

(如果在一个mysql实例上有多个数据库,NB永远不会使用'USE数据库' - 总是在查询中明确说明数据库名称)