您应该在循环内部还是在循环外部打开/关闭数据库连接?

时间:2012-01-17 02:49:16

标签: php mysql

将PDO用于预处理语句(我从这里学到:http://www.kitebird.com/articles/php-pdo.html)我正在使用一个打开数据库连接的函数:

function testdb_connect ()
{
   $dbh = new PDO("mysql:host=localhost;dbname=test", "testuser", "testpass");
   return ($dbh);
}

我有一个for循环,它迭代并在表中插入行。我应该在循环之前打开连接并在循环结构之后关闭它

$dbh = testdb_connect();
for($i=0; $i<$number_of_values; $i++){
    //Insert rows
}
$dbh = NULL   ;

或者我应该在循环内为每个插入语句打开和关闭它吗?每种方法的优缺点是什么?

for($i=0; $i<$number_of_values; $i++){
    $dbh = testdb_connect();
    //Insert rows
    $dbh = NULL   ;
}

5 个答案:

答案 0 :(得分:7)

由于打开或关闭数据库或文件的任何调用都会产生很大的开销,为了提高效率,我会在循环之前打开数据库,并在循环完成时关闭。

答案 1 :(得分:6)

为整个脚本打开一次连接。打开连接有一定的开销,重新打开连接绝对没有优势。因此,要尽可能高效,请在脚本开头打开一次,最后关闭它。在循环中打开和关闭它是无稽之谈。

答案 2 :(得分:0)

作为一般规则,尽早开放,并尽可能晚地关闭。

在循环之外直接回答你的问题。

如果查看任何框架,您会注意到在引导过程的早期就打开了一个连接,并在一个退出的进程中关闭(如果有的话)。 Apache和PHP非常智能,可以在脚本完成时自动终止所有打开的连接。

答案 3 :(得分:0)

您应该在循环外打开和关闭数据库连接。每次在循环中打开和关闭数据库连接都会产生大量开销,并可能会降低您的网站速度。

理想情况下,您应该只在页面中打开一次数据库连接并关闭一次。因此,您可以在页面/脚本的最开头打开连接,并在最后关闭它。

答案 4 :(得分:0)

打开和关闭连接是耗费资源的,因此它不应该在循环中完成,除了你只需要一个连接来执行多个查询。

还有插入方法:不是每次迭代都运行一个查询,而是构建一个查询,然后在最后运行它,例如

create table test(
    testField VARCHAR(12)
)

function rowsToDb($rows)
{
    /*Define base of query*/
    $query =  "INSERT INTO test (testField) VALUES ";
    /*Iterate through rows concatenating new insert values*/
    foreach($rows as $row){
        $query .= "('". $row['testField']. "'),";
    }
    testdb_connect();
    /*Remove rogue "," and execute query*/
    mysql_query(substr($query, 0, strlen($query) - 1));
}