Home > アーカイブ > 2006-10

2006-10

PHP開発手法いろいろ

  • 2006-10-31 (火)
  • PHP
この記事の所要時間: 231

PHP開発に有用な開発手法がPHPDeveloper.org: ZendCon 2006 Notes: Best Practices for PHP Developmentで紹介されています。

ZendCon 2006のセッションで発表された内容で、セッションの資料はMikeNaberezny.com » Best Practices of PHP Developmentに置かれています。

Source Documentation

PHPDeveloper.org: ZendCon 2006 Notes: Best Practices for PHP Development (2006-10-31)

PHPDocでコメントを書きましょう、という内容です。見知らぬコードを読む際はこれがあるとホントに有り難いです。JavaDocを書いたことがあるのでこれは実践しています。ただ自己流も混じっていてクラスの変数は普通に[//]コメントで書いてたりしてます。。。

Unit Testing

PHPDeveloper.org: ZendCon 2006 Notes: Best Practices for PHP Development (2006-10-31)

本当は全てのコードをUnitテストした方が良いのでしょうけど、複雑なモジュールについてのみ行っています。ただ効果は体感しているのでテストするコードの範囲は以前より広がっています。業務ではPHP4を使用しているのでPEAR::PHPUnitを使用しています。

また最近はフォーム入力が絡む画面ではSelenium IDEを使ってテストしています。UIのテストツールとして有用なのはもちろんですし、ただ単にフォーム入力ロボットとして使っても便利です。

Source Control

PHPDeveloper.org: ZendCon 2006 Notes: Best Practices for PHP Development (2006-10-31)

ソース管理にはSubversionを使ってます。複数のマシンでのソース同期はもちろんのこと、細かいリリースを行うWebシステムではコミット履歴が役立ちます。ある意味コミット時のコメントとソース履歴はドキュメントと言えると思います。

Deployment

PHPDeveloper.org: ZendCon 2006 Notes: Best Practices for PHP Development (2006-10-31)

これが目下の悩みどころです。自社サイトでは稼働サーバからSubversionリポジトリを見てチェックアウト(アップデート)するので問題無いのですが、お客様のサーバだとそうもいかないのが現状です。ですので現在はローカルコピーをscp等でアップロードしています。まれにアップロードする漏れが発生するのでここを上手くまとめたいですね。

Yahoo!でsymfonyを採用

  • 2006-10-29 (日)
  • PHP
この記事の所要時間: 28

Yahoo!の新サービスYahoo! Bookmarksはsymfonyで構築されているそうです。

But the real news about the new Yahoo! Bookmarks is that it was built with symfony. Why did Yahoo! choose our framework? According to Michael Salisbury, Technical Yahoo!, who was kind enough to give us his feedback, the major strengths of symfony over its competitors are:

* Great documentation
* Explicit and extensive configurability
* Active development
* Use of best-of-breed components rather than building everything again

The documentation was the first reason to choose symfony. It reaches a unique quality and coverage in the open-source world.

symfony PHP5 framework » Yahoo! bookmarks uses symfony (2006-10-29)

ドキュメントが充実していることが理由に挙がっています。フレームワーク(オープンソース)を広めるには機能や品質も大事ですが、やはりドキュメントの重要性は高いです。

このニュースはsymfonyを選ぶ良い材料になりますね。(PHPが広まる頃にも「Yahoo!が採用しているPHP」という言葉を見聞きしましたし、私も言ってました。:-))

CakePHPの前に少しsymfonyも触っていたのですが、両者を比べるとsymfonyの方がCakePHPよりも重厚なイメージがあります。CakePHPの軽快さ(良い意味で薄さ)が気に入っているのですが、中身が見えてくると「あれ?」と言った点が出てきたりしてます。もちろんこれを直せるのがオープンソースの良いところですけどね。;-)

CakePHPでも看板となるサイトを作っていきたいところです。

PHPのちょっとしたコツ

  • 2006-10-27 (金)
  • PHP
この記事の所要時間: 1115

ウノウラボ Unoh Labs: PHPのちょっとしたコツに興味深い内容が書かれています。

1. array_pushは遅い
いくつかのBlogで語られてることですが、array_pushは、次のような書き方のほうが早いそうです。

	//array_puth($array, \'arraydata\');
	$array[] = \'arraydata\';

ウノウラボ Unoh Labs: PHPのちょっとしたコツ

これはほんとあちこちで言われていますね。実際にどの程度違うかベンチマークを取ってみました。

< ?php
require_once 'Benchmark/Timer.php';

$max = 10000;

$timer = new Benchmark_Timer();
$timer->start();

$array = array();
for ($i = 0 ; $i < $max ; $i++) {
  $array&#91;&#93; = $i;
}
$timer->setMarker('statement');

$array = array();
for ($i = 0 ; $i < $max ; $i++) {
  array_push($array, $i);
}
$timer->setMarker('array_push');

$timer->stop();
$timer->display();
?>

予想通りarray_pushの方が遅く、PHP4で約1.3倍、PHP5で1.6倍遅い結果になりました。

■PHP 4.4.4 (cli)
--------------------------------------------------------
statement   1161939536.23285200   0.012247085571289  43.97%
--------------------------------------------------------
array_push  1161939536.24843900   0.015587091445923  55.97%
--------------------------------------------------------
■PHP 5.1.6 (cli)
--------------------------------------------------------
statement   1161939530.12842400   0.0053808689117432  37.91%
--------------------------------------------------------
array_push  1161939530.13722100   0.0087971687316895  61.97%
--------------------------------------------------------

2. array_key_existsよりハッシュを使え
array_searchは、毎回全データを検索するので遅いです。
データに配列の順序が関係ないなら、連想配列 + issetを使うほうが高速です。

ウノウラボ Unoh Labs: PHPのちょっとしたコツ

こちらもベンチマークを取ってみました。

< ?php
require_once 'Benchmark/Timer.php';

$max = 10000;
$array = array('abc' => 'abc', 'null' => null);

$timer = new Benchmark_Timer();
$timer->start();

for ($i = 0 ; $i < $max ; $i++) {
  isset($array&#91;'abc'&#93;);
  isset($array&#91;'null'&#93;);
  isset($array&#91;'none'&#93;);
}
$timer->setMarker('isset');

for ($i = 0 ; $i < $max ; $i++) {
  array_key_exists('abc', $array);
  array_key_exists('null', $array);
  array_key_exists('none', $array);
}
$timer->setMarker('array_key_exists');

$timer->stop();
$timer->display();
?>

やはりarray_key_existsの方が遅いです。こちらはarray_pushより速度差がの方が大きく、PHP4で約2倍、PHP5で約4倍(!)遅い結果になりました。

■PHP 4.4.4 (cli)
---------------------------------------------------------------
isset              1161938594.14881000   0.014264822006226  33.43%
---------------------------------------------------------------
array_key_exists   1161938594.17719700   0.028387069702148  66.53%
---------------------------------------------------------------
■PHP 5.1.6 (cli)
---------------------------------------------------------------
isset              1161938597.88852400   0.0043120384216309  19.44%
---------------------------------------------------------------
array_key_exists   1161938597.90638100   0.01785683631897  80.50%
--------------------------------------------------------

ただarray_key_existsとissetは全く同じ挙動を示すわけではなく、配列にキーが定義されているかを厳密に調べるにはarray_key_existsを使わざるを得ないようです。(@see PHPマニュアル-isset

4. if文は「===」を使う

ウノウラボ Unoh Labs: PHPのちょっとしたコツ

これは趣味の問題かもしれませんが、odz buffer – PHPのイテレーションの話とかでodzさんが書かれている形が自然だと思います。特に

 if (is_null($null) === false) {

はis_null()がtrue or false以外の値を返すようで引っかかりました。(マニュアルを見直しました。:-))

5. countは配列数を毎回数えてる これを知ったのは、Pukiwkiのクリーンアップの記事を見たときなのですが。 countは配列の件数を数えるらしいので次のような書き方に直したほうが無難です。

ウノウラボ Unoh Labs: PHPのちょっとしたコツ

count()が実行毎に件数を数えるわけではないのはエントリで触れられているのですが、このtips自体が無意味なわけではありません。

count()の値をループ前に取得しておくのとループ内で呼ぶのとでベンチマークを取ってみると以下のようにやはり差が出ました。

※ソースはodzさんのを編集させていただきました。

< ?php
require_once 'Benchmark/Timer.php';

function test_count_loop($array, $iterate) {
    for ($j = 0; $j < $iterate; $j++) {
        $n = 0;
        $count = count($array);
        for ($i = 0; $i < $count; $i++) {
            $n = $array&#91;$i&#93;;
        }
    }
}

function test_count_loop_count($array, $iterate) {
    for ($j = 0; $j < $iterate; $j++) {
        $n = 0;
        for ($i = 0; $i < count($array); $i++) {
            $n = $array&#91;$i&#93;;
        }
    }
}

function test_foreach($array, $iterate) {
    for ($j = 0; $j < $iterate; $j++) {
        foreach ($array as $i) {
            $n = $i;
        }
    }
}

$a = range(0, 9999);
$b = range(0, 9999);
$c = range(0, 9999);

$timer = new Benchmark_Timer;

$timer->start();

test_count_loop($a, 1000);
$timer->setMarker('count_loop');

test_count_loop_count($b, 1000);
$timer->setMarker('count_loop_count');

test_foreach($c, 1000);
$timer->setMarker('test_foreach');

$timer->stop();
$timer->display();
?>
■PHP 4.4.4 (cli)
---------------------------------------------------------------
count_loop         1161943146.86602700   10.211816072464  34.91%
---------------------------------------------------------------
count_loop_count   1161943160.60222800   13.736200809479  46.95%
---------------------------------------------------------------
test_foreach       1161943165.90888800   5.3066601753235  18.14%
---------------------------------------------------------------
■PHP 5.1.6 (cli)
---------------------------------------------------------------
count_loop         1161943103.61103900   2.0879490375519  24.69%
---------------------------------------------------------------
count_loop_count   1161943108.41284200   4.80180311203   56.79%
---------------------------------------------------------------
test_foreach       1161943109.97873100   1.5658888816833  18.52%
---------------------------------------------------------------

以前はforよりforeachの方が速い遅いという話を聞いた事があったのですが、いつのまにかforeachの方が速くなってますね。普段は多少のオーバーヘッドは気にせずforeachを使っていたのですが、これで大手を振って使えます。;-)

CakePHP bake2タスクを作る

この記事の所要時間: 152

CakePHP bake2でテーブルひな形を作るでご紹介したように、1.2系に含まれているbake2では任意のタスクを呼びだせる設計になっています。なかなか面白い機能なので試しにHelloタスクを作ってみました。

bake2タスクはBakeTaskクラスを継承します。オーバーライドするメソッドはexecute()とhelp()メソッドです。名前のとおりexecute()メソッドではタスク処理、help()メソッドではタスクのヘルプを表示します。

[cake/script/tasks/hello_task.php]

< ?php
class HelloTask extends BakeTask {
    function execute($params) {
        foreach ($params as $param) {
            printf("Hello %s.\n", $param);
        }
    }

    function help() {
        echo "The Hello task \n";
        echo "Usage: bake2 hello name\n";
    }
}
?>

Helloタスクを呼びます。

FooとBarがHelloタスクへのパラメータになります。ソースを見ても分かるようにパラメータはexecute()メソッドに配列で渡されます。

$ php -f bake2.php hello Foo Bar
Hello Foo.
Hello Bar.

helpをパラメータにするとHelloタスクのhelp()メソッドが呼ばれ、ヘルプが表示されます。

$ php -f bake2.php hello help
The Hello task 
Usage: bake2 hello name 

 

単純ですがタスクを実行する仕組みが用意されたのは嬉しいです。コードジェネレータやDBのセットアップなど開発に役立つタスクを増やしていきたいですね。

CakePHP bake2でテーブルひな形を作る

この記事の所要時間: 114

テーブル生成・削除SQLを作成するタスクが紹介されています。

To make it a bit easier to write the sql scripts for creating and dropping tables, I wrote a simple bake task. There isn’t much to say about it, so I show you just an example.

cakebaker » A simple task to generate sql scripts (2006-10-26)

1.2系に付属されているbake2用のタスクです。

bake2.phpにテーブル名を指定すると、id(プライマリキー)・created(レコード生成日時)・modified(レコード更新日時)を持つテーブルの生成・削除SQLが[/app/config/sql]以下に生成されます。どのカラムもフレームワークで参照・更新されるカラムですのでひな形に含まれていると便利ですね。

ただ生成されるSQLがMySQL用なので他DBの場合はデータ型などを変更する必要があります。(生成対象のDBを[/app/config/database.php]を見て切り替えるという手もありです。)

bake2.phpを見ると任意のタスクを追加していけるようなので、こちらも色々と使えそうです。

レジでクレジットカードを出す

この記事の所要時間: 058

レジでクレジットカードを出す時、表を向けるか裏を向けるか迷いませんか?

普通は表を向けて出すとは思うのですが、表にはカード会社にカード番号・有効期限・所有者名が印字されています。この情報をカメラ等で記録すればカード自体が無くてもインターネット上で買い物が可能です。かたや裏側にはシークレットコードや署名があり、これまた第三者に見せるものではありません。

裏を向けようと思った時もあったのですが、カードのデザイン(種類)を見られるのがイヤでそうしているようなのでやめました。それに返される時は表向きなんで(裏向きで出す)意味無いですし。

あとカードを店員の方に渡した後、(店員が)商品を袋詰めしたり、領収書を書いてもらう間、カードをカウンター(カード自体は店員側だが客側からカードが見える位置)に放置したまま作業を行う方がいて、なんだかなぁーという思いをする事があります。釣り銭と同じ感覚で作業をしているのでしょうけど、できれば決済が終わったらすぐに返して欲しいところです。

まあ気にし過ぎといえばそうなのですが、大事なものですので少し気を使って頂くと嬉しいです、はい。

Shibuya.pm テクニカルトーク #7

この記事の所要時間: 253

Shibuya.pm テクニカルトーク #7にストリーミング+IRCで参加してみました。

もちろんPerlが中心なのですが、Perl自体よりその周辺の話題が多かったのでとても勉強になりました。各セッションとも技術ネタあり笑いネタありで楽しかったです。

Amazon Web Services, Elastic Compute CloudとLAMP(Emerson Mills)

EC2サーバはへぇーと言った感じ。サーバにログインした人が多々いた。;-)

Catalyst+Lighttpdテクニック (typester)

lighttpdのinclude_shellは良い感じ。apacheでも同じような事ができないのかな?

■PMConnect: Perl – SpiderMonkeyバインディング(樋口証)

JavaScriptとPerlの連携は面白そうだけで実際の使いどころがピンと来なかった。
ただSpiderMonkeyは意味無く何かに組み込んでみたくなったり。
PHPでも似たようなあるかと思ったけどomar kilani – projects – php-jsくらいだった。
ちなみにPHPからPerlを使うにはPECL :: Package :: perlがあります。

実践 MogileFS 構築事例 ~ Catalystと一緒 ~(ZIGOROu)

Perlで書かれた分散ファイルシステム。PHPクライアントはこんなのがありました。
このあたりから時間が押してきたようでテンポが異様に速かった。。。

Using Test::Base (miyagawa)

.phptと同じような感じ?宮川さんだぁーと思っていたら終わっていた。;-)

ppm パッケージができるまで (charsbar)

ppmは使うなと。:-)

俺とマッシュアップ (上野宣)

まさに俺2.0。:-)
(笑い)ネタ満載だったが実は技術的にも面白かった。サービスとして成り立つかも。

今空前のブーム第2部:deploy tool編 (松野徳大)

スライドが面白かった。:-)

CDBI to DBIC (nekokak:小林篤)

がっつりPerlネタだったので覚えてなかったり。。。

自然文書から日本の住所を頑張って抽出 (Yappo)

郵便番号から住所を引いて、住所を都道府県・市町村・それ以降に分解するといった処理を作っていたのでうなずきながら見てました。(北海道と京都の住所はネタとしか思えない。。。)
boofy!!

SVK による Plagger プラグイン開発プロセス (mizzy)

svkをgoogleで調べている間に終わっていたもよう。。。

Apache わっふるモジュールで SQL injection 対策 (竹迫良範)

apacheモジュールでHTTPパラメータをフィルタリングする話。IRCで誰かが触れていたけどWAFは効果は分かるけど設定の煩雑さが問題になりそう。
どのレイヤーでフィルターをかけるかは悩ましいところです。
PHPも5.2ではfileterモジュールがデフォルトで使えるようになるのでなかなかタイムリーな話でした。

 

ストリーミングとIRCのおかげで大阪からセミナーに参加する事ができました。皆さんありがとうございました。

PHPオブジェクトは配列より遅いか

  • 2006-10-17 (火)
  • PHP
この記事の所要時間: 352

以前のエントリでもあったようにPHPのオブジェクトは配列より遅いという印象があります。

実際にどの程度違いがあるかをPHP4/5で計ってみました。

計測方法

各ソースを100回実行した平均を出しています。実行環境はPHP4は4.4.4、PHP5は5.1.6(共にCLI版)です。実行時間の計測にはPEAR::Benchmark_Timerを使いました。

各ソースでは配列、Hogeクラス(オブジェクト変数なし)、Hoge2クラス(オブジェクト変数あり)を計測しています。なおHoge/Hoge2クラスは以下になります。

< ?php
class Hoge {
}

class Hoge2 {
  var $id;
  var $name;
}
?>

生成

配列・オブジェクトを1000回生成しています。[ソース]

PHP4

実行時間 比率
array 0.000901 1.000000
object 0.001261 1.399353
object2 0.001592 1.767612

PHP5

実行時間 比率
array 0.000334 1.000000
object 0.000721 2.156477
object2 0.000974 2.913505

やはり配列よりオブジェクトの方が遅いですね。オブジェクト同士でもオブジェクト変数を定義してある方が遅くなっています。

意外だったのがPHP4と5で速度比率の差が大きいことです。配列、オブジェクト共にPHP5の方が速いのですが、オブジェクトに比べて配列が圧倒的に速くなっているため速度差が大きくなっています。

書き

既に作成されている配列・オブジェクトに2つの値を1000回設定しています。[ソース]

PHP4

実行時間 比率
array 0.001422 1.000000
object 0.001336 0.939508
object2 0.001325 0.932387

PHP5

実行時間 比率
array 0.000593 1.000000
object 0.000761 1.283243
object2 0.000852 1.437950

「生成」ほどの速度差はありませんでしたが、PHP4では若干配列が遅く、PHP5ではオブジェクトが遅かったです。ここでもPHP5の方が速度差が大きいですね。PHP5ではobject2(オブジェクト変数あり)の方が遅いのはなぜなのでしょう。(オブジェクト変数が定義されている方が速いような気がするのですが)

読み

既に作成されている配列・オブジェクトの2つの値を1000回取得しています。[ソース]

PHP4

実行時間 比率
array 0.001971 1.000000
object 0.001867 0.947329
object2 0.001859 0.943242

PHP5

実行時間 比率
array 0.000710 1.000000
object 0.000771 1.086580
object2 0.000854 1.202299

「生成」「書き」に比べてほとんど差はありませんね。ただ「書き」と同じくPHP5のobject2は若干遅いです。

Recordset

DBから値を読むシーンを想定して、生成・書き・読みを1000回繰り返しています。[ソース]

PHP4

実行時間 比率
array 0.003775 1.000000
object 0.003988 1.056424
object2 0.004052 1.073377

PHP5

実行時間 比率
array 0.001730 1.000000
object 0.002057 1.189017
object2 0.002616 1.512139

こうして見るとPHP4/5共に配列でもオブジェクトでもそれほど差がありませんね。ただやはりPHP5のobject2だけが遅いのが気になります。

 

生成以外は配列とオブジェクトでそれほど差が生まれなかったのは意外でした。ただ以前DBから大量のレコードセットを配列に格納した場合とオブジェクトに格納した場合で大きなパフォーマンス差が生まれた事があったので、メモリ消費量など実行時間以外の要素で差があるのかもしれません。こちらもまた検証してみたいですね。

# PHP4と5でおおよそ2倍程度のパフォーマンス差がありました。PHP5を使う理由がまた一つ増えましたね。はい。

携帯キャリアIPアドレス

この記事の所要時間: 59

携帯向けサイトでIPアドレスによるアクセス制限する際に設定する各キャリアのIPアドレスをメモしておきます。

  • 2010/04/16追記:softbank IP をsoftbankサイトに合わせて修正
  • 2010/03/01追記:au IP をauサイトに合わせて修正
  • 2009/10/26追記:au IP をauサイトに合わせて修正
  • 2009/03/09追記:softbank サイト移転に伴い、リンク先修正
  • 2009/03/09追記:au IP をauサイトに合わせて修正
  • 2009/03/09追記:docomo(124.146.174.0/24, 124.146.175.0/24)追加
  • 2008/07/08追記:au(121.111.227.160/27)追加
  • 2008/01/17追記:au(121.111.227.0/25)追加
  • 2007/11/08追記:au(121.111.231.160/27)追加
  • 2007/10/10追記:SoftBank(123.108.236.0/24、123.108.237.0/27、202.253.96.224/27)追加、(210.169.130.112/28)更新
  • 2007/09/03追記:au(121.111.231.0/25)追加
  • 2007/06/13追記:DoCoMo URL変更、au(219.125.145.0/25)追加
  • 2007/02/16追記:au(219.108.157.0/25、219.125.151.128/25)追加
  • 2006/11/25追記:SoftBank(202.253.96.248/29、210.169.130.112/29、210.169.130.120/29)追加

DoCoMo from 作ろうiモードコンテンツ:iモードセンタの各種情報 | サービス・機能 | NTTドコモ

210.153.84.0/24
210.136.161.0/24
210.153.86.0/24
124.146.174.0/24
124.146.175.0/24

au from KDDI au: 技術情報 > IPアドレス帯域

210.230.128.224/28
121.111.227.160/27
61.117.1.0/28
219.108.158.0/27
219.125.146.0/28
61.117.2.32/29
61.117.2.40/29
219.108.158.40/29
219.125.148.0/25
222.5.63.0/25
222.5.63.128/25
222.5.62.128/25
59.135.38.128/25
219.108.157.0/25
219.125.145.0/25
121.111.231.0/25
121.111.227.0/25
118.152.214.192/26
118.159.131.0/25
118.159.133.0/25
118.159.132.160/27
111.86.142.0/26
111.86.141.64/26
111.86.141.128/26
111.86.141.192/26

softbank from WEB & NETWORK IPアドレス

123.108.237.0/27
202.253.96.224/27
210.146.7.192/26
210.175.1.128/25

apacheの設定例です。

order deny,allow
deny from all
# DoCoMo
allow from 210.153.84.0/24
allow from 210.136.161.0/24
allow from 210.153.86.0/24
allow from 124.146.174.0/24
allow from 124.146.175.0/24
# au
allow from 210.230.128.224/28
allow from 121.111.227.160/27
allow from 61.117.1.0/28
allow from 219.108.158.0/27
allow from 219.125.146.0/28
allow from 61.117.2.32/29
allow from 61.117.2.40/29
allow from 219.108.158.40/29
allow from 219.125.148.0/25
allow from 222.5.63.0/25
allow from 222.5.63.128/25
allow from 222.5.62.128/25
allow from 59.135.38.128/25
allow from 219.108.157.0/25
allow from 219.125.145.0/25
allow from 121.111.231.0/25
allow from 121.111.227.0/25
allow from 118.152.214.192/26
allow from 118.159.131.0/25
allow from 118.159.133.0/25
allow from 118.159.132.160/27
allow from 111.86.142.0/26
allow from 111.86.141.64/26
allow from 111.86.141.128/26
allow from 111.86.141.192/26
# softbank
allow from 123.108.237.0/27
allow from 202.253.96.224/27
allow from 210.146.7.192/26
allow from 210.175.1.128/25

CakePHPのコーディング規約

この記事の所要時間: 113

CakePHPにもコーディング規約があります。

Cake Developers will use the following coding standards.
It is recommended that others developing CakeIngredients follow the same standards.

Developement/CodingStandards – CakePHP : Rapid Development Framework – Trac (2006-10-12)

PHP.PL DevTeamのコーディング規約が元になっているようです。内容をざっと見た感じではZend Frameworkのコーディング規約に似ていますね。

まあフレームワーク自体が規約に従っていないのはアレですが。

We agreed on using four space characters for indentation.

Developement/CodingStandards – CakePHP : Rapid Development Framework – Trac (2006-10-12)

規約ではインデントは4スペースになってますが、[cake/libs/model/model.php]等々を見るとインデントはtabになってたり。。

Home > アーカイブ > 2006-10

検索
フィード
メタ情報

Return to page top