2018/02/11(日)ゼロから始めるPHP…… (その1) Hello world
- composer を入れる。
- プロジェクトを作る
- 依存関係を追加する。
- エントリポイントを作る
- .htaccess を置く。
- DocumentRoot 変更
- 複数のアプリケーションを並行して開発する場合
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/silexcomposer.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 gracefulhttp://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 の設定を行えばよい。