PHP内存耗尽
PHP Memory exhausted
据我所知,解决方案是。
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;
}
- $对象->insert_project()
- $对象->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。而且还在增加..
如果需要更多说明,请告诉我。
我从同事那里得到了这个问题的答案。
Laravel 执行查询日志记录,所有查询都将其保存在内存中,这就是我遇到此类问题的原因。使用以下代码,我的脚本 运行 很好,仅使用 250mb 内存。希望这对其他人有帮助。
DB::disableQueryLog();
据我所知,解决方案是。
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;
}
- $对象->insert_project()
- $对象->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。而且还在增加..
如果需要更多说明,请告诉我。
我从同事那里得到了这个问题的答案。
Laravel 执行查询日志记录,所有查询都将其保存在内存中,这就是我遇到此类问题的原因。使用以下代码,我的脚本 运行 很好,仅使用 250mb 内存。希望这对其他人有帮助。
DB::disableQueryLog();