CakePHP3の1歩目 #1

導入から

立ち位置

  • PHPは3ヶ月くらいしかやったことない
  • 環境はWindows7 + VMware12(CentOS7)

CentOS7のインストール

  • VMware Workstation 12にCentOS7のminimalをインストール
    • 言語に日本語を選択
    • ネットワークを利用できるようにする
    • 時刻設定をネットワーク同期
    • rootのパスとユーザを作成

アドレスを確かめる

[root@localhost ~]# ip addr

おなじみのifconfigはnet-toolsをインストールすれば使えるようになるけど別にいいかな

sshdがデフォでインストールされてるので以降はteratermで操作。
めんどいしrootログインでいいや

パッケージのアップデート

[root@localhost ~]# yum update -y

ApachePHPのインストール

やむ
[root@localhost ~]# yum install -y httpd php

Apacheの設定

[root@localhost ~]# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.170830
[root@localhost ~]# vi /etc/httpd/conf/httpd.conf
[root@localhost ~]# diff /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.1
70830
144c144
<     Options Includes ExecCGI FollowSymLinks
---
>     Options Indexes FollowSymLinks
151c151
<     AllowOverride All
---
>     AllowOverride None
164c164
<     DirectoryIndex index.php index.html
---
>     DirectoryIndex index.html
294c294
<     AddHandler cgi-script .cgi
---
>     #AddHandler cgi-script .cgi
316c316
< AddDefaultCharset Off
---
> AddDefaultCharset UTF-8

起動と自動起動設定

[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

この時点でhttpアクセスできない

[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

案の定firewalldが原因なのでhttpをデフォルトゾーンに追加

[root@localhost ~]# firewall-cmd --add-service=http --zone=public --permanent
success
[root@localhost ~]# firewall-cmd --reload
success

httpアクセスができるようになる

PHP5.6のインストール

[root@localhost ~]# vi /var/www/html/index.php
<?php
phpinfo();
?>

とりあえずPHPが動作していることを確認

> PHP Version 5.4.16
CakePHP3の動作には最低でもPHP5.6が必要になるそうです。
PHP5.6はRemiリポジトリで提供されており、そのRemiリポジトリはEPELリポジトリに依存しているのでどちらもインストールします。
(どちらもrelease-7)

[root@localhost ~]# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm を取得中
警告: /var/tmp/rpm-tmp.LfgF5M: ヘッダー V3 RSA/SHA256 Signature、鍵 ID 352c64e5: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:epel-release-7-10                ################################# [100%]
[root@localhost ~]# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
http://rpms.famillecollet.com/enterprise/remi-release-7.rpm を取得中
警告: /var/tmp/rpm-tmp.sRvoWa: ヘッダー V4 DSA/SHA1 Signature、鍵 ID 00f97f56: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:remi-release-7.3-2.el7.remi      ################################# [100%]
[root@localhost ~]# yum install -y --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt

rebootして PHP Version 5.6.31 になっているのを確認。
phpinfo() じゃなくても php -v とかでもok

PHPの設定

いつもの

[root@localhost ~]# cp /etc/php.ini /etc/php.ini.170831
[root@localhost ~]# vi /etc/php.ini
[root@localhost ~]# diff /etc/php.ini /etc/php.ini.170831
889c889
< date.timezone = "Asia/Tokyo"
---
> ;date.timezone =
1660c1660
< mbstring.language = Japanese
---
> ;mbstring.language = Japanese
1667c1667
< mbstring.internal_encoding = UTF-8
---
> ;mbstring.internal_encoding =
1675c1675
< mbstring.http_input = UTF-8
---
> ;mbstring.http_input =
1685c1685
< mbstring.http_output = pass
---
> ;mbstring.http_output =
1693c1693
< mbstring.encoding_translation = On
---
> ;mbstring.encoding_translation = Off
1698c1698
< mbstring.detect_order = auto
---
> ;mbstring.detect_order = auto
1703c1703
< mbstring.substitute_character = none
---
> ;mbstring.substitute_character = none

sftpを使えるようにしておく

以下がコメントアウトされずに有効になってればok

[root@localhost ~]# less /etc/ssh/sshd_config
# override default of no subsystems
Subsystem       sftp    /usr/libexec/openssh/sftp-server

sublime text 3のSFTP設定で勝手にアップロードされるようにしておく

MySQLのインストール

CentOS7からはMySQL公式のリポジトリからパッケージをインストールします

# mariaDBを削除しておく
[root@localhost ~]# yum remove mariadb-libs
[root@localhost ~]# rm -rf /var/lib/mysql/

[root@localhost ~]# yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
[root@localhost ~]# yum install -y mysql-community-server
# is-enabledで調べたら既にenabledだった
[root@localhost ~]# systemctl start mysqld.service

インストールが終わったらセットアップ。

# /var/log/mysqld.log に初期パスワードが出力されているので抜き出す
[root@localhost ~]# cat /var/log/mysqld.log | grep "temporary password"
2017-09-01T17:20:42.541796Z 1 [Note] A temporary password is generated for root@localhost: 0fn>k0itm48T

# 対話式のセットアップコマンド
[root@localhost ~]# mysql_secure_installation

# my.cnfをいじる
[root@localhost ~]# cp /etc/my.cnf /etc/my.cnf.170902
[root@localhost ~]# vi /etc/my.cnf
[root@localhost ~]# diff /etc/my.cnf /etc/my.cnf.170902
28,30d27
<
< character-set-server = utf8
< default_password_lifetime = 0

CakePHP3って?

(こっから本題)

  • PHP上で動作するフレームワーク
    • Railsを参考にしたらしい
  • ORMが簡単にできるのが目玉
    • すげー嫌な予感がする
    • 別にSQL文くらい普通に書けばいいじゃんって思うんだけど
  • バリデーションチェックが容易
    • これはいいな
  • MVC

CakePHP3のインストール

公式のドキュメントを参考にする。

システム要件を見るにphpのintl拡張が足りてない

[root@localhost ~]# yum install -y --enablerepo=remi,remi-php56 php-intl

Composerのインストール

パッケージの依存管理ツールらしい。
Composer公式のドキュメントに従う

[root@localhost ~]# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
[root@localhost ~]# php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
Installer verified
[root@localhost ~]# php composer-setup.php
All settings correct for using Composer
Downloading...

Composer (version 1.5.1) successfully installed to: /root/composer.phar
Use it: php composer.phar

[root@localhost ~]# php -r "unlink('composer-setup.php');"

# ここはCakePHP3の指示
[root@localhost ~]# mv composer.phar /usr/local/bin/composer

CakePHPプロジェクトの作成

どこにインストールするのが適切なのかはさておき、とりあえずドキュメントルート配下に置きます。

[root@localhost ~]# composer create-project --prefer-dist cakephp/app /var/www/html/Cake
# インストールが始まる

その後、/Cake/ にアクセスするも403エラー。
とりあえずエラーログを見る

[root@localhost ~]# less /etc/httpd/logs/error_log
[Sat Sep 02 01:32:58.031817 2017] [core:crit] [pid 2081] (13)Permission denied: [client 192.168.170.1:63139] AH00529: /var/www/html/Cake/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable and that '/var/www/html/Cake/' is executable

/Cake/.htaccess がチェックできないので読み込み可能にするのと、/Cake/ が実行可能にするのを要求されている。
しかし、/Cake/.htaccess は644になってるし、/Cake/ は755になっている。
それでも発生する権限の問題…もしかしてあいつでは

[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# vi /etc/selinux/config
SELINUX=disabled

案の定SELinux。切っちまえ
アクセスすると見た目のエラーこそないものの、何も表示されない。再びエラーログを見る。

[root@localhost ~]# less /etc/httpd/logs/error_log
[Sat Sep 02 01:39:34.726621 2017] [:error] [pid 2083] [client 192.168.170.1:63228] PHP Fatal error:  You must enable the intl extension to use CakePHP.\n in /var/www/html/Cake/config/requirements.php on line 31

intl拡張を有効にしていないらしい。そういえばそうだな

[root@localhost ~]# vi /etc/php.ini
# 雑に追加
extension=intl.so

httpdを再起動すると、ついに /Cake/ にアクセスできるようになる。
しかし、"Database driver Cake\Database\Driver\Mysql cannot be used due to a missing PHP extension or unmet dependency"というエラーメッセージに出迎えられた。
PHPからmysqlを操作するパッケージが導入されていない?

[root@localhost ~]# yum install -y --enablerepo=remi,remi-php56 php-mysqlnd

これでやっと正常に表示された。
しかし、"CakePHP is NOT able to connect to the database."と表示された。そりゃそうだ。
CakePHP用のDBとユーザを作ります。

[root@localhost ~]# mysql -u root -p
mysql> create database cake_test character set utf8;
mysql> create user cake_user@localhost identified by "********";
mysql> grant all on *.* to cake_user@localhost;

DBとユーザが作成できたらCakePHPのプロジェクトからDBにログインできるように書き換えます。

[root@localhost ~]# cp /var/www/html/Cake/config/app.php /var/www/html/Cake/config/app.php.170902
[root@localhost ~]# vi /var/www/html/Cake/config/app.php
[root@localhost ~]# diff /var/www/html/Cake/config/app.php /var/www/html/Cake/config/app.php.170902
232,234c232,234
<             'username' => 'cake_user',
<             'password' => '********',
<             'database' => 'cake_test',
---
>             'username' => 'my_app',
>             'password' => 'secret',
>             'database' => 'my_app',

"CakePHP is able to connect to the database."と表示されるのを確認。

ここまででやっとインストールが全て完了した。
次回からは実際にCakePHP3で何か作ってみます