こざさのぶろぐ

アプリケーション開発における備忘録や思ったこと

VagrantでデバッグができるCakePHPの開発環境を構築する

Vagrantを用いてCakePHPの開発環境を構築する方法について今回は解説します。

動作環境

Mac OS 10.13.1
Vagrant 2.0.1
VirtualBox 5.2.2
仮想環境 CentOS 7.1
Apache/2.4.6
PHP 7.1.12
mysqld 5.7.20

前提

  • VagrantVirtualBoxはインストール済
  • Vagrantを使って仮想サーバの構築は完了している
  • yumがインストール済
  • ローカル環境と仮想環境のディレクトリ共有を設定済

終わっていないという方は下記の記事を参考にしてください。

sasdfe.hatenablog.com
sasdfe.hatenablog.com
sasdfe.hatenablog.com

0.はじめに

ターミナルでローカル環境と仮想環境のディレクトリ共有の自動化をコマンド入力している場合は停止してください。
vagrant rsync-auto
今回はCakePHPのプロジェクトをサーバ上に作成するため、
ディレクトリ共有の自動化コマンドが実行されている場合、
ローカル側が優先となりプロジェクトが削除されてしまう事があります。

1.Composerのインストール

仮想環境へログインしてComposerをインストールしましょう
Composerとは、PHPのパッケージ管理システム(各種ソフトウェアの導入や削除をしたり依存関係を管理するもの)です。

https://getcomposer.org/img/logo-composer-transparent.png

今回はComposerをつかってCakePHPのプロジェクトを作成するため、
必要となります。

[vagrant@localhost ~]$ curl -sS https://getcomposer.org/installer | php

次にComposerを/usr/local/bin/へ移動させましょう。
移動することで、composerコマンドとして使用することができます。

[vagrant@localhost ~]$ sudo mv composer.phar /usr/local/bin/composer

composerコマンドを実際に実行してみて、
下記のように表示すればOKです。
※もしならないばあいは、vagrantをリロードしてください。

[vagrant@localhost ~]$ composer --version
Composer version 1.5.6 2017-12-18 12:09:18

2.zip unzipをインストール

圧縮、解凍を行うコマンドですが、今回composerを使用する際に必要となるためインストールします。

[vagrant@localhost ~]$ sudo yum install -y zip unzip

3.CakePHPのプロジェクトを作成

CakePHPのプロジェクトをComposerを使って作成します。
まずはCakePHPのプロジェクトを作成するフォルダまで移動しましょう
/var/www/htmlフォルダまで移動してください

[vagrant@localhost ~]$ cd /var/www/html

次にcomposerを使ってCakePHPのプロジェクトを作成します。
今回はsamplecakeという名前にします。

[vagrant@localhost html]$ composer create-project cakephp/app samplecake --prefer-dist

途中下記の質問が入ります。
フォルダのパーミッションをセットしても良いですか?
と聞いているため、Yとしましょう

Set Folder Permissions ? (Default to Y) [Y,n]? Created `config/app.php` file
Created `/var/www/html/samplecake/tmp/cache/views` directory

4.CSSのデザイン反映

一旦インストールできましたので、実際の画面を見てみましょう
今回の場合は、下記URLを開きます

http://192.168.33.10/samplecake/

すると下記のように表示されるかと思います。

f:id:sasdfe:20171226230231p:plain

CSSが反映されておらず、URLの書き換えが正しく行われていませんと怒られています。

URL rewriting is not properly configured on your server.

そのため、仮想環境の/etc/httpd/conf/httpd.confを編集してデザインが反映されるようにしましょう

[vagrant@localhost html]$ sudo vi /etc/httpd/conf/httpd.conf
#57行目あたりに下記を追記
LoadModule rewrite_module modules/mod_rewrite.so 

#131行目あたりの<Directory "/var/www/html">タグ内を下記にする
<Directory "/var/www/html">
    Options FollowSymLinks
    AllowOverride All
</Directory>

#ドキュメントルートが/var/www/html ではない場合、変更する必要がある。
#今回は/var/www/htmlのため、変更する必要はなし
DocumentRoot "/var/www/html"

設定が終わったらApacheを再起動します

[vagrant@localhost html]$ sudo service httpd restart

再度ブラウザで確認しましょう。
デザインが反映されています。

f:id:sasdfe:20171226231528p:plain

5.MYSQLの設定

次にCakePHPとデータベースのリンクを行います。
現状では下記のようにデータベースとコネクトができていないとエラーになります。

f:id:sasdfe:20171226231749p:plain

まず、mysqlの初期設定を行いますが、
初期設定をする際にパスワードを聞かれるため、パスワードを調べる必要があります。
パスワードはログに出力されるため、そのログを出力します。

[vagrant@localhost html]$ sudo grep 'temporary password' /var/log/mysqld.log
2017-12-25T15:51:53.563358Z 1 [Note] A temporary password is generated for root@localhost: Y2sh4T(gJr<w

root@localhost:の後ろがパスワードとなります。
次に初期設定をします。

[vagrant@localhost html]$ sudo mysql_secure_installation

#早速パスワードを聞かれるため、さきほど取得したパスワードを入力してください
#初期状態の場合、パスワードは最低 1 つの数値文字を含み、1 つの小文字および大文字を含み、
#1 つの特殊文字 (英数字以外) を含む必要があるという条件でなければ通りません。
Enter password for user root: 

#次に新しいパスワードを聞かれます。
The existing password for the user account root has expired. Please set a new password.

New password: 

#再度入力します
Re-enter new password: 

#ルートのパスワードを変更しますか?と聞かれるためせっかくなのでyと入力します
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password: 

Re-enter new password: 

# 提供されたパスワードを続行しますか?と聞かれるためy
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

# 匿名ユーザを削除しますか?と聞かれるためy
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y

# ローカルホスト以外からアクセス可能な root アカウントを削除しますか?と聞かれるためy
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y

# テスト用のデータベースを削除しますか?と聞かれるためy
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y

# 今すぐ特権テーブルを再ロードしますか?と聞かれるためy
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

mysqlの初期設定は完了となります。

6.MySQLのユーザとデータベースを作成する

次にCakePHPで使用するMySQLのユーザとデータベースを作成します。
まずはユーザから作成しましょう
mysqlにrootでログインします
パスワードを聞かれるため、設定したパスワードを入力しましょう

[vagrant@localhost html]$ sudo mysql -u root -p 
Enter password: 

ユーザの作成を行います。
今回はmy_appというユーザを作成します
パスワードはユーザ(今回の場合はmy_app)のログインパスワードを入力してください

mysql> create user my_app@localhost identified by 'パスワード';
Query OK, 0 rows affected (0.00 sec)

次にDBを作成します。
今回はtest_app_dbという名前にします

mysql> create database test_app_db;
Query OK, 1 row affected (0.00 sec)

次に、作成したデータベースに権限を付与します。

mysql> GRANT ALTER ON test_app_db.* TO my_app@localhost;
Query OK, 0 rows affected (0.00 sec)

確認のため、作成したユーザでログインを行い、データベースに接続をしてみましょう。 まず、mysqlをログアウトします

mysql> exit

作成したユーザでログインします

[vagrant@localhost html]$ sudo mysql -u my_app -p 

作成したデータベースに接続します

mysql> use test_app_db;

データベースに接続したか確認します。

mysql> SELECT database();
+-------------+
| database()  |
+-------------+
| test_app_db |
+-------------+
1 row in set (0.00 sec)

上記のように表示ができていれば接続確認ができていることになります。

7.CakePHPのデータベース設定

次にCakePHPのデータベース設定を行います。
先程の手順で作成したユーザとデータベースを設定ファイルに書き込む作業となります。
作成したCakePHPプロジェクト内部のconfig/app.default.phpを開きます。

[vagrant@localhost config]$ sudo vi app.php

220行目あたりのDatasourcesを修正します。

     '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' => 'xxxxxxx', //設定したユーザのパスワードを入れます
             'database' => 'test_app_db', //作成したデータベース名を入れます
             'encoding' => 'utf8',
             'timezone' => '+09:00', //日本時間を入れます
             'flags' => [],
             'cacheMetadata' => true,
             'log' => false,

ブラウザにてCakePHPとデータベースがリンクできているか確認しましょう

f:id:sasdfe:20171227005746p:plain

リンクできている場合、上記のようにCakePHP is able to connect to the database.と表示されます。

8.CakePHPのプロジェクトをローカルへコピーする

仮想環境に作成したCakePHPのプロジェクトをローカルのディレクトリ共有をしているフォルダへコピーします。 まず、SSH接続の設定ファイルを作成します。
ローカル環境の対象の仮想環境のディレクトリ内へ移動して下記コマンドを実行します。

$ vagrant ssh-config > ssh.config

次にscpコマンドを利用して仮想環境からローカル環境へCakePHPプロジェクトのコピーを行います
今回はsamplecakeというCakePHPプロジェクトをdataフォルダ(ローカルと仮想の共有フォルダ)へコピーします。

$ scp -F ssh.config -r vagrant@default:/var/www/html/samplecake/ ../data/

lsコマンドなどでコピーできているか確認しましょう。

9.デバッグの実行確認

実際にMSCodeを使ってデバッグをしてみましょう。
一度ローカル環境の共有フォルダを仮想環境へ反映するために、仮想環境の再起動を実施します。
ローカルで仮想環境のフォルダへ移動して再起動してください

$ vagrant reload

再起動が終わったらCakePHPプロジェクトのトップを開いてみましょう
おそらく、warningエラーがたくさん出ていると思います。
SplFileInfo::openFileエラーがたくさん出ていると思いますが、
tmp/cacheディレクトリのパーミッションの関係で出るようです。
そのため、tmpフォルダのパーミッションを777に設定しましょう
(セキュリティ上よろしくないので、本番で行う場合は対処方法を考えましょう
今回は開発環境なので、一時的にそうします)

ローカル環境のCakePHPプロジェクトフォルダ内のtmpフォルダのパーミッションを変更します。

$ chmod -R 777 tmp/

変更後に仮想環境フォルダ内で自動共有を実施します。

$ vagrant rsync-auto

再度CakePHP プロジェクトのページを開いたときに下記のように正しく表示できていればOKです。

f:id:sasdfe:20171228004648p:plain

次にVSCodeを使って実際にデバッグができるか確かめてみましょう
VSCodeを開き、ローカルの共有フォルダを開きます。
その後CakePHPプロジェクトフォルダ内部のindex.phpを開いてください

f:id:sasdfe:20171228004831p:plain

上記のようにブレークポイントを貼り付けて、
CakePHPプロジェクトの画面をブラウザで開いてみましょう

f:id:sasdfe:20171228004939p:plain

このようになっていればOKです。
以上で手順は完了となります。