【问题标题】:PHP Memory exhaustedPHP 内存耗尽
【发布时间】:2015-10-01 16:06:16
【问题描述】:

据我所知,解决方案是。

ini_set('memory_limit','-1');

如果这还不够呢。

问题是我正在使用循环并创建和销毁循环中使用的变量。但是我仍然没有找到这背后的确切原因。每次循环执行后的内存利用率都会增加。我的循环将运行近 2000 到 10000 次。所以即使是 4GB 内存也不够用。

正如我使用top commond 观察到的,内存在循环开始时使用 50mb,一旦循环继续,每次迭代后它的大小都会增加 10 到 15mb。所以我的代码没有被完全执行。

    ini_set('memory_limit', '-1');
             ini_set('xdebug.max_nesting_level', 1000);
             $ex_data = some data;
             $config = some data;
             $docConf = some data;
             $codeNameIndex = some data;
             $originalName = some data;
             CONST LIMIT = 3000;
             CONST START = 1000;

    //till here it is using 55 to 6o mb memory
            for ($i = self::START; $i < (self::START + self::LIMIT); $i++) {
                            $start_memory = memory_get_usage();
                            $object = new ImportProjectController();
                            $object->ex_data = $ex_data;
                            $object->config = $config;
                            $object->docConf = $docConf;
                            $StratProInsertDateTime = microtime(true);
                            try {
                                DB::connection()->getPdo()->beginTransaction();
                                $object->ex_data[$codeNameIndex[2]][$codeNameIndex[1]] = $originalName . '_' . $i;
                                $object->ex_data[$codeCodeIndex[2]][$codeCodeIndex[1]] = $originalCode . '_' . $i;
                                if (!$object->insert_project()) {
                                    throw new Exception('error while inserting project');
                                }
                                if (!$object->insert_documents()) {
                                    throw new Exception('error while inserting documents');
                                }
                                App::make('AccessController')->rebuildCache();
                                DB::connection()->getPdo()->commit();
                            } catch (Exception $ex) {
                                DB::connection()->getPdo()->rollBack();
                                echo $ex;
                            }
//it is increasing memory utilization every iteration.
                echo "Memory used for inserting a ".$i."th project :- ";
                echo memory_get_usage() - $start_memory.PHP_EOL;
                unset($object->ex_data);
                unset($object->config);
                unset($object->docConf);
                $object = null;
                echo "Memory utilization before inserting project :- ";
                echo memory_get_usage() - $start_memory.PHP_EOL;
            }
  • $object->insert_project()
  • $object->insert_documents()
  • App::make('AccessController')->rebuildCache()

方法做一些数据库插入。

因为我在循环结束时取消设置 $object 变量。但它仍然没有释放内存。而且我确信在上述方法中没有任何东西占用内存。

Swap:        0k total,        0k used,        0k free,   241560k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                  
27671 ec2-user  20   0 1489m 1.1g 9908 R 66.0 30.4   8:15.00 php                                                                                      
 4307 mysql     20   0  852m 140m 5576 S 18.2  3.7  14:21.50 mysqld    

上面是最常见的输出,您可以清楚地看到内存利用率达到 1.1gb。而且还在增加..

如果需要更多描述,请告诉我。

【问题讨论】:

  • 您或许应该更深入地检查循环中执行的方法中的内存泄漏。此外,在此处实例化控制器并调用它们的方法是应用程序设计不佳的标志,因此您可能需要重新考虑您的应用程序结构(例如通过将逻辑提取到另一层来重构控制器方法)。
  • 亲爱的 bogdag,Aoove 脚本是测试脚本。我写了上面的脚本来上传大量数据。并通过打开不同的页面来测试我的网站。所以我会在一生中运行一次这个脚本。所以我只想运行一次。

标签: php laravel optimization memory-management lamp


【解决方案1】:

我从我的同事那里得到了这个问题的答案。

Laravel 进行查询日志记录,所有查询都将其保存在内存中,这就是我遇到此类问题的原因。使用以下代码,我的脚本运行良好,仅使用 250mb 内存。希望这对其他人有所帮助。

DB::disableQueryLog();

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 2013-07-06
    • 2014-06-28
    • 2011-04-20
    • 1970-01-01
    • 2013-07-22
    • 2014-06-30
    • 2015-07-02
    相关资源
    最近更新 更多