Php 深度递归内存泄漏-是否取消设置fopen资源?
我有一个递归函数来迭代11M个数据库记录,每次迭代1000个。当它接近9米时,它停了下来。当我在每1000条记录后显示Php 深度递归内存泄漏-是否取消设置fopen资源?,php,memory-management,memory-leaks,recursion,Php,Memory Management,Memory Leaks,Recursion,我有一个递归函数来迭代11M个数据库记录,每次迭代1000个。当它接近9米时,它停了下来。当我在每1000条记录后显示get\u memory\u usage()时,我对内存问题的假设得到了证实 该函数的工作原理如下: <? get_data_block(); function get_data_block($id=0); { //open a csv file for writing $packages_sorted_csv=fopen("./csv/packages_
get\u memory\u usage()
时,我对内存问题的假设得到了证实
该函数的工作原理如下:
<?
get_data_block();
function get_data_block($id=0);
{
//open a csv file for writing
$packages_sorted_csv=fopen("./csv/packages_sorted.csv", "a");
//get 1000 records and process them
//$unsorted = array of 1000 records from database
foreach($unsorted as $row);
{
$ct++;
$id++;
//$packages_sorted = array of processed data
//write output
fputcsv($packages_sorted_csv, $packages_sorted);
}
fclose($packages_sorted_csv);
if($ct==1000)
{
unset($unsorted);
echo 'Mem usage: '.memory_get_usage();
get_data_block($id); //call the function again
}else{
//finished
}
}
?>
有人知道如何使用递归函数释放所有资源吗?
…还是有办法再次调用同一个函数,使其不被自身调用
注:
- 我必须将数据分块以释放繁忙的mysql服务器
- 我已尝试取消设置所有不在全局范围内的已定义变量
- 我唯一无法解决的是fopen资源
- 每次迭代内存大小都会增加大约400k
i、 e.从
get_data_block
返回$id
,如果不需要进行更多处理,则返回一个无效值。您不必担心堆栈帧以这种方式堆积。一种好的编程语言应该识别尾部递归并将其转换为隐式循环
PHP显然没有,所以在某个时候你会得到一个堆栈溢出。试着重写代码,改用循环,或者用处理队列进行迭代。我觉得自己太笨了。非常感谢。有时我只是看不见树木,看不见森林。
while (!$done) {
$id = get_data_block($id);
$done = // determine if finished or not
}