用PHP连接MySQL的最佳高效方法是什么?

5

使用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连接,我们应该在每个php脚本中使用"mysql_connect("localhost","user","pw")"代码来连接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操作,它也会降低性能

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

我在这里展示了一个简单的例子,只有一个查询。想象一下高网络多查询环境。

是否有其他更好的方法使MySQL连接更加简单和高效?


这两种方法都不是很高效。 - Shakti Singh
1
不在每个查询后关闭连接会更有效率。请求完成后连接会自动关闭,所以只需要1次连接,在退出/请求结束时默认断开即可(除非您有异常长时间运行的进程)。 - Wrikken
1
天啊,又来一个“它会降低性能”的问题! - Your Common Sense
6个回答

3

你并不需要打开那么多连接。在脚本开始之前(比如说,在生成<body>之前),只需打开1个连接,然后在脚本结束时关闭它(比如说,在生成</body>之后)。这样你就只有一个连接了。在此期间,您可以执行任意数量的查询。


这是一种常见的方法。然而,实际上并没有必要保持连接那么长时间。例如,如果生成整个页面需要150毫秒,而只有50毫秒用于与数据库交互,那么连接将被浪费掉65%的时间。为了解决这个问题,应该使用持久连接(也称为连接池)。 - binaryLV
@symcbean,这取决于情况。我读过一些DBMS需要几MB来保存特定连接的数据。当然,如果服务器上有16GB RAM,那么几百MB并不重要。另一方面,如果只需要20个连接就能完成同样的工作,为什么DBA还要将连接限制设置为250呢? - binaryLV
是的,我知道这一点。但我最想问的不是有多少连接打开,而是连接方法是什么。 - Angolao

1

你有考虑过使用PDO吗?它可以进行连接池管理等操作,而且不仅限于mysql...


好老的MySQL扩展(包含mysql_connect()和其他函数)也可以进行连接池 - 这就是持久连接的作用。不过必须承认,我曾经遇到过一些持久连接的问题 - 当仍有空闲连接时,有时会打开新连接,最终导致“连接过多”的错误。 - binaryLV
那跟所描述的问题有什么关系? - symcbean
使用专门用于完成您想要的工作的库,而不是使用自定义代码,可能更好? - Ian Wood

1

0

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

此外,您不必担心包含文件会导致性能下降。这应该是您最不用担心的问题。操作系统正在进行许多IO操作,不仅与硬盘有关,您包含的1个文件不会被注意到。

如果您想知道是否有更有效的方法连接到MySQL数据库而不使用mysql_、mysqli_、odbc或PDO - 没有。


0

性能不足的问题微不足道。你应该更关注代码结构的正确方法,而不是性能。

你可以将主机/用户/密码移动到常量中,并在需要时包含它们的单独文件中,此外,你可以使用一些设计模式来处理数据库对象,例如 Singleton 或 Factory。它们将为你的系统提供更多的灵活性。


-1
在项目中,有太多的MySQL连接,我们每次都需要输入用户名和密码代码。
这个陈述有很多问题 - 即使你不考虑语法。
如果你的意思是你有多个服务器,上面有不同的数据集,那么你应该考虑 consolodating 它们或使用联合引擎提供单一访问点。
如果你需要在脚本中执行多个查询,每次运行一个查询就打开一个新的连接并关闭它非常低效。
实际上,你需要花费很多时间思考为什么需要多个数据库连接并消除它们,但同时要记住,在脚本完成时连接会自动关闭.....
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实例上有多个数据库,则永远不要使用“USE database” - 在查询中始终明确指定数据库名称)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接