Home > アーカイブ > 2011-12
2011-12
PHP Advent Calendar jp 2011 まとめ
- 2011-12-28 (水)
- PHP
PHPer の年末を彩る PHP Advent Calendar jp 2011 が今年も無事に終了しました。
今年は12/1から12/26まで、全26回に渡って全国の PHPer が PHP に関するエントリを投稿しました。今年は見事に登板日を超す人もいなくて、無事に完走できました。(焼肉奢りの人はいませんでした><)参加された皆さんお疲れ様でした!
エントリ内容
今年もPHP言語についてやライブラリ、フレームワークなど多岐に渡る内容が投稿されました。昨年も様々な記事がありましたが、あえて違いをあげるなら PHP5.4 に関する記事が登場したことでしょうか。
PHP 関連では 5.4 や各フレームワークなど内容を絞った Advent Calendar も開催されていたので、PHP Advent Calendar jp については、普段 PHP を使っていて気になること、つまづいたところ、もっとこうした方が良いよ、といった Tips 的が多く、PHP を使う多くの方に参考になる記事が多かったと思います。
他にも、PHP自体のソース解説やフレームワーク論、プロセス制御、hiphop phpなど中級者〜上級者向けのコアな内容や、資格試験、イベント報告、そして退職報告に絡めたエントリなど、盛りだくさんではあるのですが、とてもバランスが取れたラインナップとなりました。
電子書籍化
今年は技術評論社さんのご協力により、Advent Calendar の記事を電子出版して頂ける予定です。せっかくこれだけの記事が集まったのですから、まとめて読めるのは嬉しいですね。
価格は無料で、2012/1 or 2 月頃に提供頂けるようです。みなさんお楽しみに:D
PHP Advent Calendar jp 2011 エントリ
=
- コメント (Close): 0
- トラックバック: 1
PHP5.4 ビルトインサーバで CakePHP を試食する(CakePHP Advent Calendar 2011 4日目)
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
ブラウザでアクセスすると見事におなじみの画面が表示されます。
本格的なアプリケーションは実行していませんが、ざっと見た感じでは、PHPソースを変更することなく、そのまま実行することができました。
CakePHP1 を試す
次は CakePHP1 をビルトインサーバ上で動かしてみます。今回動かしたのは 1.3.13 です。
$ sapi/cli/php -S localhost:8111 -c /path/to/php.ini -t /path/to/cakephp1/app/webroot
ブラウザでアクセスするといつもの画面が表示されますが、いくつかエラーが出ています。
エラーメッセージは以下。
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 が効かずにテキストのみが表示されます。画面下の画像も表示されていません。
これはフレームワークの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 が効いて、いつもの表示になります。
他にも FormHelper が生成する URL など各所で同じ現象が発生しますが、上記修正で対応ができます。
ユニットテストもちゃんと通りました
ちなみに CakePHP1 系で作ったとあるアプリケーションの alltest を通すとビルトインサーバ上でもちゃんとテストが通りました。これで 5.4 上でも動作することが分かりました:D
ビルトインサーバで手軽に試す
ビルトインサーバの利点はなんといっても「手軽さ」です。
新たに環境構築が必要な場面で、いちいち Apache に VirtualHost を追加したりせずともビルトインサーバを使えば、すぐに任意のディレクトを DocumentRoot にして Web サーバを起動することができます。
ビルトインサーバは CLI 版 PHP ではデフォルトで組み込まれるので、拡張等無しで多くの環境で利用できるのが良いですね。
ぜひ PHP5.4 ビルトインサーバでお手軽に CakePHP を試してみて下さい。
明日の CakePHP Advent Calendar 2011 5 日目は、@kashioka さんです。お楽しみにー。
- コメント (Close): 0
- トラックバック: 5
PHPerの悩みを解決する arry を作ってみた(PHP Advent Calendar jp 2011 Day 2)
- 2011-12-02 (金)
- PHP
PHP Advent Calendar jp 2011 2日目です。
はい、PHPer王子です。
前日の @cakephper さんになんだか妙な名前を付けられました が、今年も PHP Advent Calendar を実施することになりました。管理人がなぜか 2 日目という変わったスタートとなりましたが、なんとか12/25の最後日まで駆け抜けたいと思います。参加されたみなさんよろしくお願いします!
ちなみにまだ数日空きがあるので、いっちょ書いてみよーという方の参加お待ちしてます:D
PHPerにおける連想配列の悩み
王子らしくPHPerの悩みを解決したい!ということで、連想配列にまつわるお悩みを。
普段PHPを書いていて何とも悩ましいのが、array関連の関数です。PHPerなら、もう何度となく聞いたことがあるであろう「引数に統一感が無い」というやつですね。
一例をあげると、コールバック関数を受け取る array_filter, array_map, array_reduce などの関数の場合、引数として受け取るのはどれも対象の連想配列とコールバック関数の2つです。普通に考えれば、どの関数でも同じ順序で引数を受け取れば良いように思うのですが、下記のように array_filter/array_walkは第1引数が array になっているのに対して、array_map は第1引数がコールバック関数となっています。
array array_filter ( array $input [, callback $callback ] ) array array_map ( callback $callback , array $arr1 [, array $... ] ) bool array_walk ( array &$array , callback $funcname [, mixed $userdata ] )
実際のコードで書くと違和感はさらにつのります。引数が違うという点もそうですが、array_mapの無名関数の後に連想配列を指定するのがなんとも気持ち悪いですね。
arryなら!
ということでもっとシンプルに書けるように arry というライブラリを作ってみました。
これを使うとこんなにすっきりと書けます。
メソッドチェイン
各メソッドはインスタンスを返すので、メソッドチェインもできます。
実行すると以下のようになります。
200 180 160 140 120 100 80 60 40 20
メソッドチェインを繋げていく
上手く繋げて行くと、array を追加して、各配列について計算した結果を追加して、ソートして、出力する、ということが一気に書けます。
実行すると悲しき今シーズンの結果が表示されます。
1. Dragons 75 59 0.560 2. Swallows 70 59 0.543 3. Giants 71 62 0.534 4. Tigers 68 70 0.493 5. Carp 60 76 0.441 6. Baystars 47 86 0.353
キーがあるかどうか
PHPでハマりがちな isset() / array_key_exists() も exists() メソッドで指定したキーが連想配列に存在するか確認できます。
PHP5.4なら
5.4ならarray()の代わりに[]が使えるので、さらにすっきりとなります。
実はこの arry という名前は、5.4 以降では array() を使わなくだろうから、この名前にしています。今は紛らわしいですが、5.4 が当たり前になったころにはこのライブラリ以外で array() と書くことはなくなるかもしれません:D
本当はSPLで
そんな arry ですが、array系関数の代わりとして使うにはまだまだ実装が足りません。
実はこれを書いた理由は SPL でこういった実装が欲しかったからなんですね。ArrayObject もありますが、実装メソッドが少なく、完全に連想配列をメソッドで操作するというわけにはいきません。
arry を膨らませていっても良いのですが、PHP 標準の SPL でこういったクラスが欲しいですね。
さて PHP Advent Calendar jp 2011 3日目は、AWS の貴公子 @tottokug さんです。どんなネタが飛び出すか楽しみですね!
- コメント (Close): 0
- トラックバック: 0
Home > アーカイブ > 2011-12
- 検索
- フィード
- メタ情報