使用递归文件夹删除和文件夹删除会导致堆栈溢出

时间:2017-03-29 19:54:24

标签: php recursion command-line-interface

我正在使用PHP的CLI来创建程序。有一个名为/compile的文件夹,它在CLI调用后保存所有已编译的文件,此文件夹获取常量__COMPILE__。我正在使用此函数并使用常量作为位置:(位置: C:\ Users \ Jeklin \ Documents \ GitHub \ spitfire-engine \ compiled ):

  

致命错误: C:\ Users \ Jeklin \ Documents \ GitHub \ spitfire中允许的内存大小 134217728 耗尽(尝试分配65488字节) -engine \ sys \ compiler \ Launcher.compiler.php 在线 66

这是我正在使用的功能:

/*59*/    public function p_sweep_compile_dir()
/*60*/      { $dir = __COMPILE__;
/*61*/        if (is_dir($dir)) {
/*62*/          $objects = scandir($dir);
/*63*/          foreach ($objects as $object) {
/*64*/            if ($object != "." && $object != "..") {
/*65*/              if (filetype($dir."/".$object) == "dir")
/*66*/                 $this->p_sweep_compile_dir($dir."/".$object);
/*67*/              else unlink   ($dir."/".$object);
/*68*/            }
/*69*/          }
/*70*/          reset($objects);
/*71*/          rmdir($dir);
/*72*/        } else die('tried to delete a non-folder from p_sweep_compile_dir');
/*73*/      }

我可以在第66行看到包含递归方法以尝试深入了解文件结构,虽然结构非常浅,但这是__COMPILE__目录设置:

|--compiled
     |---app
     |---public
     |---sys
     |index.html

1 个答案:

答案 0 :(得分:1)

不确定是谁写了那段代码,但这会更有意义:

/*59*/    public function p_sweep_compile_dir($dir = null) // default $dir to null unless something is passed into it
/*60*/      { $dir = ($dir === null ? __COMPILE__ : $dir); // If $dir is null then use __COMPILE__ otherwise use the $dir value
/*61*/        if (is_dir($dir)) {
/*62*/          $objects = scandir($dir);
/*63*/          foreach ($objects as $object) {
/*64*/            if ($object != "." && $object != "..") {
/*65*/              if (filetype($dir."/".$object) == "dir")
/*66*/                 $this->p_sweep_compile_dir($dir."/".$object); // recurse self and provide deeper dir
/*67*/              else unlink   ($dir."/".$object);
/*68*/            }
/*69*/          }
/*70*/          reset($objects);
/*71*/          rmdir($dir);
/*72*/        } else die('tried to delete a non-folder from p_sweep_compile_dir');
/*73*/      }

我没有对此进行过测试,但理论上它应该可行。

请参阅第59,60和66行以获取评论。

侧面说明:

假设你完全掌控了这个源代码,为了爱上这个世界上所有好的东西,请使用开始和结束花括号总是。一些可怜的程序员在你停止工作后会诅咒你几个小时。

我将如何写它:

public function p_sweep_compile_dir($dir = null) // default $dir to null unless something is passed into it
{
    $dir = ($dir === null ? __COMPILE__ : $dir); // If $dir is null then use __COMPILE__ otherwise use the $dir value

    if(is_dir($dir))
    {
        $objects = array_diff(scandir($dir), array('..', '.'));
        foreach ($objects as $object)
        {
            if(is_dir($dir."/".$object))
            {
                $this->p_sweep_compile_dir($dir."/".$object); // recurse self and provide deeper dir
            }
            else
            {
                unlink($dir."/".$object);
            }
        }
        unset($object, $objects); // forced memory management
        rmdir($dir);
    }
    else
    {
        die('tried to delete a non-folder from p_sweep_compile_dir');
    }

    unset($dir);
}