PaizaCloudでCakePHP3のチュートリアルの環境を構築するまとめ

投稿者: | 2017年12月15日

はじめに

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

...省略