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

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

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

Viewing 14 reply threads
  • Author
    Posts
    • #1461
      soybeans59
      Participant

        *環境情報

        kusanagi-docker: 1.6.2
        WP KUSANAGI: 1.2.6←おそらく最新?新規でKRoDで立ち上げた時に手に入ったKusanagiプラグインを使っています
        KUSANAGI Configure: 0.7
        ロードバランサーのは以下に配置したワードプレスは負荷状況に応じてスケールします
        wp-config.php に define(‘WP_CACHE’, true); を追記済

        *本題
        bcache 有効後は正常に動作していますが、突然 advanced-cache.php が後述するコードになり、シンタックスエラーが発生し、ワードプレスへのアクセスが不可となります。
        他のキャッシュ系のプラグインはインストールしておりません。

        対処方法があればアドバイスをいただけると助かります。

        • This topic was modified 1 month, 2 weeks ago by soybeans59.
      • #1463
        soybeans59
        Participant
          <?php
          if ( ! defined( 'ABSPATH' ) ) { exit; }
          if ( is_admin() ) { return; }
          
          class SiteManagerAdvancedCache {
          	private $device_regexes = array(
          		'smart' => '/\(iPhone|\(iPod|Android .+ Mobile|IEMobile|Windows Phone|Android; Mobile; .+Firefox/',
          		'tablet' => '/\(iPad| Android |Android; Tablet; .+Firefox/',
          
          	);
          	private $sites = array(
          
          	);
          	private $allowed_query_keys;
          	private $site_mode = false;
          	private $theme_switcher_disabled = false;
          	private $replace_class_file;
          
          	function __construct() {
          		global $table_prefix;
          		$this->replace_class_file = WP_CONTENT_DIR . '/replace-class.php';
          		if ( ! isset( $_SERVER['REQUEST_URI'] ) || ! isset( $_SERVER['HTTP_USER_AGENT'] ) || ! isset( $_SERVER['REQUEST_METHOD'] ) || ! isset( $_SERVER['SCRIPT_NAME'] ) || ! isset( $_SERVER['SERVER_NAME'] ) ) { return; }
          		if ( ! isset( $_SERVER['REQUEST_METHOD'] ) || $_SERVER['REQUEST_METHOD'] != 'GET' ) { return; }
          		if ( defined( 'CACHE_EXCLUDE_IP' ) ) {
          			$exclude_ips = explode( '|', CACHE_EXCLUDE_IP );
          			foreach ( $exclude_ips as $exclude_ip ) {
          				if ( $_SERVER['REMOTE_ADDR'] == $exclude_ip || preg_match( '/' . preg_quote( $exclude_ip ) . '/', $_SERVER['REMOTE_ADDR'] ) ) {
          					return;
          				}
          			}
          		}
          		if ( defined( 'CACHE_EXCLUDE_GET' ) && isset( $_GET[CACHE_EXCLUDE_GET] ) ) {
          			return;
          		}
          		foreach ( array_keys( $_COOKIE ) as $key ) {
          			if ( strpos( $key, 'wordpress_logged_in_' ) === 0 || strpos( $key, 'comment_author_' ) === 0 ) {
          				return;
          			}
          		}
          		$this->allowed_query_keys = array( 'm','p','posts','w','cat',略 );
          
          		switch ( $this->site_mode ) {
          		case 'domain' :
          			$add_prefix = isset( $this->sites[$_SERVER['SERVER_NAME']] ) && $this->sites[$_SERVER['SERVER_NAME']] != 1 ? $this->sites[$_SERVER['SERVER_NAME']] . '_' : '';
          			$site_id = isset( $this->sites[$_SERVER['SERVER_NAME']] ) ? $this->sites[$_SERVER['SERVER_NAME']] : '';
          			$table = $table_prefix . $add_prefix;
          			$this->replace_class_file = WP_CONTENT_DIR . '/replace-class-' . $site_id . '.php';
          			break;
          		case 'directory' :
          			$key = '/';
          			if ( trim( $_SERVER['REQUEST_URI'], '/' ) ) {
          				$dirs = explode( '/', trim( $_SERVER['REQUEST_URI'], '/' ), 2 );
          				$key .= array_shift( $dirs ) . '/';
          				unset( $dirs );
          			}
          			$add_prefix = isset( $this->sites[$key] ) && $this->sites[$key] != 1 ? $this->sites[$key] . '_' : '';
          			$site_id = isset( $this->sites[$key] ) ? $this->sites[$key] : BLOG_ID_CURRENT_SITE;
          			$table = $table_prefix . $add_prefix;
          			$this->replace_class_file = WP_CONTENT_DIR . '/replace-class-' . $site_id . '.php';
          			break;
          		default :
          			$table = $table_prefix;
          			$site_id = '';
          		}
          
          		if ( $this->theme_switcher_disabled || ( ! $group = $this->get_device_group() ) ) {
          			$group = '';
          		}
          		if ( ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' ) || ( isset( $_SERVER['X-Forwarded-Proto'] ) && $_SERVER['X-Forwarded-Proto'] == 'https' ) ) {
          			$protocol = 'https';
          		} else {
          			$protocol = 'http';
          		}
          
          		$requerst_query = '';
          		$request_uri = parse_url( $_SERVER['REQUEST_URI'] );
          		if ( isset( $request_uri['query'] ) ) {
          			parse_str( $request_uri['query'], $requerst_query );
          
          			foreach ( $requerst_query as $key => $var ) {
          				if ( ! in_array( $key, $this->allowed_query_keys ) ) {
          					unset( $requerst_query[$key] );
          				}
          			}
          			ksort( $requerst_query );
          			$requerst_query = http_build_query( $requerst_query );
          		}
          
          		if ( $requerst_query ) {
          			$request_uri = $request_uri['path'] . '?' . $requerst_query;
          		} else {
          			$request_uri = $request_uri['path'];
          		}
          
          		$device_url = array(
          			$group,
          			$protocol,
          			$_SERVER['SERVER_NAME'],
          			$request_uri
          		);
          		$device_url = implode( '|', $device_url );
          		$hash = md5( $device_url );
          
          		$now = date( 'Y-m-d H:i:s' );
          		$expire = date ( 'Y-m-d H:i:s', time() - 30 );
          
          		if ( defined( 'CACHE_DB_NAME' ) && defined( 'CACHE_DB_USER' ) && defined( 'CACHE_DB_PASSWORD' ) && defined( 'CACHE_DB_HOST' ) ) {
          			$dbset = array(
          				'host' => CACHE_DB_HOST,
          				'user' => CACHE_DB_USER,
          				'pass' => CACHE_DB_PASSWORD,
          				'name' => CACHE_DB_NAME
          
          			);
          		} else {
          			$dbset = array(
          				'host' => DB_HOST,
          				'user' => DB_USER,
          				'pass' => DB_PASSWORD,
          				'name' => DB_NAME
          
          			);
          		}
          
          		$dbh = mysqli_connect(
          			$dbset['host'],
          			$dbset['user'],
          			$dbset['pass'],
          			$dbset['name']
          		);
          		if ( false === $dbh ) { return; }
          		if ( function_exists( 'mysqli_set_charset' ) ) {
          			mysqli_set_charset( $dbh, DB_CHARSET );
          		} else {
          			$sql = 'set names ' . DB_CHARSET;
          			mysqli_query( $dbh, $sql );
          		}
          		mysqli_select_db( $dbh, $dbset['name'] );
          
          		$sql = "
          SELECT	*
          FROM	{$table}site_cache
          WHERE	<code>hash</code> = '$hash'
          AND		<code>expire_time</code> >= '$expire'
          ";
          		$ret = mysqli_query( $dbh, $sql );
          
          		if ( $ret ) {
          			while ( $row = mysqli_fetch_object( $ret ) ) {
          				if ( $row->device_url == $device_url && ( strpos( $row->content, '<!-- page cached by KUSANAGI. ' ) !== false || strpos( $row->content, '<!-- page cached by WP SiteManager. ' ) !== false ) ) {
          					if ( $row->expire_time < $now ) {
          						if ( ! $row->updating ) {
          							$sql = "
          UPDATE  {$table}site_cache
          SET     <code>updating</code> = 1
          WHERE   <code>hash</code> = '$hash'
          AND     <code>type</code> = '{$row->type}'
          AND     <code>expire_time</code> = '{$row->expire_time}'
          ";
          							mysqli_query( $dbh, $sql );
          							break;
          						}
          					}
          					$headers = unserialize( $row->headers );
          					if ( $headers ) {
          						foreach ( $headers as $key => $header ) {
          							header( $key . ': ' . $header );
          						}
          					}
          					if ( $row->updating ) {
          						header( 'Cache-Control: no-cache' );
          						header( 'X-B-Cache: updating' );
          					} else {
          						header( 'X-B-Cache: cache' );
          					}
          					if ( file_exists( $this->replace_class_file ) ) {
          						require_once( $this->replace_class_file );
          						$row->content = KUSANAGI_Replace::replace( $row->content );
          					}
          
          					if ( 'rest_api' == $row->type ) {
          						header( 'X-cache-ID: ' . $row->hash );
          						echo $row->content;
          					} else {
          						echo $row->content;
          						echo "\n" .'<!-- CacheID : ' . $row->hash . ' -->';
          					}
          					exit;
          				}
          			}
          		}
          		mysqli_close( $dbh );
          	}
          
          	function get_device_group() {
          		$path = preg_replace( '#^' . str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ) . '#', '', str_replace( '\\', '/', ABSPATH ) );
          
          		if ( isset( $_GET['site-view'] ) ) {
          			if ( strtolower( $_GET['site-view'] ) == 'pc' ) {
          				setcookie( 'site-view', 'pc', 0, $path );
          				return false;
          			}
          			foreach ( $this->device_regexes as $group => $regex ) {
          				if ( strtolower( $_GET['site-view'] ) == strtolower( $group ) ) {
          					setcookie( 'site-view', $group, 0, $path );
          					return $group;
          				}
          			}
          		} elseif ( isset( $_COOKIE['site-view'] ) ) {
          			if ( strtolower( $_COOKIE['site-view'] ) == 'pc' ) {
          				setcookie( 'site-view', 'pc', 0, $path );
          				return false;
          			}
          			foreach ( $this->device_regexes as $group => $regex ) {
          				if ( strtolower( $_COOKIE['site-view'] ) == strtolower( $group ) ) {
          					setcookie( 'site-view', $group, 0, $path );
          					return $group;
          				}
          			}
          		}
          
          		foreach ( $this->device_regexes as $group => $regex ) {
          			if ( preg_match( $regex, $_SERVER['HTTP_USER_AGENT'] ) ) {
          				return $group;
          			}
          		}
          		return false;
          	}
          }
          new SiteManagerAdvancedCache();
          		foreach ( $this->device_regexes as $group => $regex ) {
          			if ( preg_match( $regex, $_SERVER['HTTP_USER_AGENT'] ) ) {
          				return $group;
          			}
          		}
          		return false;
          	}
          }
          new SiteManagerAdvancedCache();
        • #1465
          yosuke
          Participant

            soybeans59 さん、こんちにわ。

            まず、トップページにありますように、kusanagi status の結果の貼り付けをお願い致します。
            また、ご使用のWebサービス(httpd or nginx)の error.log の内容も貼り付けをお願い致します。
            (「シンタックスエラーが発生し」のエラー内容を確認したいです。)

          • #1470
            soybeans59
            Participant

              yosuke 様、ご連絡ありがとうございます。
              提供情報が不足しており申し訳ございません。

              エラーログとKusanagiの情報などを共有いたします。

              $ kusanagi-docker status
                    Name                    Command                  State                                                  Ports                                            
              ---------------------------------------------------------------------------------------------------------------------------------------------------------------
              wordpress_config   docker-entrypoint.sh wp -- ...   Restarting                                                                                                 
              wordpress_ftp      /bin/sh -c /docker-entrypo ...   Up                                                                                                         
              wordpress_httpd    /docker-entrypoint.sh /usr ...   Up (healthy)   0.0.0.0:80->80/tcp,:::80->80/tcp, 8080/tcp, 0.0.0.0:443->8443/tcp,:::443->8443/tcp, 8443/udp
              wordpress_php      /usr/local/bin/docker-entr ...   Up (healthy)                                                                                               
              INFO: Done.
              $ kusanagi-docker --version
              1.6.2
              INFO: Done.

              nginxコンテナ
              以下のような500エラーを吐いております。
              {"log":"10.0.31.196 - - [07/Nov/2024:04:38:23 +0000] \"GET / HTTP/1.1\" 500

              phpコンテナ
              シンタックスエラーの情報です

              {"log":"[07-Nov-2024 04:38:30 UTC] PHP Parse error:  syntax error, unexpected '}', expecting end of file in /home/kusanagi/wordpress/DocumentRoot/wp-content/advanced-cache.php on line 239\n","stream":"stderr","time":"2024-11-07T04:38:30.062941601Z"}
              {"log":"[07-Nov-2024 04:38:30 UTC] PHP Parse error:  syntax error, unexpected '}', expecting end of file in /home/kusanagi/wordpress/DocumentRoot/wp-content/advanced-cache.php on line 239\n","stream":"stderr","time":"2024-11-07T04:38:30.269020456Z"}
              {"log":"[07-Nov-2024 04:38:31 UTC] PHP Parse error:  syntax error, unexpected '}', expecting end of file in /home/kusanagi/wordpress/DocumentRoot/wp-content/advanced-cache.php on line 239\n","stream":"stderr","time":"2024-11-07T04:38:31.159448671Z"}
              {"log":"[07-Nov-2024 04:38:31 UTC] PHP Parse error:  syntax error, unexpected '}', expecting end of file in /home/kusanagi/wordpress/DocumentRoot/wp-content/advanced-cache.php on line 239\n","stream":"stderr","time":"2024-11-07T04:38:31.516737511Z"}
              {"log":"[07-Nov-2024 04:38:34 UTC] PHP Parse error:  syntax error, unexpected '}', expecting end of file in /home/kusanagi/wordpress/DocumentRoot/wp-content/advanced-cache.php on line 239\n","stream":"stderr","time":"2024-11-07T04:38:34.180800412Z"}

              また、頻繁に advanced-cache.php ファイルの書き換えが行われていることも確認しております。

              • This reply was modified 1 month, 1 week ago by soybeans59.
            • #1472
              satoru
              Moderator

                KUSANAGI Runs on Docker(RoD) に含まれるWordPress用プラグインが古い事がわかりました。
                RoD の 1.6.5 を先日リリースし、プラグインを最新のものに変更しました。
                プラグイン自体の更新コマンドはございません。更新するには、以下のファイルをDocker環境の wp-content へコピーしていただければと思います。

                $HOME/.kusanagi/lib/mu-plugins/

                上記ファイル更新後、現象が再発するようであれば、ご連絡お願いします。

              • #1473
                soybeans59
                Participant

                  satoru 様

                  ご連絡ありがとうございます。
                  KRoDがバージョンアップされていることを確認し、新しいバージョンのKusanagiプラグインを取得できました。

                  新しいバージョンで検証させていただきます。

                • #1474
                  soybeans59
                  Participant

                    追加の質問なのですが、advanced-cache.php というファイルは頻繁に書き換えが行われるファイルなのでしょうか?
                    もしその場合、どこで書き換え処理(ファイルの更新)が行われているのか教えていただけると助かります。

                  • #1475
                    soybeans59
                    Participant

                      追加情報です。

                      下記のエラーログをPHPコンテナで確認しております。繰り返し以下のログが出ている状況です。上記のシンタックスエラーと関係はございますか?

                      [13-Nov-2024 01:49:01 UTC] WordPress database error Incorrect database name ” for query SHOW TABLES FROM LIKE ‘wp_site_cache’ made by KUSANAGI_Page_Cache::create_cache_table
                      [13-Nov-2024 01:49:01 UTC] WordPress database error Table ‘wp_site_cache’ already exists for query
                      CREATE TABLE wp_site_cache (
                      id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
                      hash varchar(32) NOT NULL,
                      content longtext NOT NULL,
                      device_url text NOT NULL,
                      type varchar(20) NOT NULL,
                      post_type varchar(200) NOT NULL,
                      headers text NOT NULL,
                      user_agent text NOT NULL,
                      server varchar(16) NOT NULL,
                      updating tinyint(1) NOT NULL DEFAULT ‘0’,
                      create_time datetime NOT NULL,
                      expire_time datetime NOT NULL,
                      PRIMARY KEY (id),
                      KEY hash (hash),
                      KEY expire_time (expire_time),
                      KEY type (type,post_type),
                      KEY updating (updating)
                      ) DEFAULT CHARACTER SET utf8mb4 made by KUSANAGI_Page_Cache::create_cache_table
                      [13-Nov-2024 01:49:01 UTC] WordPress database error Incorrect database name ” for query SHOW TABLES FROM LIKE ‘wp_site_cache’ made by KUSANAGI_Page_Cache::create_cache_table
                      [13-Nov-2024 01:49:02 UTC] WordPress database error Table ‘wp_site_cache’ already exists for query
                      CREATE TABLE wp_site_cache (
                      id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
                      hash varchar(32) NOT NULL,
                      content longtext NOT NULL,
                      device_url text NOT NULL,
                      type varchar(20) NOT NULL,
                      post_type varchar(200) NOT NULL,
                      headers text NOT NULL,
                      user_agent text NOT NULL,
                      server varchar(16) NOT NULL,
                      updating tinyint(1) NOT NULL DEFAULT ‘0’,
                      create_time datetime NOT NULL,
                      expire_time datetime NOT NULL,
                      PRIMARY KEY (id),
                      KEY hash (hash),
                      KEY expire_time (expire_time),
                      KEY type (type,post_type),
                      KEY updating (updating)
                      ) DEFAULT CHARACTER SET utf8mb4 made by KUSANAGI_Page_Cache::create_cache_table

                      • This reply was modified 1 month, 1 week ago by soybeans59.
                      • This reply was modified 1 month, 1 week ago by soybeans59.
                    • #1478
                      satoru
                      Moderator

                        docker動作環境知りたいため、以下のコマンドの結果を教えてください。

                        docker version
                        docker-compose –version
                        docker image list | grep primestrategy

                        すいませんが、よろしくお願いします。

                      • #1479
                        soybeans59
                        Participant

                          環境情報を共有致します。

                          `
                          $ docker version
                          Client: Docker Engine – Community
                          Version: 24.0.2
                          API version: 1.43
                          Go version: go1.20.4
                          Git commit: cb74dfc
                          Built: Thu May 25 21:51:00 2023
                          OS/Arch: linux/amd64
                          Context: default

                          Server: Docker Engine – Community
                          Engine:
                          Version: 24.0.2
                          API version: 1.43 (minimum version 1.12)
                          Go version: go1.20.4
                          Git commit: 659604f
                          Built: Thu May 25 21:51:00 2023
                          OS/Arch: linux/amd64
                          Experimental: false
                          containerd:
                          Version: 1.6.21
                          GitCommit: 3dce8eb055cbb6872793272b4f20ed16117344f8
                          runc:
                          Version: 1.1.7
                          GitCommit: v1.1.7-0-g860f061
                          docker-init:
                          Version: 0.19.0
                          GitCommit: de40ad0
                          `

                          `
                          $ docker-compose –version
                          docker-compose version 1.29.2, build unknown
                          `

                          `
                          primestrategy/kusanagi-ftpd 1.0.10-r0 cea5b6081e8f 11 months ago 424MB
                          primestrategy/kusanagi-httpd 2.4.58-r4 234f1ac4ff76 11 months ago 564MB
                          primestrategy/kusanagi-nginx 1.24.0-r15 2521b56e418c 11 months ago 522MB
                          primestrategy/kusanagi-nginx 1.25.3-r4 64e5db10e708 11 months ago 528MB
                          primestrategy/kusanagi-php 8.1.26-r0 ba20117101d1 11 months ago 671MB
                          primestrategy/kusanagi-php 8.1.25-r3 f64a5389cb1c 12 months ago 677MB
                          primestrategy/kusanagi-nginx 1.25.3-r3 f5979d3b4b00 12 months ago 528MB
                          primestrategy/kusanagi-ftpd 1.0.9-r2 2cd512df8772 12 months ago 427MB
                          primestrategy/kusanagi-php 7.4.33-r22 0a050e863e45 12 months ago 675MB
                          primestrategy/kusanagi-php 8.0.30-r5 dac722d1f988 12 months ago 673MB
                          primestrategy/kusanagi-php 8.0.30-r3 9db9dacd74a5 14 months ago 656MB
                          primestrategy/kusanagi-php 7.4.33-r20 4a7cd0a2a966 14 months ago 657MB
                          primestrategy/kusanagi-nginx 1.23.4-r14 3b7e7f3f3473 14 months ago 501MB
                          primestrategy/kusanagi-ftpd 1.0.9-r0 b9c89c0acb15 14 months ago 408MB
                          `

                          少々カスタマイズをしておりベースとしているイメージは以下になります。
                          primestrategy/kusanagi-nginx:1.25.3-r5
                          primestrategy/kusanagi-php:7.4.33-r22
                          wordpress:cli-2.9.0-php8.3
                          primestrategy/kusanagi-ftpd:1.0.10-r0
                          データベースは外部のリモートデータベースを利用中

                          • #1481
                            soybeans59
                            Participant

                              上記の件について、現在リリース済みの環境で不具合の原因と思われる箇所にデバッグ機能を入れて動作確認を行なっております。結果が見えてきましたら改めてご報告させていただきます。

                              >>上記ファイル更新後、現象が再発するようであれば、ご連絡お願いします。
                              アップデート後も再現することを確認済でございます。

                          • #1480
                            soybeans59
                            Participant

                              Kusanagi Runs on Docker(1.6.5) スクリプト内で不具合を見つけたので報告致します。fcache 関連のコマンド(on, off, status)を実行する際に以下のエラーがでます(内部的にはfcacheは有効になっているようです)。

                              $ kusanagi-docker config fcache status
                              grep: $TARGETDIR/.kusanagi.httpd: No such file or directory
                              /home/ubuntu/.kusanagi/lib/config.sh: line 61: [: : integer expression expected
                              INFO: fcache is off
                              INFO: Done.

                              下記のファイルの k_fcache 関数の修正が必要のようです。

                              lib/config.sh b/lib/config.sh
                              修正前: local _t=”$(grep NO_USE_FCACHE= ‘$TARGETDIR/.kusanagi.httpd’)”
                              修正後: local _t=”$(grep NO_USE_FCACHE= “$TARGETDIR/.kusanagi.httpd”)”

                              AWS EC2 UbuntuOS、MacBook いずれの環境でも同様のエラーが見受けられますので共通のエラーかと思われます。

                              ご確認よろしくお願いいたします。

                            • #1482
                              satoru
                              Moderator

                                fcache の不具合の報告ありがとうございます。次バージョンで修正させていただきます。

                              • #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つのファイルをロックするので表示速度に影響がある可能性有)

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

                                • #1488
                                  satoru
                                  Moderator

                                    ご報告、ありがとうございます。

                                    advanced-cache.php は、bcache をON/OFF した場合に修正されるもので、頻繁に再生成されるものではありません。また、こちらでも確認していますが、上記の現象は起きませんでした。

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

                                    上記に関しては、その修正で問題が発生しないのであれば、そのままご運用ください。
                                    また、bcache on の場合では、キャッシュしたデータを MariaDB に保存します。phpコンテナへのファイルへの頻繁な書き込みはないため、httpアクセスでの性能問題は無いはずです。

                                    以上、よろしくお願いします。

                                  • #1492
                                    soybeans59
                                    Participant

                                      フィードバックをヒントにソースコードを追いかけ、本来なら特定の条件の時にのみ advanced-cache.php ファイルが作成されることを確認しました。

                                      私のケースではHyperDBを利用しているため page-cache.php ファイル内の下記コードの $cache_db->dbname がNULLになり、その結果、advanced-cache.php ファイルがユーザーがサイトにアクセスする度に作成されていました。

                                      $sql = “SHOW TABLES FROM {$cache_db->dbname} LIKE ‘{$cache_db->prefix}site_cache'”;

                                      そこで、強制的にdbname=’wordpress’ にすることで毎回作成されないようにしました(念の為、ファイルロックは入れておくことにしました)。貴重なインプットありがとうございました!

                                  Viewing 14 reply threads
                                  • You must be logged in to reply to this topic.

                                  Next article

                                  フォーラムについて