2017-03-29 12 views
1

私はプログラムの作成にPHPのCLIを使用しています。 /compileという名前のフォルダがあり、CLIコールの後にコンパイルされたすべてのファイルを保持しています。このフォルダは定数__COMPILE__を取得します。私は、この機能を使用すると、場所として使用する定数を使用しています:(所在地:C:\ユーザーはJeklin \ドキュメント\はをコンパイルGitHubの\スピットファイア・エンジン\を\):再帰的なフォルダの削除とフォルダの削除を使用するとスタックオーバーフローが発生する

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65488 bytes) in C:\Users\Jeklin\Documents\GitHub\spitfire-engine\sys\compiler\Launcher.compiler.php on line 66

これは、関数であります私が使用しています:私は、ファイル構造に深く取得しようとする再帰メソッドが含まれてライン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*/  } 

、構造が非常に浅いですが、これは__COMPILE__ディレクトリのセットアップです:

|--compiled 
    |---app 
    |---public 
    |---sys 
    |index.html 
そのコードを書いたが、これは、より理にかなって誰
+1

'パブリック関数p_sweep_compile_dir(no_args!?){...'関数を呼び出すたびに、あなたはとても – Zimmi

答えて

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); 
} 
+0

感謝を__COMPILE__' 'にdirをリセット多く!これを今編集して見てください:) – Jek

関連する問題