bcache を有効後 advanced-cache.php でシンタックスエラー
TOP › Forums › バグ報告と提案(Requests and Feedback) › bcache を有効後 advanced-cache.php でシンタックスエラー
bcache を有効後 advanced-cache.php でシンタックスエラー
- This topic has 13 replies, 3 voices, and was last updated 3 weeks, 3 days ago by soybeans59.
-
AuthorPosts
-
-
2024年11月7日 at 17:59 #1461
*環境情報
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, 1 week ago by soybeans59.
-
2024年11月7日 at 18:02 #1463
<?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();
-
2024年11月8日 at 12:27 #1465
soybeans59 さん、こんちにわ。
まず、トップページにありますように、
kusanagi status
の結果の貼り付けをお願い致します。
また、ご使用のWebサービス(httpd or nginx)の error.log の内容も貼り付けをお願い致します。
(「シンタックスエラーが発生し」のエラー内容を確認したいです。) -
2024年11月11日 at 10:00 #1470
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 ago by soybeans59.
-
2024年11月12日 at 08:28 #1472
KUSANAGI Runs on Docker(RoD) に含まれるWordPress用プラグインが古い事がわかりました。
RoD の 1.6.5 を先日リリースし、プラグインを最新のものに変更しました。
プラグイン自体の更新コマンドはございません。更新するには、以下のファイルをDocker環境の wp-content へコピーしていただければと思います。$HOME/.kusanagi/lib/mu-plugins/
上記ファイル更新後、現象が再発するようであれば、ご連絡お願いします。
-
2024年11月12日 at 14:58 #1473
satoru 様
ご連絡ありがとうございます。
KRoDがバージョンアップされていることを確認し、新しいバージョンのKusanagiプラグインを取得できました。新しいバージョンで検証させていただきます。
-
2024年11月12日 at 15:14 #1474
追加の質問なのですが、advanced-cache.php というファイルは頻繁に書き換えが行われるファイルなのでしょうか?
もしその場合、どこで書き換え処理(ファイルの更新)が行われているのか教えていただけると助かります。 -
2024年11月13日 at 13:23 #1475
追加情報です。
下記のエラーログを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 TABLEwp_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
),
KEYhash
(hash
),
KEYexpire_time
(expire_time
),
KEYtype
(type
,post_type
),
KEYupdating
(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 FROMLIKE ‘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 TABLEwp_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
),
KEYhash
(hash
),
KEYexpire_time
(expire_time
),
KEYtype
(type
,post_type
),
KEYupdating
(updating
)
) DEFAULT CHARACTER SET utf8mb4 made by KUSANAGI_Page_Cache::create_cache_table- This reply was modified 1 month ago by soybeans59.
- This reply was modified 1 month ago by soybeans59.
-
2024年11月15日 at 16:00 #1478
docker動作環境知りたいため、以下のコマンドの結果を教えてください。
docker version
docker-compose –version
docker image list | grep primestrategyすいませんが、よろしくお願いします。
-
2024年11月18日 at 15:20 #1479
環境情報を共有致します。
`
$ 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: defaultServer: 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
データベースは外部のリモートデータベースを利用中-
2024年11月18日 at 15:31 #1481
上記の件について、現在リリース済みの環境で不具合の原因と思われる箇所にデバッグ機能を入れて動作確認を行なっております。結果が見えてきましたら改めてご報告させていただきます。
>>上記ファイル更新後、現象が再発するようであれば、ご連絡お願いします。
アップデート後も再現することを確認済でございます。
-
-
2024年11月18日 at 15:28 #1480
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 いずれの環境でも同様のエラーが見受けられますので共通のエラーかと思われます。
ご確認よろしくお願いいたします。
-
2024年11月18日 at 16:06 #1482
fcache の不具合の報告ありがとうございます。次バージョンで修正させていただきます。
-
2024年11月20日 at 15:17 #1483
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つのファイルをロックするので表示速度に影響がある可能性有)以上、アドバイスをいただけると助かります。
-
-
AuthorPosts
- You must be logged in to reply to this topic.