Home > アーカイブ > 2011-12

2011-12

PHP Advent Calendar jp 2011 まとめ

  • 2011-12-28 (水)
  • PHP
この記事の所要時間: 453

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 エントリ

2011/12/01 cakephper Advent Calendar 1日目
2011/12/02 shin1x1 PHPerの悩みを解決する arry を作ってみた(PHP Advent Calendar jp 2011 Day 2)
2011/12/03 tottokug phpcloudを使ってみた
2011/12/04 shirokuro331 SimpleXMLでXML読み込んで縦スライドでツイート表示(PHP Advent Calendar jp 2011 4日目)
2011/12/05 yohgaki PHPのセッションアダプション脆弱性克服への道のり
2011/12/06 asao_jp PHPからlocalStorageに書き込み・読み込み(PHP Advent JP 2011)
2011/12/07 scriptwork DateTimeクラスの落とし穴と対策 : PHP Advent Calendar jp 2011 Day 7
2011/12/08 koyhoge 子プロセス制御ふたたび : PHP Advent Calendar jp 2011 Day 8
2011/12/09 takuya_1st includeとextractの組み合わせでテンプレート処理を作る。PHPのAdvent Calender #9
2011/12/10 calpo22 PyrusでプロジェクトローカルなPEARライブラリインストール : PHP Advent Calendar jp 2011 Day 10
2011/12/11 kokkekun エラーハンドラと例外ハンドラによるエラー処理 (PHP Advent Calendar jp 2011 Day 11)
2011/12/12 kashioka 2.6公開間近!!Ethnaを5分でインストール
2011/12/13 redsnow_ PHPを使ってFQLに入門してみる(PHP Advent Calendar jp 2011 Day 13)
2011/12/14 msng PHP のソースコードを読みやすくするための工夫あれこれ #phpadvent2011
2011/12/15 bimihoujyun PHP5.4の新機能、「trait」を知る!(PHP Advent Calendar jp 2011Day15)
2011/12/16 hajikami [PHP] == による文字列比較をしてはいけないことを理解する #phpadvent2011 16th
2011/12/17 omoon isset() 関数にご用心! ( #phpadvent2011 Day 17 )
2011/12/18 DaiMotoh PHPでRESTful:PHP Advent Calendar #18
2011/12/19 basuke フレームワークで語るMVCの話 : PHP Advent Calendar #19
2011/12/20 slumbers99 Eclipse と Xdebug で PHP をステップ実行 PHP Advent Calendar jp 2011 #phpadvent2011
2011/12/21 tsuyoshikawa “PHP Apocalypse”を開催しました!
2011/12/22 aods1004 [資格試験][PHP] PHP5技術者認定初級試験を受けてきました PHP Advent Calendar jp 2011
2011/12/23 bornknow108 PHPでIPMessanger
2011/12/24 Hiraku PHPとgoto文 (PHP Advent Calendar 2011 24日目)
2011/12/25 yoya Windows で PHP を build する
2011/12/26 rti hiphop php でPHPからジェネレートされたC++コードを読んでみよう。

=

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 さんです。お楽しみにー。

PHPerの悩みを解決する arry を作ってみた(PHP Advent Calendar jp 2011 Day 2)

  • 2011-12-02 (金)
  • PHP
この記事の所要時間: 359

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

shin1x1/arry – GitHub

本当はSPLで

そんな arry ですが、array系関数の代わりとして使うにはまだまだ実装が足りません。

実はこれを書いた理由は SPL でこういった実装が欲しかったからなんですね。ArrayObject もありますが、実装メソッドが少なく、完全に連想配列をメソッドで操作するというわけにはいきません。

arry を膨らませていっても良いのですが、PHP 標準の SPL でこういったクラスが欲しいですね。

さて PHP Advent Calendar jp 2011 3日目は、AWS の貴公子 @tottokug さんです。どんなネタが飛び出すか楽しみですね!

Home > アーカイブ > 2011-12

検索
フィード
メタ情報

Return to page top