Xserver(独自ドメイン)へのインストール時のハマりポイントについて

【環境情報】

  • baserCMSのバージョン:4.5.6
  • レンタルサーバー名:Xserver(独自ドメイン)
  • 契約プラン:スタンダード
  • 使用テーマ:bc_sample
  • PHPスキル(自己評価):E
  • 独自ドメイン:example.com(例)

先日、Xserver(独自ドメイン)へbaserCMSをインストールした際にハマったポイントについて、情報がまとまりましたので、この場を借りてご報告します。

ハマりポイント

PHPのメモリ関連の上限値の設定(php.ini)について

NG設定1

初期値

その他の設定
memory_limit 1G
post_max_size 1G
upload_max_filesize 1G

この時、インストール時のチェックにて下記のエラーメッセージが表示されました。
どうやら、1G表記だとなぜか32MBと誤認識してしまうようです。

PHPのメモリ

PHPのメモリが 128 MB より低い場合、baserCMSの全ての機能が正常に動作しない可能性があります。
サーバー環境によってはPHPのメモリ上限が取得できず「0MB」となっている場合もあります。その場合、サーバー業者等へサーバースペックを直接確認してください。

PHPのメモリ上限 >= 128 MB
現在のPHPのメモリ上限: 32 MB

php.iniの設定変更が可能であれば、memory_limit の値を128 MB以上に設定してください

NG設定2

メモリの単位の指定ミス

その他の設定
memory_limit 1024MB
post_max_size 1024MB
upload_max_filesize 1024MB

上記のように、1024MBと指定すると下記のメッセージが表示され、一見すると正常にインストールが進みますが、後ほど別のエラーが発生してしまいました。

PHPのメモリ

PHPのメモリが 128 MB より低い場合、baserCMSの全ての機能が正常に動作しない可能性があります。
サーバー環境によってはPHPのメモリ上限が取得できず「0MB」となっている場合もあります。その場合、サーバー業者等へサーバースペックを直接確認してください。

PHPのメモリ上限 >= 128 MB
現在のPHPのメモリ上限: 1024 MB

下記のような、別のエラーメッセージが表示され、Webページが固まってしまいました。

Allowed memory size of 2097152 bytes exhausted (tried to allocate 65536 bytes)

OK設定

その他の設定
memory_limit 1024M
post_max_size 1024M
upload_max_filesize 1024M

この設定の時は、前述のエラーが発生することなく、正常にページも表示できるようになりました。

さて、php.iniの設定が終わったら、いよいよbaserCMSのインストールに向けて、baserCMSのダウンロードページから、zipファイルをダウンロードしてきて、Xserverのファイルマネージャを用いてアップロードします。
※ここでは、ファイルマネージャの詳しい使い方は解説しませんが、ブラウザー上で簡単にファイルの移動や削除、新規作成、編集なども行えます。

取り急ぎ、アップロードは/example.com/public_html/に行います。

Xserverのファイルマネージャの機能を用いて展開すると下記のような形で展開されます。

/example.com/public_html/basercms-4.5.6/basercms/

ここで、basercmsを独自ドメインのサブフォルダへインストールしたい場合は、次のURLを参考に、サブディレクトリに設置したい - baserCMS公式ガイド、下記の通りにフォルダを配置してください。

/example.com/public_html/basercms/

設置が終わったら、ファイルマネージャを用いて、.htaccessを編集、更新してください。

/example.com/public_html/basercms/.htaccess
RewriteEngine on
RewriteBase /basercms
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
/example.com/public_html/basercms/app/webroot/.htaccess
Allow from all
RewriteEngine on
RewriteBase    /basercms/app/webroot
RewriteRule \.(ico|map)$ - [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]

独自ドメインのドキュメントルートにインストールしたい場合は、次のURLを参考に、ドキュメントルートについて - baserCMS公式ガイド、下記の通りにフォルダを配置してください。

/example.com/public_html/app
/example.com/public_html/css
/example.com/public_html/files
/example.com/public_html/img
/example.com/public_html/js
/example.com/public_html/lib
/example.com/public_html/theme

DB(MySQL)の接続テストについて

注意が必要な箇所はデータベース名です。

ここは通常であれば basercmsのままで良いのですが、Xserverでは、契約時のサーバーIDがプレフィックスとして追加されますので、サーバーID_basercmsとしないと接続テストに失敗します。

baserCMS側のプレフィックスは**mysite_**のままでも良いのですが、**mysite_456_**のようになどとバージョン番号をつけたりして一意の名前(重複しない値)にしておくと、運用する上で便利になります。

後は、画面の指示通りにインストールを進めることができました。

なお、常時SSLなどの設定を行なった場合、baserCMSの管理画面のSSL通信は使わない設定のままにしておいてください。

そうでないと、リダイレクトループが生じて、Webサイトが表示できなくなってしまいます。

万が一リダイレクトループが生じても慌てずに、ファイルマネージャを用いて

/example.com/public_html/app/Config/install.phpのBcApp.adminSslをfalseに設定してください。

Configure::write('BcApp.adminSsl', false);

以上で、今回のご報告を終了します。

長文、失礼しました。

@icecreamer 体験記事は良いですね。qiitaとかに載っていると良いなーって思いました。
xserverの1GBメモリ判定は、どうもこの辺で数値型で取っているので1MBの判定されちゃってる可能性が高いですね。

$memoryLimit = (int)ini_get('memory_limit');

これはissue挙げておいてもらえると助かります。

「いいね!」 1

@arata 返信ありがとうございます。

外部サイトへの公開も考えておりますので、今しばらくお待ちください。

Xserverのメモリ判定の件は、情報ありがとうございます。

 $memoryLimit = (int)ini_get('memory_limit');

issueは後ほど挙げてみます。

@icecreamer @arata こちら調査したところPHPの仕様の問題のようです。
https://www.php.net/manual/ja/faq.using.php#faq.using.shorthandbytes
https://rougeref.hatenablog.com/entry/20160705/1467795953

  • G 表記設定した場合、強制的に32GBに設定される(設定項目によってはGも受け入れると上記文書に書いてありますが memory_limit は対象外の様子)
  • MB 表記は認識しない

baserCMSのプログラム側の問題ではなくサーバーの設定方法の問題ですね。

@ryuring さん、詳しく調べてくださり、ありがとうございます :bowing_woman:

サーバー側の問題とのこと、初期設定値が1Gだったので、初期設定値について、Xserverのサポートへ連絡してみます。

@ryuring さん、先ほど、Xserverのサポートへ、memory_limitの初期設定値の表記を1Gから1024Mに変更していただけないかメールしてみました。

何か動きがあれば、この場を借りて報告したいと思います。

初期設定値が1Gだったので

そうなんですね。もしかしたら、PHP8からGが認識できるようになっているのかもです。

下記のURLによると、memory_limitの認識がおかしい原因は、PHP7系のバグの可能性もありそうなので、PHP8系でどうなるかbaserCMS4の開発版で試してみたいと思います。

https://bugs.php.net/bug.php?id=81348

memory_limitに関して、いくつか判明したことがあります。

まず、PHP8系に環境を変更し、baserCMS 4.5.7-devを用いた場合でも、1Gの表記の時はうまく判定されませんでした。症状としては、baserCMS 4.5.6とPHP7系の組み合わせの時と変わらずでした。

それから、Xserverのサポートから回答がありました。

内容としては次のようなものでした。

公式マニュアルからは memory_limit の指定にG表記が使えないことや強制的に32MBに設定される場合がある旨の記述を見つけることができませんでした。つきましては、恐れ入りますが、お客さまの手で1G→1024Mと表記をあらためるようにお願いいたします。

とのこと。

そこで、あらためてbaserCMS4系のmemory_limitの絡んだ判定周りを調査したところ、(int)やintval()を用いてキャストする際に1G→1となっている箇所があったので、下記の通り修正の後、インストールしてみたところ、メモリ判定時の表記が1G MBとはなるものの、問題なくインストールできました。

下記の書き換えがbaserCMSの他の動作に悪影響を及ぼしていないかどうかまではよくわかっていませんが、今のところ、書き換えによる問題は生じていないようです。

取り急ぎ、ご報告まで。

~/basercms/lib/Baser/Controller/Component/BcManagerComponent.php

	/**
	 * 環境チェック
	 *
	 * @return array
	 */
	public function checkEnv()
	{
		if (function_exists('apache_get_modules')) {
			$rewriteInstalled = in_array('mod_rewrite', apache_get_modules());
		} else {
			$rewriteInstalled = -1;
		}

		$status = [
			'encoding' => mb_internal_encoding(),
			'phpVersion' => phpversion(),
//			'phpMemory' => intval(ini_get('memory_limit')),
			'phpMemory' => ini_get('memory_limit'),

~/basercms/lib/Baser/Config/bootstrap.php

/**
 * メモリー設定
 */
// $memoryLimit = (int)ini_get('memory_limit');
// if ($memoryLimit < 32 && $memoryLimit != -1) {
  $memoryLimit = return_bytes(ini_get('memory_limit'));
  if ($memoryLimit < (32 * (1024 ** 2)) && $memoryLimit != -1) {
	ini_set('memory_limit', '32M');
}
/**
 * メモリー設定関連の文字列からバイト数を得る関数
 * php.ini ファイルから値を読み取る場合、値は常にトリムされるため、
 * trim()関数を呼び出す必要はない。
 */
function return_bytes ($size_str)
{
    switch (substr ($size_str, -1))
    {
        case 'M': case 'm': return (int)$size_str * (1024 ** 2);
        case 'K': case 'k': return (int)$size_str * 1024;
        case 'G': case 'g': return (int)$size_str * (1024 ** 3);
        default: return $size_str;
    }
}