EC-CUBEのログローテーションでPHPのWarningが出るので修正しましょ

EC-CUBEのログローテーションでPHPのWarningが出るので修正しましょ

ec-cube-banner

EC-CUBEで下記のようなwarningが出ることがありますが、デフォルトのバグなのでちゃちゃっと直しましょう

Warning: copy(/var/www/ec-cube/data/logs/site.log.4) [function.copy]: failed to open stream: そのようなファイルやディレクトリはありません in /var/www/ec-cube/data/class/util/GC_Utils.php on line

バグっている箇所

2.11系より前のバージョン(2.4系とかとか)のGC_Utils::gfLogRotation

直し方

2.11系は修正されているので、この関数を上書きしちゃいます

svn diff だとこんな修正になります

     function gfLogRotation($max_log, $max_size, $path) {
 
-        // ディレクトリ名を取得
-        $dirname = dirname($path);
-        // ファイル名を取得
-        $basename = basename($path);
-		//umask値を777にする。スクリプトが終われば元のumask値に戻る。
-		umask(0);
-        // ファイルが最大サイズを超えていないかチェック
-        if(filesize($path) > $max_size) {
-            if ($dh = opendir($dirname)) {
-                while (($file = readdir($dh)) !== false) {
-                    // ログローテーションにて作成されたファイルを取得
-                    if(ereg("^". $basename . "\." , $file)) {
-                        $arrFile[] = $file;
-                    }
-                }
+        // ファイルが存在しない場合、終了
+        if (!file_exists($path)) return;
 
-                // ローテーションにて作成されたログファイルが存在しない場合は実行しない
-                if(is_array($arrFile)) {
-                    // ソートを行う
-                    natcasesort($arrFile);
+        // ファイルが最大サイズを超えていない場合、終了
+        if (filesize($path) <= $max_size) return;
 
-                    // ファイルログが最大個数なら以上なら古いファイルから削除する
-                    $count = count($arrFile);
-                    if($count >= $max_log) {
-                        $diff = $count - $max_log;
-                        for($i = 0; $diff >= $i ; $i++) {
-                            unlink($dirname . "/" . array_pop($arrFile));
-                        }
-                    }
+        // Windows 版 PHP への対策として明示的に事前削除
+        $path_max = "$path.$max_log";
+        if (file_exists($path_max)) {
+            $res = unlink($path_max);
+            // 削除に失敗時した場合、ログローテーションは見送り
+            if (!$res) return;
+        }
 
-                    // ログファイルの添え字をずらす
-                    $count = count($arrFile);
-                    for($i = $count; 1 <= $i; $i--) {
-                        $move_number = $i + 1;
-                        if(file_exists("$path.$move_number")) {
-                            unlink("$path.$move_number");
-                        }
-                        copy("$dirname/" . $arrFile[$i - 1], "$path.$move_number");
-                    }
-                }
-                $ret = copy($path, "$path.1");
-
-                // 新規ログファイルを作成
-                if($ret) {
-                    unlink($path);
-                    touch($path);
-                    chmod($path, 0666);
-                }
+        // アーカイブのインクリメント
+        for ($i = $max_log; $i >= 2; $i--) {
+            $path_old = "$path." . ($i - 1);
+            $path_new = "$path.$i";
+            if (file_exists($path_old)) {
+                rename($path_old, $path_new);
             }
         }
+
+        // 現在ファイルのアーカイブ
+        rename($path, "$path.1");
     }

修正後の関数

    function gfLogRotation($max_log, $max_size, $path) {

        // ファイルが存在しない場合、終了
        if (!file_exists($path)) return;

        // ファイルが最大サイズを超えていない場合、終了
        if (filesize($path) <= $max_size) return;

        // Windows 版 PHP への対策として明示的に事前削除
        $path_max = "$path.$max_log";
        if (file_exists($path_max)) {
            $res = unlink($path_max);
            // 削除に失敗時した場合、ログローテーションは見送り
            if (!$res) return;
        }

        // アーカイブのインクリメント
        for ($i = $max_log; $i >= 2; $i--) {
            $path_old = "$path." . ($i - 1);
            $path_new = "$path.$i";
            if (file_exists($path_old)) {
                rename($path_old, $path_new);
            }
        }

        // 現在ファイルのアーカイブ
        rename($path, "$path.1");
    }

手抜きの修正ですんませんw

修正後の確認方法

MAX_LOG_SIZEを100KBにして、画面遷移を繰り返してみてdata/logs/の中にsite.log.4がちゃんと出来ていれば多分大丈夫 \(^o^)/