Yii2 batchInsert 会占用所有服务器内存


Yii2 batchInsert eats all server memory

如果我在 100 次批量插入中插入百万行,那么每次迭代memory_usage变大,然后会发生 php 内存错误。它与Yii插入命令连接,因为如果我评论插入操作memory_usage是稳定的。

for ($i = 0; $i < $iterations; $i ++) {
    ...
    Yii::$app->db->createCommand()
        ->batchInsert(static::tableName(), $columns, $rows)
        ->execute();
    echo memory_get_usage();
}

我尝试禁用调试模式,但没有帮助。

我认为问题出在 Yii2 的记录器中。只是尝试使用这样的东西:

common/components/EmptyLogger.php:

<?php
namespace common'components;
use yii'log'Logger;
class EmptyLogger extends Logger
{
    public function log($message, $level, $category = 'application')
    {
        return false;
    }
}

然后在控制器的操作中,在开头包含下一个代码:

Yii::setLogger(new EmptyLogger());

当然,也可以在您的使用中添加它:

use common'components'EmptyLogger;

毕竟,您将收到类似的东西:

控制台''控制器

''临时控制器.php:

<?php
namespace console'controllers;
use common'components'EmptyLogger;
use Yii;
use yii'console'Controller;
class TempController extends Controller
{
    public function actionIndex()
    {
        Yii::setLogger(new EmptyLogger());
        ...
        Yii::$app->db->createCommand()
            ->batchInsert(static::tableName(), $columns, $rows)
            ->execute();
        ...
    }
}

希望对您有所帮助。但实际上这不是最好的解决方案。只是一个黑客..