首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php内存使用率while循环

问php内存使用率while循环
EN

Stack Overflow用户
提问于 2016-08-03 02:31:12
回答 2查看 585关注 0票数 0

我正在使用一个while循环从mysql中拉出记录。这是为了重置意外发生的日志,因此我通过从数据库的备份中提取ID和时间戳并使用这些值更新生产表来修复以前的记录。

我希望限制内存使用,并认为此解决方案将使用更少的内存,因为此日志表中有12,545,628条记录。只提取ID和时间戳字段,它很快就会耗尽1 1GB的内存。

这是将内存使用限制为一次只使用一条记录,还是使用与直接拉取所有ID和时间戳相同的方式并在这些记录上进行前移?

(我设置了一个数据库类,所以PDO看起来可能很奇怪)

代码语言:javascript
复制
$sql = 'SELECT id, timestamp FROM log_people WHERE 1';
$Test->sqlQuery($sql);

while ($testdb = $Test->sth->fetch(PDO::FETCH_ASSOC)) { 
    $Prod->beginTransaction();

    try {
         $sql2 = 'UPDATE log_people SET timestamp = "'.$testdb['timestamp'].'" WHERE id = '.$testdb['id'];
         $Prod->sqlQuery($sql2);


    } catch (exception $err) {
        $Prod->rollback();
        echo $err->getMessage();
    }
}

我是否应该执行下面的代码,一次只拉取和修改一条记录?

代码语言:javascript
复制
while ($count < 12545628){
    $sql = 'SELECT id, timestamp FROM log_people WHERE id ='.$count;
    $Test->sqlQuery($sql);
    $testdb = $Test->sth->fetch(PDO::FETCH_ASSOC)

$Prod->beginTransaction();

try {
    $sql2 = 'UPDATE log_people SET timestamp = "'.$testdb['timestamp'].'" WHERE id = '.$testdb['id'];
    $Prod->sqlQuery($sql2);
     $count++;


} catch (exception $err) {
        $Prod->rollback();
        //return $err->getMessage();
        echo $err->getMessage();
    }

}

EN

回答 2

Stack Overflow用户

发布于 2016-08-03 02:48:01

在您的问题中,您正在使用相同的先前值更新表。在内存方面,php的内存限制可以在php.ini中定义,也可以通过php代码定义。与第一个代码相比,第二个代码的内存效率更高,但因为每个id的查询是分开的,所以很耗时。

票数 0
EN

Stack Overflow用户

发布于 2016-08-03 02:59:01

我也不明白为什么在更新这些记录时需要选择所有记录。无论如何,这里有几个技巧可以帮助你解决内存使用问题。

第一点,有一个函数可以告诉你,你的脚本在哪里内存不足,你可以使用这个函数memory_get_peak_usage();来检查它。

对于第二点,您也可以将空值重新赋值给变量,同时取消设置它们。当垃圾收集器执行循环时,unset();函数很有用。但是,在此之前,unset()函数只是销毁对数据的变量引用,数据仍然存在于内存中,尽管不再有指向内存的指针,但PHP仍将内存视为正在使用。解决方案:将null赋值给变量以清除数据,至少在垃圾收集器获得数据之前是这样。$var = null;您也可以使用unset();取消设置变量指针,但是在内存使用方面几乎没有区别,据我所知:

代码语言:javascript
复制
unset($var);

Third point另一种方法,你可以在处理对象时销毁你的对象引用。

代码语言:javascript
复制
protected function __distruct()
{
  $this-&gt;childObject = null;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38727998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档