【问题标题】:Long-running PHP script running out of memory [closed]长时间运行的 PHP 脚本内存不足 [关闭]
【发布时间】:2020-10-17 07:46:42
【问题描述】:

我有一个 PHP 脚本,它的工作是从一个数据库中逐行获取数据,对其进行处理,然后将其写入另一个数据库。总共将有大约 800,000 行(运行需要超过一天的时间)。我在运行时监控内存使用情况,每添加一行,内存使用量似乎增加了大约 10k,而且我什至在达到 10,000 行之前就耗尽了内存。我不知道为什么有任何东西留在内存中,我将导入限制为 5,000 行,在退出程序之前,我将所有变量清空并进行另一次内存检查,它根本没有下降。如果变量没有使用内存,那是什么?我该如何解决?

【问题讨论】:

  • 你用的是mysqli还是PDO?
  • 给我们看脚本,我们可以帮你重写
  • 心灵感应离线,请贴代码。

标签: php memory memory-management


【解决方案1】:

您是否尝试过不将var 设置为NULL,unset() 呢?


无论如何,我认为如果你采用不同的方法会更好。

您的问题或许可以通过PHP generators (yields) 解决。

<?php

declare(strict_types=1);

// In case you are using mysqli driver:
function mysqliGenerator(mysqli_result $res)
{
    while ($row = mysqli_fetch_assoc($res)) {
        yield $row;
    }
}


$result = $mysqli->query("SELECT ...");
foreach (mysqliGenerator($result) as $row)
{
    var_dump($row);
}
// In case you are using PDO driver:
function pdoGenerator(PDOStatement $statement)
    while ($row = $statement->fetchAll(PDO::FETCH_ASSOC))  {
        yield $row;
    }
}

$statement = $pdo->query('SELECT ...');
foreach (pdoGenerator($statement) as $row) {
    var_dump($row);
}

【讨论】:

  • 我一直将 var 设置为 NULL,因为这是我看到其他人推荐的释放内存的方法。我确实使用了 PDO,但没有使用生成器……您认为这样可以节省内存而不是没有它?
  • @DanGoodspeed,这很奇怪。我从来没有遇到过你描述的类似情况。应该null 应该可以工作,无论如何,PHP 中的生成器是为这种情况而设计的(从文件或数据库等流中获取大数据)。 PHP 中有很多关于yields 的信息,谷歌它以更好地了解它们是如何实现和工作的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
相关资源
最近更新 更多