2018/02/11(日)ゼロから始めるPHP…… (その1) Hello world

はてブ数 2018/02/11 16:41 Web開発::PHPサイト運営::未分類つーさ
自分用メモ ゼロから始めるPHP…… (その0) php実行環境構築 の続き

composer を入れる。

今時のPHP開発ではみんなcomposerを使っているらしい。
composerは、プロジェクトごとのパッケージマネージャ的なもので、
プロジェクトで使いたいパッケージを依存関係ごととってきて、
自動的にそれらをロードするための autoload.php を作ってくれるらしい。
php -r "readfile('https://getcomposer.org/installer');" | php
で、カレントディレクトリに composer.phar がインストール(?)される。
php composer.phar ... の形でも使えるが、
composer.phar には #!が書いてあるので、実行権限をつけて、PATHを通せば単体でも使える。
mv composer.phar /usr/local/bin/composer
chmod 755 /usr/local/bin/composer
composer -V

プロジェクトを作る

プロジェクト名を決めて、ディレクトリを適当に掘る。
cygwin apache のドキュメントルート以下に掘るのが楽なので、

/srv/www/htdocs/app、Windowsの世界では、C:\\cygwin64\\srv\\www\\htdocs\\app にしよう。
ここを VS Code で開いて、コードをいじりつつ、ブラウザでF5攻撃してデバッグしてみる。

(シンボリックリンクを貼って別の場所にしても良いが、Apache側の設定も変更しないといけない。後で考える。

プロジェクトをゼロからおこすには、
composer init
することで、対話式にプロジェクトを作成することができる。
プロジェクト名や作者名の後、使いたい依存関係も聞いてくるが、後でも追加できるのでここではnoでスキップする。
$ composer init


  Welcome to the Composer config generator



This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [tu-sa/htdocs]: tu-sa/testapp
Description []:
Author [, n to skip]: n
Minimum Stability []:
Package Type (e.g. library, project, metapackage, composer-plugin) []:
License []:

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no

{
    "name": "tu-sa/testapp",
    "require": {}
}

Do you confirm generation [yes]? yes
終わりまで設定すると composer.json ができる。

フレームワークを使う場合は、フレームワーク側でテンプレートを用意してくれていたりするので、
initの代わりに create-project を使ってテンプレートからスタートすることもできる。

フレームワーク

フレームワークとしていくつか調べてみたが、私は入門者なので簡単なのがいい。
GCPで動かしたいなぁと思っているので、GCPのサンプルコードを見ていたら、Silexというのが使われているようだ。
というわけで、 Silex を採用してみる。

ただし、Silex は「2018年6月でサポート終了、Symfony4を使え」とアナウンスが出ている*1ので、
PHPのフレームワークのフィールアンドルックの感覚をつかんだら、他のフレームワークに移行した方がいいだろう。

あと、GCPのサンプルコードのSilexは1.x系で、
今 composer require でバージョン番号無指定で入るSilexは2.x系なので、その辺注意が必要かな。
GCPのAppEngine Standard環境のPHPは5.5らしいことが書いてあるので、ライブラリ側に切り捨てられているかも。

ちなみに、フレームワークをいろいろググってたところ、Symfony が PHPフレームワークの王道らしい。
Silex は Symfony のコンポーネントを抜き出して実装されていて、Symfony4 への移行は、そんなに大変じゃないらしい。*2
最近のPHP界隈で流行の兆しを見せているのは、Laravelでそれをベースにしたマイクロフレームワークとして、Lumen というのもあると。
ただ、これまた引っかかった記事を鵜呑みにするのであれば、
Lumen は ときおり Laravel の知識が求められ、Laravel は Symfony の考え方を学んでからの方がいいという。

依存関係を追加する。

使いたいものを入れる。

silexを入れる
composer require silex/silex
composer.json に依存関係が追加され、 composer.lock に実際何を入れたかが記録される。
composer install で、composer.lock に書かれている特定バージョンのインストールが行われ、
composer update で、composer.json が許容するバージョンの範囲でバージョンアップされる。
ので、両方リポジトリにcommitしておくとよい。

また、依存関係として追加されたパッケージは、venderディレクトリにまとめられる。
この中身は composer install で再現できるので、リポジトリにコミットする必要はない。
.gitignore に書いておく。

エントリポイントを作る

サービスURLにアクセスされたときに始めに読み込まれるディレクトリ。
名前は www や public や web などいろんな文化がある。

PHP で Hello World を実行する方法
https://cloud.google.com/php/getting-started/hello-world?hl=ja

では、 /web にしているっぽい。
このディレクトリが、Apache 側の設定で DocumentRoot に書かれることになるはずなので、ユーザに見えない。
(もちろん通常のページのようにディレクトリ切りたかったら切ってもいいのだけど。

https://github.com/GoogleCloudPlatform/getting-started-php/tree/master/1-hello-world
のように index.php を置いて、$app->get(...) などのルーティングルールを書き、
ブラウザからたたいて動くかどうか確かめてみる。

個人的な好みで、ディレクトリ名は www に変更した。

http://localhost/testapp/www/
http://localhost/testapp/www/goobye

goodbye が 404 Not Found だ。

.htaccess を置く。

mod_rewrite で、「リクエストされたファイルやディレクトリがなければ、代わりにindex.phpへのアクセスと見なしてね」ルールを作る。
$ cat .htaccess
# ファイル or ディレクトリがなければ、 index.php にURLを書き換える。
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /testapp/www/
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [QSA,L]
</IfModule>
もう一回アクセスしてみる。
http://localhost/testapp/www/goobye

Goodbye World と出れば、OKかな。

500が出るときは、
tailf /var/log/httpd/access_log &
tailf /var/log/httpd/error_log &
してからアクセスすれば、ヒントが見えるかも。

mod_rewrite を使えるようにするには http://tu3.jp/01068#k1068p4

DocumentRoot 変更

.htaccess にもパス書くし、本番のURLと合わせた方がいい。

httpd.conf の DocumentRoot とそのすぐ下のDirectoryのパスを変更。
- DocumentRoot "/srv/www/htdocs"
- <Directory "/srv/www/htdocs">
+ DocumentRoot "/srv/www/htdocs/testapp/www"
+ <Directory "/srv/www/htdocs/testapp/www">
.htaccess の RewriteBaseも変更。
-     RewriteBase /testapp/www/
+     RewriteBase /
して、Apache 再起動。
$ /usr/sbin/apachectl graceful
http://localhost/
http://localhost/goodbye
にアクセスして問題ないことを確認。

複数のアプリケーションを並行して開発する場合

Apache側は Virtual Host の機能を使えば、ホスト名に応じてDocumentRootを設定できる。

これを使うには、Windows の hosts ファイルを書き換えてしまって、
割り当てたいホスト名を 127.0.0.1 に解決する。

たとえば、
C:\\Windows\\System32\\drivers\\etc\\hosts に
127.0.0.1       testapp.localhost
などと追記(書き換えには管理者権限が必要)すれば、
ブラウザで http://testapp.localhost/ が開けるようになる。
Host: ヘッダもこの通り送られるので、Apache側でこの名前で Virtual Host の設定を行えばよい。