Home > CakePHP | PHP > PHP5.4 ビルトインサーバで CakePHP を試食する(CakePHP Advent Calendar 2011 4日目)

PHP5.4 ビルトインサーバで CakePHP を試食する(CakePHP Advent Calendar 2011 4日目)

この記事の所要時間: 856

PHP5.4のビルトインサーバで CakePHP を動かしてみました。

CakePHP Advent Calendar 2011 の 4 日目です。

いよいよ PHP5.4 の正式リリースが近づいてきました。5.3 からのマイナーバージョンアップとはいえ、Trait や Short syntax for arrays、Array Dereferencing など興味深い機能が追加されています。

そんな新機能の中から注目のビルトインサーバを使って、CakePHP を動かしてみました。今回は CakePHP1系と2系の両方を試しています。

PHP5.4RC2をインストール

まずは現時点での最新版 PHP5.4RC2 が動く環境を作ります。

手順は以前書いたエントリ「 現状のPHP環境はそのままで、PHP 5.4 を試す 」を参考にして下さい。

上記エントリではとりあえず 5.4 環境を作るという内容でしたが、実際にアプリケーションを動作させる場合は、./configure で利用するオプションを指定する必要があります。今回は下記のようにオプションを指定しました。

$ ./configure --with-mysql --with-pdo-mysql --enable-mbstring --with-pgsql=/opt/local/lib/postgresql90

ビルトインサーバを起動

ビルトインサーバは PHP5.4 で実装された新機能です。CLI 版 PHP のオプションとして実装されており、コマンドラインから Web サーバを起動して、その上で PHP を実行することができます。これを使えば Apache のような Web サーバが無くても CakePHP を実行することができます。

では先ほど構築した PHP5.4RC2 環境でビルトインサーバを起動してみましょう。

CLI 版 PHP に「-S」を付けるとビルトインサーバが起動します。「-S」の後ろは HTTP リクエストを待ち受ける IP とポートを指定します。下記例では local:8111 で待ち受けます。なお、ここでは既存の PHP の ini ファイルを利用したいので、「-c」で php.ini のパスを指定しています。

$ sapi/cli/php -S localhost:8111 -c /path/to/php.ini
PHP 5.4.0RC2 Development Server started at Sun Dec  4 15:38:15 2011
Listening on localhost:8111
Document root is /path/to/docroot
Press Ctrl-C to quit.

起動したらブラウザで「http://localhost:8111/」にアクセスするとページが表示されます。

Ctrl-C を押すと、ビルトインサーバが停止します。

-t で DocumentRoot を指定

デフォルトではコマンドを実行したカレントディレクトリが DocumentRoot になります。「-t」を付けると任意のディレクトリを DocumentRoot に変更できます。

$ sapi/cli/php -S localhost:8111 -t /path/to/docroot

.htaccess は無効

.htaccess はビルトインサーバ上ではただの1ファイルにしかすぎず、mod_rewrite などの制御は働きません。

しかし、ビルトインサーバではリクエストファイル名に「.」が含まれておらず、該当ファイルが存在しない場合は、index.php もしくは index.html を起動する仕様になっているようなので、CakePHP のように index.php からフレームワークが起動するアプリケーションでは問題無く実行することができます。

詳細はPHPマニュアルに

さすが PHP ということで、すでにビルトインサーバについては PHP にマニュアル解説があります。詳細はこちらをどうぞ。
PHP: ビルトインウェブサーバー – Manual

CakePHP2 を試す

では実際に CakePHP2 をビルトインサーバ上で動かしてみましょう。今回動かしたのは 2.0.4 です。

手順は簡単で、CakePHP2 の app/webroot を DocumentRoot に指定して、ビルトインサーバを起動するだけです。

$ sapi/cli/php -S localhost:8111 -c /path/to/php.ini -t /path/to/cakephp2/app/webroot

ブラウザでアクセスすると見事におなじみの画面が表示されます。

CakePHP: the rapid development php framework: Home

本格的なアプリケーションは実行していませんが、ざっと見た感じでは、PHPソースを変更することなく、そのまま実行することができました。

CakePHP1 を試す

次は CakePHP1 をビルトインサーバ上で動かしてみます。今回動かしたのは 1.3.13 です。

$ sapi/cli/php -S localhost:8111 -c /path/to/php.ini -t /path/to/cakephp1/app/webroot

ブラウザでアクセスするといつもの画面が表示されますが、いくつかエラーが出ています。

CakePHP: the rapid development php framework: Home

エラーメッセージは以下。

Strict Standards: Redefining already defined constructor for class Object in /path/to/cakephp1/cake/libs/object.php on line 54

Strict Standards: Non-static method Configure::getInstance() should not be called statically in /path/to/cakephp1/cake/bootstrap.php on line 38

Strict Standards: Non-static method CakeLog::getInstance() should not be called statically, assuming $this from incompatible context in /path/to/cakephp1/cake/libs/cake_log.php on line 290

E_STRICTエラー

PHP5.4 からエラー出力レベル E_ALL に E_STRICT が含まれたため、E_STRICT に引っかかった箇所がエラーとして表示されてます。

CakePHP ではフレームワーク自身が error_reporting() でエラー出力レベルを上書きしてしまうので、E_STRICT を除外するように変更する必要があります。(display_error=off でエラー表示を抑制する手もありますが、開発環境では表示しておいた方が便利です。)

この問題についてはビルトインサーバ上でなくとも、PHP5.4環境では同じく発生します。

修正箇所は github に commit してあるので、こちらをどうぞ。
Commit 9cbc30101c7d43221b88ea0d9fa66c2cfaa4f1d1 to shin1x1/cakephp – GitHub

URLパス生成の問題

「http://localhost:8111/a」など存在しないコントローラにアクセスするとお馴染みのエラー画面となるのですが、CSS が効かずにテキストのみが表示されます。画面下の画像も表示されていません。

CakePHP: the rapid development php framework: Errors

これはフレームワークのURL生成に問題が発生しているためで、HTMLのソースを見ると CSS のパスが「/index.php/css/cake.generic.css」のように頭に余計な内容が入っています。

<link rel="stylesheet" type="text/css" href="/index.php/css/cake.generic.css" />

この対応として、app/webroot/index.php に以下の記述を追加します。

+  if (php_sapi_name() == 'cli-server') {
+    $_SERVER['PHP_SELF'] = '/'.basename(__FILE__);                                                                                                                                             
+  }
  if (!include(CORE_PATH . 'cake' . DS . 'bootstrap.php')) {

これで「http://localhost:8111/a」でアクセスすると CSS が効いて、いつもの表示になります。

CakePHP: the rapid development php framework: Errors

他にも FormHelper が生成する URL など各所で同じ現象が発生しますが、上記修正で対応ができます。

ユニットテストもちゃんと通りました

ちなみに CakePHP1 系で作ったとあるアプリケーションの alltest を通すとビルトインサーバ上でもちゃんとテストが通りました。これで 5.4 上でも動作することが分かりました:D

CakePHP Test Suite v 1.2.0.0

ビルトインサーバで手軽に試す

ビルトインサーバの利点はなんといっても「手軽さ」です。

新たに環境構築が必要な場面で、いちいち Apache に VirtualHost を追加したりせずともビルトインサーバを使えば、すぐに任意のディレクトを DocumentRoot にして Web サーバを起動することができます。

ビルトインサーバは CLI 版 PHP ではデフォルトで組み込まれるので、拡張等無しで多くの環境で利用できるのが良いですね。

ぜひ PHP5.4 ビルトインサーバでお手軽に CakePHP を試してみて下さい。

明日の CakePHP Advent Calendar 2011 5 日目は、@kashioka さんです。お楽しみにー。

Pocket

follow us in feedly

トラックバック:5

このエントリーのトラックバックURL
http://www.1x1.jp/blog/2011/12/cakephp_on_php54_builtin_web_server.html/trackback
Listed below are links to weblogs that reference
PHP5.4 ビルトインサーバで CakePHP を試食する(CakePHP Advent Calendar 2011 4日目) from Shin x blog
pingback from CakePHP : CakePHP1.2 を PHP5.3 で動かした際に出たエラーの対処方法 | ゆる~くWebのこと 11-12-28 (水) 22:20

[…]   エラーの原因はこちらから抜粋します。 PHP5.4 からエラー出力レベル E_ALL に E_STRICT […]

pingback from 今更だけどCakePHP Advent Calendar 2011を読んでいる | UnTrois 12-01-25 (水) 21:43

[…] 4日目「PHP5.4 ビルトインサーバで CakePHP を試食する」 http://www.1×1.jp/blog/2011/12/cakephp_on_php54_builtin_web_server.html […]

trackback from feqyuloge 12-03-14 (水) 11:47

yuubp…

usffnilmp gncns umwdxii uyib rtoquxteyobzpji…

trackback from ぱふぅ家のホームページ 15-02-23 (月) 23:42

PHP 5.4で変わったこと

【更新】PHP5.4で変更になったポイントを整理した。

pingback from PHP5.6環境でのCakePHP1.3のSTRICTエラー対応 | Wataame Frog 15-09-25 (金) 18:23

[…] lendar 2011 4日目) – Shin x blog http://www.1×1.jp/blog/2011/12/cakephp_on_php54_builtin_web_server.html […]

Home > CakePHP | PHP > PHP5.4 ビルトインサーバで CakePHP を試食する(CakePHP Advent Calendar 2011 4日目)

検索
フィード
メタ情報

Return to page top