Reply To: bcache を有効後 advanced-cache.php でシンタックスエラー

TOP Forums バグ報告と提案(Requests and Feedback) bcache を有効後 advanced-cache.php でシンタックスエラー Reply To: bcache を有効後 advanced-cache.php でシンタックスエラー

#1483
soybeans59
Participant

    Kusanagiご担当者様

    WP KUSANAGI 1.3.3にバージョンアップ後も、advanced-cache.php でシンタックスエラーとなる事象を確認致しました。

    advanced-cache.php の具体的なシンタックスエラーは以下の部分となります。

    ###PHPコード###

    new SiteManagerAdvancedCache();
    ここから
    foreach ( $this->device_regexes as $group => $regex ) {
    if ( preg_match( $regex, $_SERVER['HTTP_USER_AGENT'] ) ) {
    return $group;
    }
    }
    return false;
    }
    }
    new SiteManagerAdvancedCache();
    ここまで
    ###PHPコード###

    new SiteManagerAdvancedCache(); を宣言している下の部分に上記のコード("ここから"から"ここまで"とかいた部分)が紛れ込むというものです。

    以下、調査結果です。

    advanced-cache.php は kusanagi-core フォルダ内の advanced_cache_tpl フォルダ内の advanced-cache.tpl をベースに作成されていることを確認致しました。また、最終的な advanced-cache.php を生成するには page-cache.php で advanced-cache.tpl をベースとして文字列の置換処理が行われていることを確認致しました。

    トラブル改善に向けての最初の対応は、置換処理中に上記の構文エラーを引き起こす原因が紛れていると調査を進めていたのですが、もろもろ考慮した結果、文字列の置換処理が今回のエラーに直結している可能性は低いと判断致しました(置換処理が上記の構文エラーを引き起こすような処理になっていないはず?)。そこで、最終的に生成したプログラムを advanced-cache.php に書き込む部分に問題があるのではという結論に至りました。

    【対処】
    page-cache.php で advanced-cache.php に書き込み処理をしている部分に対して LOCK_EX オプションを追加致しました。実装は以下の通りです(ログを取得するようにカスタマイズ済)。

    // 出力先ファイルに書き込み(排他ロックを適用)
    $result = @file_put_contents($advanced_cache_file, $advanced_cache_data, LOCK_EX);
    if ($result === false) {
    error_log("[ERROR] 同時アクセスが発生しました: " . $advanced_cache_data);
    } else {
    error_log("[INFO] ファイルの書き込みに成功しました: ");
    }

    結果、bcacheを有効にした日には必ず1度以上は起こっていたシンタックスエラーのトラブルが、現在5日連続で発生していない状況です。

    上記内容を踏まえ、
    ・LOCK_EXを入れることは適切なのか
    ・または別の問題なのか
    ・LOCK_EXを入れることはページ表示速度に影響はないかなど(1つのファイルをロックするので表示速度に影響がある可能性有)

    以上、アドバイスをいただけると助かります。