はじめに
PHP、MySQL、Apache httpdまで揃ってましたが、CakePHP3の環境には足りないものがあったので、CakePHP3のチュートリアルが行える環境を作成してみました。
追記
「PaizaCloudでCakePHP3のチュートリアルの環境を構築するシェルスクリプト」で、以降の内容+αで作成したシェルスクリプトでの構築方法をまとめました。
追記 2018.3.8
PaizaCloudのPHPが7.2に上がったので、apt-getなどのコマンドで”php7.0″となっている場所は”php7.2″となります。PHPのアクティブサポート期間が短いので、また直ぐに上がりそうです。環境構築用のシェルスクリプトはphp7.2へ対応済みです。
CakePHP3のチュートリアルを行う下準備
- サーバーを作成する
- 必要なパッケージを追加する
- CakePHP3のプロジェクトを作成する
- Apacheの設定
- ServerNameに関する警告を消す
- rewriteモジュールを有効化する
- データベースを作成する
- ユーザーの追加とデータベースの作成
サーバーを作成する
Github、Facebook、Google+アカウントでの登録が出来るので、GitHubアカウントで新規登録します。
画面中の「新規サーバ作成」ボタンをクリックし「サーバ設定」にて必要なオプションを決めて「新規サーバ作成」ボタンをクリックします。
今回の目的はCakePHP3のチュートリアルなので、オプションから「PHP、MySQL、Apache」の3つの選択します。サーバー名はデフォルトのまま使用します。
「新規サーバ作成」ボタンクリック後、さくっとサーバーの作成が終わり2つの小窓が表示されます。2つの小窓は、ブラウザとエディタです。
必要なパッケージを追加する
作成したばかりのサーバーにはCakePHP3に必要な「intl PHP 拡張」が不足しているのでインストールします。また、CakePHP3公式サイトには記載がなのですがcomposerでプロジェクトを作成する際に警告が表示されるので「zip PHP 拡張」もインストールします。
まず、画面左にあるアイコンの「ターミナル」をクリックして、例の黒い画面を開きます。
パッケージの情報とパッケージの更新
~$ sudo apt-get update
...メッセージは省略
~$ sudo apt-get upgrade
...メッセージは省略
「intl PHP拡張、zip PHP拡張」の追加
現在、組み込まれている(ロード)されているモジュールを確認します。
~$ php -m | grep -i -e "intl" -e "mbstring" -e "simplexml" -e "zip"
mbstring
SimpleXML
「intl PHP拡張、zip PHP拡張」が足りないので追加します。
~$ sudo apt-get install php7.2-intl php7.0-zip
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
libzip4
The following NEW packages will be installed:
libzip4 php7.0-intl php7.0-zip
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 182 kB of archives.
...省略
Creating config file /etc/php/7.0/mods-available/intl.ini with new version
Setting up php7.0-zip (7.0.22-0ubuntu0.16.04.1) ...
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pmline 76.)
debconf: falling back to frontend: Readline
Creating config file /etc/php/7.0/mods-available/zip.ini with new version
Processing triggers for libc-bin (2.23-0ubuntu9) ...
Processing triggers for libapache2-mod-php7.0 (7.0.22-0ubuntu0.16.04.1) ...
追加されたことを確認します。
~$ php -m | grep -i -e "intl" -e "mbstring" -e "simplexml" -e "zip"
intl
mbstring
SimpleXML
zip
CakePHP3のプロジェクトを作成
PaizaCloudは始めからcomposerコマンドが利用可能です。
Apacheのuserdirモジュールにより、ユーザーのホームディレクトリ以下にある「public_html」サブディレクトリが公開されるように設定されてるので、「https://サーバー名.paiza-user.cloud/~ubuntu/」で「~/public_html」以下のファイルを公開できます。
手順を最小にするために「~public_html」以下にCakePHP3のプロジェクトを配置します。
~$ cd ~/public_html/
~/public_html$
~$ composer create-project --prefer-dist cakephp/app my_app_name --no-progress --profile
CakePHP3公式サイト – インストールで説明されているコマンドと少し異なります。
composer.pharは、/usr/local/bin/composerとして配置されているので、composerだけで実行できます。
2つのオプションを追加していますが必須ではありません。メモリー使用量と実行時間を表示するために「–profile」、ダウンロードの進行情報を表示させないために「–no-progress」を指定しています。
~/public_html$ composer create-project --prefer-dist cakephp/app my_app_name --no-progress --profile
[108.3MB/88.56s] Installing cakephp/app (3.5.1)
[108.8MB/88.59s] - Installing cakephp/app (3.5.1): [108.9MB/88.59s] Downloading[108.9MB/90.31s] (100%)[108.9MB/90.31s]
[109.1MB/91.55s] Created project in my_app_name
[6.1MB/98.68s] Loading composer repositories with package information
[6.3MB/99.57s] Updating dependencies (including require-dev)
[249.5MB/327.55s] Package operations: 46 installs, 0 updates, 0 removals
...省略
[162.3MB/407.76s] Writing lock file
[162.3MB/407.76s] Generating autoload files
[162.5MB/407.77s] > Cake\Composer\Installer\PluginInstaller::postAutoloadDump
[162.8MB/407.91s] > App\Console\Installer::postInstall
[162.8MB/407.92s] Created `config/app.php` file
[162.8MB/407.92s] Created `/home/ubuntu/public_html/my_app_name/tmp/cache/views` directory
Set Folder Permissions ? (Default to Y) [Y,n]? [162.8MB/407.92s] Permissions set on /home/ubuntu/public_html/my_app_name/tmp/cache
[162.8MB/407.92s] Permissions set on /home/ubuntu/public_html/my_app_name/tmp/cache/models
[162.8MB/407.92s] Permissions set on /home/ubuntu/public_html/my_app_name/tmp/cache/persistent
[162.8MB/407.92s] Permissions set on /home/ubuntu/public_html/my_app_name/tmp/cache/views
[162.8MB/407.92s] Permissions set on /home/ubuntu/public_html/my_app_name/tmp/sessions
[162.8MB/407.92s] Permissions set on /home/ubuntu/public_html/my_app_name/tmp/tests
[162.8MB/407.92s] Permissions set on /home/ubuntu/public_html/my_app_name/tmp
[162.8MB/407.92s] Permissions set on /home/ubuntu/public_html/my_app_name/logs
[162.9MB/407.92s] Updated Security.salt value in config/app.php
[162.8MB/407.92s] Memory usage: 162.83MB (peak: 252.5MB), time: 407.92s
約7分(408秒)ほど掛かります。
Apacheの設定
ServerNameに関する警告を消す
Apache httpdをrestartした時などに表示される以下のメッセージを消します。
~/public_html$ sudo apache2ctl restart
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.6. Set the 'ServerName' directive globally to suppress this message
設定手順
fqdn.confファイルの作成する
~/public_html$ sudo sh -c "echo ServerName $HOSTNAME > /etc/apache2/conf-available/fqdn.conf"
fqdnの設定を有効にする
~/public_html$ sudo a2enconf fqdn.conf Enabling conf fqdn. To activate the new configuration, you need to run: service apache2 reload
設定を再読み込みさせる
~/public_html$ service apache2 reload * Reloading Apache httpd web server apache2 *
rewriteモジュールを有効にする
Apache httpdのモジュールの状態を確認します。
~/public_html$ apache2ctl -M
Loaded Modules:
core_module (static)
so_module (static)
watchdog_module (static)
http_module (static)
log_config_module (static)
logio_module (static)
version_module (static)
unixd_module (static)
access_compat_module (shared)
alias_module (shared)
auth_basic_module (shared)
authn_core_module (shared)
authn_file_module (shared)
authz_core_module (shared)
authz_host_module (shared)
authz_user_module (shared)
autoindex_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
filter_module (shared)
mime_module (shared)
mpm_prefork_module (shared)
negotiation_module (shared)
php7_module (shared)
setenvif_module (shared)
status_module (shared)
userdir_module (shared)
php7モジュールは有効だけど、rewriteモジュールが見つからない(有効でない)ことが分かります。
以下のコマンドでrewriteモジュールを有効にします。モジュールの有効・無効を切り替えると、Apache httpdの再起動が必要になります。
~/public_html$ sudo a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
service apache2 restart
~/public_html$ sudo service apache2 restart
* Restarting Apache httpd web server apache2 [ OK ]
設定結果を確認します。
~/public_html$ apache2ctl -M | grep -i "rewrite"
rewrite_module (shared)
ここまでの設定でCakePHP3のトップページが表示できますが、データベースの設定を行っていないので、データベースに対するエラーが出ます。
データベースを作成する
MySQLにCakePHP3用のデータベースを作成します。
CakePHP3では各種設定を「プロジェクトルート/config/app.php」で各種設定を行います。データベースの接続設定は以下のようになっています。
プロジェクトルート/config/app.phpから抜粋(手順通りなら「~/my_app_name/config/app.php」です)
...
'Datasources' => [ 'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
/**
* CakePHP will use the default DB port based on the driver selected
* MySQL on MAMP uses port 8889, MAMP users will want to uncomment
* the following line and set the port accordingly
*/
//'port' => 'non_standard_port_number',
'username' => 'my_app',
'password' => 'secret',
'database' => 'my_app',
'encoding' => 'utf8',
'timezone' => 'UTC',
'flags' => [],
'cacheMetadata' => true,
'log' => false,
...
この設定でパスワードだけ単純すぎてmysqlに弾かれてしまうので変更します。使い捨ての環境なので適当ですが「Pa$$w0rd」とします。絶対本番でつかっちゃあかんよ!
...
//'port' => 'non_standard_port_number',
'username' => 'my_app',
'password' => 'Pa$$w0rd', // <= ここだけ変更
'database' => 'my_app',
'encoding' => 'utf8',
...
この設定に合わせてMySQLのデータベースを作成し、ユーザーを追加します。
PaizaCloudのMySQLのrootユーザーはパスワード無しなので、以下のコマンドでログインできます。
~/public_html/my_app_name$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.7.20-0ubuntu0.16.04.1 (Ubuntu)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
でも、直接コマンドを打つのもの大変なので、SQLスクリプトのファイルを作成します。
ユーザーの追加とデータベースの作成
画面左のアイコンの新規ファイルをクリックして、エディタの小窓を開きます。
以下の内容を「database.sql」として保存します。デフォルトのままならホームディレクトリに作成されます。
/* ログ開始 */
tee result.log
/* ユーザーの追加 */
GRANT ALL ON my_app.* TO my_app@localhost IDENTIFIED BY 'Pa$$w0rd';
/* データベースの作成 */
CREATE DATABASE IF NOT EXISTS my_app DEFAULT CHARACTER SET utf8;
/*
結果の確認
ユーザー、ユーザーの権限、データベース
*/
SHOW CREATE USER my_app@localhost;
SHOW GRANTS FOR my_app@localhost;
SHOW CREATE DATABASE my_app;
/* ログ停止 */
notee
SQLスクリプトを実行します。
~$ mysql -u root < ~/database.sql
Logging to file 'result.log'
CREATE USER for my_app@localhost
CREATE USER 'my_app'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*0F3704CF78312459ABAEBE40557BFF7BFCB0A3EC' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK
Grants for my_app@localhost
GRANT USAGE ON *.* TO 'my_app'@'localhost'
GRANT ALL PRIVILEGES ON `my_app`.* TO 'my_app'@'localhost'
Database Create Database
my_app CREATE DATABASE `my_app` /*!40100 DEFAULT CHARACTER SET utf8 */
Outfile disabled.
CakePHP3のトップページを表示すると、データベースのエラーが消えたことが確認できます。これで、チュートリアルを行うための下準備ができました。
下準備後のディスク使用量
~/public_html/my_app_name$ df
Filesystem 1K-blocks Used Available Use% Mounted on
none 999320 401968 528540 44% /
tmpfs 65536 0 65536 0% /dev
tmpfs 1022184 8256 1013928 1% /run
tmpfs 1022184 0 1022184 0% /run/lock
/dev/vda2 51471976 17691212 31457876 36% /etc/hosts
shm 65536 0 65536 0% /dev/shm
tmpfs 1022184 0 1022184 0% /sys/fs/cgroup
tmpfs 1022184 0 1022184 0% /proc/scsi
tmpfs 1022184 0 1022184 0% /sys/firmware
まとめ
PaizaCloudでCakePHP3のために最低限必要な追加設定は3つでした。
- zip PHP 拡張の追加
- intl PHP 拡張の追加
- Apache httpd のrewriteモジュールの有効化
残りはCakePHP3に固有な設定なので作るアプリにより変化します。
普段はVagrantとVirtualBoxで環境を作成していたのですが、他の人とホストマシンの違いで、VirtualBoxやDockerを使っても発生している問題の説明をするには限界がありました。また、ローカルに仮想環境のためのイメージファイルなどが増えることで容量不足の心配も必要でした。PaizaCloidだと両方とも解決できそうです。
まだ、無料プランでの利用なので、連続起動時間に制限がありますが4時間なので十分です。また、作成したサーバーは24時間で消えますが、サーバー作成が速いので問題になりません。
おまけ
作業中に発生しそうなエラーについて
コンテナーを再開した後にCakePHP3のページがエラーとなる
コンテナが一時停止した後に再開した場合「プロジェクトルート/tmp/debug_kit.sqlite」の所有者がubuntuになります。またキャッシュされているファイルの状態も変わりエラーとなります。
キャッシュの状態は不定なので権限設定ではなく、再開後はキャッシュのクリアと、debug_kit.sqliteを削除する必要があります。
~/public_html/my_app_name$ php bin/cake.php cache clear_all
Cleared default cache
Cleared _cake_core_ cache
Cleared _cake_model_ cache
~/public_html/my_app_name$ rm -f tmp/debug_kit.sqlite
SQLite3に関するエラー
もし、CakePHP3のトップページを表示した際に、以下のエラーメッセージがブラウザに表示される場合
このデータベースはMySQLのことではなく、CakePHP3がデバッグ情報を記録しているSQLite3のことです。
「プロジェクトルート/tmp/debug_kit.sqlite」にデバッグ情報を記録しています。このファイルにApache httpdの実行ユーザーで書き込める必要がありますが、たまに、所有者が開発時のユーザーになっている場合があり、書き込みが出来ないためエラーとなります。
これはキャッシュではないので、CakePHP3のキャッシュを消すコマンドでは解決しません。
~/public_html/my_app_name$ php bin/cake.php cache clear_all
Cleared default cache
Cleared _cake_core_ cache
Cleared _cake_model_ cache
~/public_html/my_app_name$ ll tmp/
total 200
drwxr-xrwx 5 ubuntu ubuntu 4096 Dec 14 17:43 ./
drwxr-xr-x 12 ubuntu ubuntu 4096 Dec 14 16:01 ../
drwxr-xrwx 5 ubuntu ubuntu 4096 Dec 14 16:01 cache/
-rw-r--r-- 1 ubuntu ubuntu 182272 Dec 14 17:43 debug_kit.sqlite
drwxr-xrwx 2 ubuntu ubuntu 4096 Dec 14 15:55 sessions/
drwxr-xrwx 2 ubuntu ubuntu 4096 Dec 14 15:55 tests/
debug_kit.sqliteは、アプリケーションに必要な情報でなく、無ければ作られるので削除します。
~/public_html/my_app_name$ rm -f tmp/debug_kit.sqlite
Apacheのrewriteモジュールが無効だとエラーとなる
Apacheのrewriteモジュールが無効のままだと、CakePHP3のトップページにアクセスすると以下のエラーとなります。
「intl PHP拡張」をインストールしたのにエラーとなる
Apacheのphpモジュールは起動時(再起動)にPHP拡張を読み込みます。「intl PHP拡張」をインストールした後で、Apache httpdを一度も再起動していない場合、「intl PHP拡張」が読み込まれないのでブラウザでトップページにアクセスしたら、以下のエラーが表示された画面になります。
「zip PHP拡張」が未インストールだとエラーとなる
「zip PHP拡張」が未インストールだとcomposerを実行した場合に警告がでます。
「Failed to download cakephp/app from dist: The zip extension and unzip command are both missing, skipping.」
「zip PHP拡張」のインストールは本文にて
~/public_html$ composer create-project --prefer-dist cakephp/app my_app_name --no-progress --profile
[108.3MB/252.14s] Installing cakephp/app (3.5.1)
[109.0MB/252.17s] Failed to download cakephp/app from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
[109.0MB/252.17s] Now trying to download from source
[109.0MB/252.17s] - Installing cakephp/app (3.5.1): [109.2MB/254.51s] Cloning 84ec633f31 from cache
[109.2MB/258.31s] Created project in my_app_name
[6.1MB/284.75s] Loading composer repositories with package information
[6.3MB/286.06s] Updating dependencies (including require-dev)
[249.5MB/576.52s] Package operations: 46 installs, 0 updates, 0 removals
[249.6MB/576.52s] Failed to download cakephp/plugin-installer from dist: The zip extension and unzip command are both missing, skipping.
...
[249.7MB/783.12s] - Installing symfony/var-dumper (v3.4.1): [249.7MB/784.67s] Cloning ec650a975a from cache
[249.7MB/786.55s] Failed to download psy/psysh from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
[249.7MB/786.55s] Now trying to download from source
...省略