2017-04-12 132 views
0

我已经完成为我正在执行的项目编写我的php脚本。我的下一步是我想看看是否可以从内存的角度来改进我的代码,因为我的一些脚本吃了很多内存。我一直在研究这个,一个建议是NULL和未设置变量,但我从来没有看到这样做的例子。所以,我想给我的剧本做了共同行动的例子,想知道这是否是这样做的正确方法:在php脚本中释放内存

$query = $dbconn->get_results("SELECT id,name FROM account WHERE active = 1"); 

    if(isset($query)) 
    { 

    foreach($query AS $currq) 
    { 

    $account_id = intval($currq->id); 
    $account_name = trim($currq->name); 

    //Code to stuff with this data 

    //NULL the variables before looping again 
    $account_id = NULL; 
    $account_name = NULL; 

    //Unset the variables before looping again 
    unset($account_id); 
    unset($account_name); 

    } 

$query = NULL; 
unset($query); 

$currq = NULL; 
unset($currq); 

请问这是为了释放内存的正确方法?我读了PHP中的垃圾收集可能很懒,所以他们推荐NULL值,因为它会立即缩小它的值。

我知道这个网站可能太模糊了,但是如果有人能让我知道这是释放内存的正确方法吗?或者,如果有不同的方式,您可以举一个例子,以便我可以直观地看到它是如何工作的。提前致谢!

+0

什么是$ dbconn?自定义数据库类?看起来不像mysqli或PDO? – SirNarsh

+0

这应该是张贴在http://codereview.stackexchange.com/ – nogad

+0

你没有看到很多的例子,其几乎所有的情况下,它的无意义 – nogad

回答

0

请仔细阅读PHP generators,这就是他们的确切用途。

你不想一次获取所有记录,这会像霰弹枪一样将你的记忆漏洞。

取而代之,您想要一次取一条记录,处理它然后取下一条记录。

下面是一个例子:

function getAccountData(\PDO $pdo) 
{ 
    $stmt = $pdo->prepare("SELECT id,name FROM account WHERE active = 1"); 
    $stmt->execute(); 

    while ($row = $stmt->fetch()) { 
     yield $row; 
    } 
} 



foreach (getAccountData($pdo) as $account){ 
    //process the record for each iteration 
    //no need to unset anything 
} 
+0

严格地说 - '$ stmt-> execute( );'无论如何,'无论如何'取出'它都可能将整个数据集提取到php进程内存中。如果每行都单独提取,则会非常缓慢。 – zerkms

+0

'execute()'会将准备好的查询发送到服务器,它不会将整个结果集提取到内存中 – meda

+0

只需检查它:-)在您的数据库中生成1亿行,准备,执行并获取单个行。 – zerkms

0

好吧,如果函数$ dbconn-> get_results返回将所有数据的数组,那么在使用发电机,因为存储器已被分配给不点数据。

您还可以使用mysqli_fetch_assoc函数一次获取一行。它应该是更高的内存效率,然后一次获取所有行。 http://php.net/manual/en/mysqli-result.fetch-assoc.php