PHP递归函数导致PHP耗尽内存?

时间:2016-11-02 03:41:45

标签: php

Fatal error: Allowed memory size of 805306368 bytes exhausted (tried to
allocate 8192 bytes) in *directory* on line 6

当我尝试访问运行此脚本的页面时,这是一个错误:

$root = '../public_html/';

function proccess($dir) {
    $items = scandir($dir);
    $result = array();
    foreach ($items as $item)
    {
        if (is_dir($item))
            $result[$item] = proccess($item);
        else
            array_push($result, $item);
    }
    return $result;
}

print_r(proccess($root));

我想要完成的是构建一个关联数组,表示我服务器上public_html目录中的目录树。我试图为自己创建一个图形索引...主要是为了好玩,但这已经变成了关于递归的学习体验!

在我看来,这个功能看起来相当简单,我的服务器上没有那么多文件...所以除非我不小心创建了无限递归循环,否则我不明白为什么我的内存耗尽。

循环逻辑:扫描根目录,然后遍历生成的数组。如果找到另一个目录,请将其名称设置为$ result数组的键,然后再次运行proccess()。如果找到文件,只需将文件名推送到$ result数组。

1 个答案:

答案 0 :(得分:5)

问题是scandir还返回...,分别表示“此目录”和“父目录”。 SSo你无限地扫描同一个目录。只需过滤掉那些..

foreach ($items as $item){
     if($item=="." || $item == "..") continue;
     // rest of the code here...
}