我正在使用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
答案 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);
}