【2019年版】パーフェクトPHP解説その１ 6章 環境構築編　

IT学習７４日目！
# パーフェクトPHPを現代版にアップデートしたい
フレームワークの自作などを学べるというパーフェクトPHPの6章〜8章
しかしながら本が古いこともあって、１章の環境構築やPHPバージョンの違いによって戸惑いが生じました。

名著と言われる書籍ですから、今後も学ぶ方々は多いと思います。

そこでこの名著を、誠に勝手ながらAWS Cloud９環境でPHP7.3にバージョンアップし、学習の一部始終を「実況形式」で解説していきたいと思います。
イメージとしては、この一連のQiitaを見れば、progateの次の教材として誰でもパーフェクトPHPが学べてしまう！！
そんな感じを目指します。

実況なので、逐次的に解説します。
エラーでつまづいたらそれを報告します。
エラーを解決したらその方法をシェアします。
お役に立てましたら嬉しいです。

# 0 はじめに　Progateの次段階のPHP教材を目指す
## 0.1 本稿の目的

- 他者に見せられる学習記録として
- 自分用の備忘録として
- これからパーフェクトPHPを学ぶ人の参考として残すため
- progateの次の段階のPHP教材となる！！

## 0.2 パーフェクトPHPの進め方について
パーフェクトPHPはだいぶ古い書籍になるため、おそらくバージョン関係のエラーが起きると思われます。
しかしながら、事前にバーション情報に当たって更新してから進めるのではなく、下記のルールにしたがって進めようと思います。

### 0.2.1 進め方のルール

- 原則として本文の記載にしたがって進める（動く場合はひとまずよしとする）
- エラーが起きた場合に原因を調べて修正する。
- 記事内の見出しは本書内の章立てに合わせる。
- 本文どおりに進めてエラーになった場合、見出しに【エラー】とつける
- 本文の内容を改善した場合、見出しに【改善】とつける
- エラーにはならないなら古い技術や記法を使っているかどうかはひとまず気にしない。
- 少なくとも本文でいう1節終わるごとにコミットする。

# 1 環境構築 AWS Cloud9, PHP7.3
環境はAWS cloud9上に構築します。
WebサーバはApache/2.4.39
PHPはデフォルトでは5.6.40でしたが、7.3系にバージョンアップしようと思います。
DBはMySQLです。

## 1.1 Webサーバの起動
Cloud9の初期設定では、外部からWebアプリにアクセスすることができません。
なのでまずはcloud9でHTTP通信が行えるように設定します。

### 1.1.1 セキュリティポリシーの設定

```
$ curl 169.254.169.254/latest/meta-data/instance-id/
```

によってEC2のインスタンスIDを取得します。
ブラウザからEC2のメインページにアクセスして、左のメニューから「インスタンス」を選択し、インスタンス一覧を表示します。
この時IAMアカウントをしようしている場合は権限が付与されている必要があります。
該当するIDのインスタンスを見つけたら、セキュリティグループを確認し、再び左のメニューからセキュリティグループの一覧を開きます。
該当のセキュリティグループを選択したら、下側に表示されるタブの「インバウンド」から「編集」を選択します。

編集を選択すると、ポップアップウィンドウが表示されるので、「ルールの追加」を押して、ルールを２つ作ります。
フォームが追加されるので、それぞれ「タイプHTTP, プロトコルTCP, ポート80」と「タイプHTTPS, プロトコルTCP, ポート443」として「保存」を押します。

### 1.1.2 サーバーへのアクセス確認
IPアドレスを取得して、サーバーにアクセスできるか確認してみます。

cloud9のターミナルに

```
$ curl http://169.254.169.254/latest/meta-data/public-ipv4
```

と入力してIPアドレスを取得します。

```
$ sudo service httpd start
```

によってApacheサーバを立ち上げて、ブラウザで「http://IPアドレス」へアクセスします。
すると、「Amazon Linux AMI TEST PAGE」が表示されればサーバの立ち上げに成功しています。

```
$ sudo service httpd stop
```

でサーバが停止します。サーバを停止したら、Webアプリを更新して切断されることを確認するようにします。

## 1.2 PHP 7.3のアップデート
先にyumアップデートしておきます。

```
$ sudo yum update -y
```

現在のPHPパッケージのバージョンを確認します。

```
$ rpm -qa | grep php
```

-qaオプションで、インストールされているパッケージ全ての一覧を表示します。
|はパイプといって、Linuxコマンドで複数のコマンドをつなげる際に使用し、grepコマンドで使用すると、繋いだ条件両方に該当する行を返します。
ここでは、「インストールされているrpmパッケージの一覧に含まれていて」、「php」という文字列を含む行です。
なお、yumでパッケージ管理するのに、rpmパッケージを調べていいのかと思われるかもしれませんが、yumはrpmパッケージを使用しているので、問題ないようです。

```
php56-cli-5.6.40-1.143.amzn1.x86_64
php56-jsonc-1.3.10-1.20.amzn1.x86_64
php56-pecl-xdebug-2.5.5-1.9.amzn1.x86_64
php56-xml-5.6.40-1.143.amzn1.x86_64
php56-common-5.6.40-1.143.amzn1.x86_64
php56-pdo-5.6.40-1.143.amzn1.x86_64
php56-5.6.40-1.143.amzn1.x86_64
php56-process-5.6.40-1.143.amzn1.x86_64
php56-mysqlnd-5.6.40-1.143.amzn1.x86_64
php-pear-1.10.1-1.19.amzn1.noarch
```
phpは5.6が入っているようです。
と返りますので、php 5.6のパッケージを一式削除します。

```
$ sudo yum remove php56*
```

途中で削除していいか聞かれるのでyと答えます。

次にPHP 7.3パッケージをインストールします。

```
$ sudo yum install php73*
```

compliteと表示されれば成功です。

最後にシンボリックリンクを貼り直して終了です。

```
$ sudo unlink /usr/bin/php
$ sudo ln -s /etc/alternatives/php7 /usr/bin/php
```

なお、lnコマンドはリンクを登録するコマンドで、-sオプションによってシンボリックリンクを設定できます。
シンボリックリンクとは、エイリアスとかショートカットのようなもので、特定のファイルやディレクトリに別名のファイルからアクセスできるようにするものです。

```
#Ternminal
$ ln -s [シンボリックリンクを作成したいファイルのパス] [シンボリックリンクを置くフォルダのパス]
```

ここで言えば、/etc/alternatives/php7のディレクトリに/usr/bin/phpからアクセスできるようにしています。

## 1.3 Webサーバの設定ファイル（httpd）の変更
ちなみにhttpdとは、Apacheサーバのデーモンのことで、普段は待機していて、命令が来るとそれに応じてくれる常駐プログラムのことです。

vimからhttpd.confファイルを編集して、cloud9の環境に合わせておきます。
編集時は「i」を押してINSERTモードにします。


```
$ sudo vi /etc/httpd/conf/httpd.conf
```

修正する箇所は

- ユーザとグループをEC2-userに
- DocumentRootを"/home/ec2-user/environment"に
- # Further relax access to the default document rootの<>内:を
 Directory "/home/ec2-user/environment"に

書き換えたらESCキーを押して、「:wq」で保存して終了します。

## 1.4 Webサーバを再起動

```
chown [オプション] ユーザー[:グループ] ファイル
```

というコマンドを使用して、セッション変数用のファイルに対して、先ほどconfファイルで変更した ec2-user にroot権限を付与します。

```
$ sudo chown root:ec2-user /var/lib/php/7.3/session
```

また、phpの設定確認用ファイルを配置します。
これはphpの定義済み関数の「phpinfo()」を使用するだけのファイルです。
ついでにApacheやHTTPヘッダーなどの情報も見ることができます。

```
$ echo "<?php phpinfo();" > index.php
```

Webサーバ（Apache）の再起動、停止は

```
$ sudo service httpd start または stop
```

DB サーバ（MySQL）の再起動停止は

```
$ sudo service mysqld start または stop
```

でデーモンに命令して行います。

ひとまずここまでとなります。
明日（実際には今日）からは、アプリの作成に入っていこうと思います。