CakePHP5 on Xserver

CakePHP
この記事は約14分で読めます。

CakePHP5 もリリースされましたが下書きのまま放置しておりました。ちゃんと書こうとすると億劫になってしまいますね。もっと気楽に自分のメモ程度に書くのが良いのかも。

2024年6月5日より、sv16000台になって、SQLite3 のバージョンが3.7.xに上がりました。それによってDebugKit用にDBを設定する必要はなくなりました。

準備

Xserverで利用するため準備・確認をします。

  • PHP8.1以上にします。Xserverはドメイン単位でPHPバージョンを切り替えられますので、サーバーパネルで変更します。
  • PHP(CLI) を合わせます。SSH で入ったシェルで、php -v として8.1になるようにします。通常、そうなっていません。
  • composer2 を~/bin/composer において、Xserver標準の composer (v1) の代わりに使います。
  • サーバーパネルで適当なDBを用意します。
  • 公開できるドメイン名があるものとします。(今回は、dev.example.com)その下にプロジェクトを作成します。

Composer

インストールにcomposerを使いますが、Xserver標準のcomposer は古いので独自に準備します。

[testsv@sv14xxx ~]$ composer -V
Composer version 1.10.27 2023-09-29 10:50:23

公式サイトに従い、スクリプトを流します。

https://getcomposer.org/
https://getcomposer.org/download/

[user@sv14xxx ~]php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

~/bin/ 以下に移動します。パスが通ってなかったら通します。

composer のバージョンが2になっていることを確認します。(下記はちょっと古いかも)

[user@sv14xxx ~]$mkdir bin
[user@sv14xxx ~]mv composer.phar ./bin/composer

[user@sv14xxx ~]cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

# PATH=$PATH:$HOME/bin
PATH=$HOME/bin:$PATH

export PATH

[user@sv14xxx ~]source .bash_profile

[testsv@sv14xxx ~]$ composer -V
Composer version 2.2.22 2023-09-29 10:53:45

コマンドライン版PHPのバージョンを8.1以上に変えておきます。Xserverの管理パネルでPHPのバージョンが指定できますが、CLI PHPのバージョンを合わせておきます。以下では、8.1を選択しています。

[testsv@sv14xxx ~]$ php -v
....
[testsv@sv14xxx ~]$ ls /usr/bin/php*
/usr/bin/php          /usr/bin/php-fcgi8.2  /usr/bin/php7.2-cgi
/usr/bin/php-cgi      /usr/bin/php5.1       /usr/bin/php7.3
/usr/bin/php-fcgi5.1  /usr/bin/php5.3       /usr/bin/php7.3-cgi
/usr/bin/php-fcgi5.3  /usr/bin/php5.4       /usr/bin/php7.4
/usr/bin/php-fcgi5.4  /usr/bin/php5.5       /usr/bin/php7.4-cgi
/usr/bin/php-fcgi5.5  /usr/bin/php5.6       /usr/bin/php8.0
/usr/bin/php-fcgi5.6  /usr/bin/php5.6-cgi   /usr/bin/php8.0-cgi
/usr/bin/php-fcgi7.0  /usr/bin/php54        /usr/bin/php8.1
/usr/bin/php-fcgi7.1  /usr/bin/php54-cgi    /usr/bin/php8.1-cgi
/usr/bin/php-fcgi7.2  /usr/bin/php7.0       /usr/bin/php8.2
/usr/bin/php-fcgi7.3  /usr/bin/php7.0-cgi   /usr/bin/php8.2-cgi
/usr/bin/php-fcgi7.4  /usr/bin/php7.1       /usr/bin/phpize
/usr/bin/php-fcgi8.0  /usr/bin/php7.1-cgi
/usr/bin/php-fcgi8.1  /usr/bin/php7.2
[testsv@sv14xxx ~]$ ln -s /usr/bin/php8.1 ./bin/php
[testsv@sv14xxx ~]$ php -v
PHP 8.1.22 (cli) (built: Aug 15 2023 11:02:44) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.22, Copyright (c) Zend Technologies

新規プロジェクト作成

Xserverで作成されているドメイン名のフォルダに移動し、新規CakePHP5プロジェクトを作成します。

今回はサブドメイン dev.example.com で公開するので、Xserverで自動作成される example.com/pubic_html/dev フォルダを、app_dev/public に向けます。

[user@sv14xxx ~]$cd example.com
[user@sv14xxx example.com]$composer create-project --prefer-dist cakephp/app:~5.0 app_dev
.....

Set Folder Permissions ? (Default to Y) [Y,n]? y
Permissions set on /home/testsv/example.com/app_dev/tmp/cache
Permissions set on /home/testsv/example.com/app_dev/tmp/cache/models
Permissions set on /home/testsv/example.com/app_dev/tmp/cache/persistent
Permissions set on /home/testsv/example.com/app_dev/tmp/cache/views
Permissions set on /home/testsv/example.com/app_dev/tmp/sessions
Permissions set on /home/testsv/example.com/app_dev/tmp/tests
Permissions set on /home/testsv/example.com/app_dev/tmp
Permissions set on /home/testsv/example.com/app_dev/logs
Updated Security.salt value in config/app_local.php
(Security.salt は自動的に乱数が設定される。)

(dev.example.comで運用)
cd public_html
#念のためバックアップ
mv dev dev_bak
ln -s ../app_dev/webroot dev
#xserverが参照する php.ini のようなもの。ドメインのキャッシュ設定のヘルプも参照
cp dev_bak/.user.ini ../app_dev/webroot

もし、composer のエラーが出たら、github のパーソナルアクセストークンを設定します。

composer config --global github-oauth.github.com (githubアクセストークン)

ブラウザからアクセスして確認します。(dev.example.com)まだデータベースなど初期設定が終わっていないところが赤いアイコンで表されています。

CakePHP5 初期設定

.env を有効化し、.env から設定情報を挿入できる様にします。ただし、.envを使わず、app_local.php のみを使うのがデフォルトです。

/config/.env_sample を .env にコピーし編集します。

[testsv@sv14xxx]$ cd ~/example.com/app_dev/config
[testsv@sv14xxx config]$mv .env.example .env
[testsv@sv14xxx config]$vi .env
export APP_NAME="sample"
export DEBUG="true"
export APP_ENCODING="UTF-8"
export APP_DEFAULT_LOCALE="ja_JP"
export APP_DEFAULT_TIMEZONE="Asia/Tokyo"
#export SECURITY_SALT="__SALT__"
# SECURITY_SALT コメントアウト app_local.php に設定済み

bootstrap.php で .env 有効化します。以下の部分はコメントアウトされているので、アンコメントします。

if (!env('APP_NAME') && file_exists(CONFIG . '.env')) {
    $dotenv = new \josegonzalez\Dotenv\Loader([CONFIG . '.env']);
    $dotenv->parse()
        ->putenv()
        ->toEnv()
        ->toServer();
}

ちなみにコードにあるとおり、APP_NAMEを設定し、かつ、.envファイルがあるときに、.env が有効になります。

データベース設定

app.local のtimezoneを変更します。(後のapp_local.php はapp.localを上書きします。)

        'default' => [
            'className' => Connection::class,
            'driver' => Mysql::class,
            'persistent' => false,
            'timezone' => '+9:00'

.env の「APP_DEFAULT_TIMEZONE」はDBでは使われません。

また、Xserver では、”Asia/Tokyo” は使えません。以下が検証コードです。

[testsv@sv14xxx]$ mysql -u xxxxx -p
MariaDB [(none)]> SET @@SESSION.time_zone = "Asia/Tokyo";
ERROR 1298 (HY000): Unknown or incorrect time zone: 'Asia/Tokyo'
MariaDB [(none)]>

app_loca.php に、データベース情報を設定します。

            'username' => 'testsv_admin',
            'password' => 'd8#iessiodf',
            'database' => 'example_dev',

初期ページでさきほど赤くなっていたdatabase の部分がグリーンになります。

DebugKit 有効化

config/plugins.php に既に追記されています。bootstrap.php で強制的に有効化します。

if (Configure::read('debug')) {
    Configure::write('Cache._cake_model_.duration', '+2 minutes');
    Configure::write('Cache._cake_core_.duration', '+2 minutes');
    // disable router cache during development
    Configure::write('Cache._cake_routes_.duration', '+2 seconds');
Configure::write('DebugKit.forceEnable', true);
}

DebugKit はデフォルトでデータベースとしてSQLiteを使いますが、Xserverの場合どうしてもエラーとなってしまいます。本家フォーラムでも回答が得られませんでした。それでMariaDBを使います。ローカルのxamppだと大丈夫でした。

→SQLiteのバージョンが古いためです。sv16000台から解消しました。2024/6/5

DebugKit用のデータベース情報をapp_local.php に記載します。もちろんこの前にXserverでDBを作成しておきます。

/**
 * The debug_kit connection stores DebugKit meta-data.
 */
'debug_kit' => [
    'className' => 'Cake\Database\Connection',
    'driver' => 'Cake\Database\Driver\Mysql',
    'persistent' => false,
    'host' => 'localhost',
    //'port' => 'nonstandard_port_number',
    'username' => 'dbusername',    // Your DB username here
    'password' => 'dbpassword',    // Your DB password here
    'database' => 'debug_kit',
//    'encoding' => 'utf8',
//    'timezone' => 'UTC',
    'cacheMetadata' => true,
    'quoteIdentifiers' => false,
    //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
],

確認

個人的にはLaravel のデバッグバーより好みです。

以下書きかけ

各種 scafold

[testsv@sv14xxx app_dev]$bin/cake bake model Users
[testsv@sv14xxx app_dev]$bin/cake bake controller Users
[testsv@sv14xxx app_dev]$bin/cake bake template  Users

dev.example.com/users

各種プラグインをインストール

認証プラグインのインストール
bootstrap-ui プラグインのインストール
GitHub - FriendsOfCake/bootstrap-ui: CakePHP: Transparently use Bootstrap
...

composer require friendsofcake/bootstrap-ui

bin/cake plugin load BootstrapUI

node.js を利用しますが、バージョン管理のためnvm経由でインストールします。ただし、bootstrap5を利用するのにnode が必要というわけではありません。

nvm インストール

GitHub - nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions
...
nvm(Node Version Manager)を使ってNode.jsをインストールする手順 - Qiita
...

nvm use v18.19.0 でないと動かなかった。

[testsv@sv14xxx app_dev]$ vi src/View/AppView.php
[testsv@sv14xxx app_dev]$ bin/cake bootstrap copy_layouts
[testsv@sv14xxx app_dev]$ bin/cake bake template Users login -t BootstrapUI
Creating file /home/testsv/example.com/app_dev/templates/Users/login.php
Wrote `/home/testsv/example.com/app_dev/templates/Users/login.php`
タイトルとURLをコピーしました