2013-08-04 28 views
0

我认为这对你们大多数PHP人来说都是一个相当基本的问题。假设我有这个文件用DB工作:PHP:何时发布数据库结果?

<?php 
    define("DB_HOST", "localhost"); 
    define("DB_NAME", "dbname"); 
    define("DB_USER", "admin"); 
    define("DB_PASSWORD", "abcdefg"); 

    $connection; 
    $result; 

    function connectDatabase() { 
     global $connection; 

     if(isset($connection)) return; 

     $connection = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 
     if(mysqli_connect_errno()) { 
      die("Database connection failed: " . mysqli_connect_error() . " (" . mysqli_connect_errno() . ")"); 
     } 

    } 

    function queryDatabase($query) { 
     global $connection, $result; 
     $result = mysqli_query($connection, $query); 
     if(!$result) { 
      die("Database query failed"); 
     } 
     else { 
      return $result; 
     } 
    } 

    function releaseResult() { 
     global $result; 
     mysqli_free_result($result); 
    } 

    function closeConnection() { 
     global $connection; 
     mysqli_close($connection); 
    } 
?> 

而且我们说我这样称呼它:

<?php 
    require_once("db_connection.php"); 

    function createNavigation() { 
     connectDatabase(); 
     $query = "SELECT * "; 
     $query .= "FROM subjects "; 
     $query .= "ORDER BY position ASC"; 
     $result = queryDatabase($query); 
     while($subject = mysqli_fetch_assoc($result)) { 
      //do something 
     } 
     releaseResult(); 
    } 
?> 

的问题是 - 我是不是真的有释放本地$结果在createNavigation函数中还是那不是必需的?

什么是mysqli_free_result好吗?来自其他OOP语言,我理解释放/销毁/禁用/ nulling对象,GC,内存管理等,但我有点困惑什么是在PHP考虑脚本只运行一次,返回一些东西,它完成。谢谢!

回答

0

实际上,这并不是特别必要。大多数PHP脚本都是通过HTTP进行访问的,这意味着它们会短暂运行,然后停止,并在此时释放内存。我能看到这一点很重要的唯一的实际原因是,如果你正在运行一个持久性脚本,比如你已经建立了一个守护进程,然后继续运行,直到你停止。在这一点上发布你的结果将防止内存占用膨胀。

为了安全性,将来的兼容性,并且因为您说您来自OOP背景,您应该使用PDO而不是mysqli_ *函数。要建立一个MySQL连接,你需要创建一个新的PDO对象。为了释放资源,您只需取消对象(或结果,视情况而定)即可。

+0

谢谢,我会检查PDO。 – Fygo

1

这是关于帮助PHP有效地管理资源。如果你不叫它,那么资源将被php清除,但最好自己调用它,并在知道不再需要时马上摆脱它。

举一个极端的脚本示例,它需要第二次运行,其中数据库连接在开始时打开并且只需要非常短暂。脚本完成后,资源(数据库连接等)将被释放,但连接可能已经打开,比所需时间长0.8秒。现在添加多个用户并行访问页面,并且在任何给定时间都会打开大量此连接的实例,而如果您已经立即清除连接,则需要更少的实例。