iPhone/iPadのホーム画面コンテスト開催中!賞品は iTunes カード!

Monthly Archive2007/02



PHP 2007/02/25 15:25

RecursiveDirectoryIteratorで再帰なしでファイル走査

あるディレクトリ内のファイルを走査して各ファイルに処理を行うなんて時に今までは再帰を使って実装していました。

PHP5な環境ならRecursiveDirectoryIteratorを使ってこんな感じで作ってました。

PHP:
  1. <?php
  2. function gc(RecursiveDirectoryIterator $itr, $term) {
  3.   foreach ($itr as $elem) {
  4.     if ($itr->hasChildren()) {
  5.       gc($itr->getChildren(), $term);
  6.     } else {
  7.       if ($elem->isFile() && $elem->getMTime() <$term) {
  8. //        unlink($elem->getPathname());
  9.         echo $elem->getPathname() . PHP_EOL;
  10.       }
  11.     }
  12.   }
  13. }
  14.  
  15. $term = strtotime('-1 day');
  16. gc(new RecursiveDirectoryIterator('/tmp'), $term);
  17. ?>

これRecursiveIteratorIterator(凄い名前。。。)を使えば再帰なしで書けるんですね。

PHP:
  1. <?php
  2. function gc($path, $term) {
  3.   $itr = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
  4.   foreach ($itr as $elem) {
  5.     if ($elem->isFile() && $elem->getMTime() <$term) {
  6. //        unlink($elem->getPathname());
  7.       echo $elem->getPathname() . PHP_EOL;
  8.     }
  9.   }
  10. }
  11.  
  12. $term = strtotime('-1 day');
  13. gc('/tmp', $term);
  14. ?>

うーん便利。

GoogleCodeSearchで見るとPHPUnitやらPHP_CodeSnifferで使われていました。

SPLはもうちょっと情報が欲しいですね。

参考:PHPのSPLを使用してディレクトリを操作する - PHPプロ!ニュース

PHP 2007/02/12 18:42

2038年問題

32ビットPCでは数値を扱う限界があります。

PHPで日付を扱う事が多いと思いますが、UNIXタイムスタンプを利用すると数値 の限界に引っかかる事を知っておく必要があります。

【PHP TIPS】 8. 2038年問題:ITpro

エントリではPEAR::Dateが紹介されていますが、ここでは別の方法を。

5.2.0以降になりますが、組み込みクラスのDateTimeクラスならこの問題に対応しています。

PHP:
  1. <?php
  2. $date = new DateTime('2038-1-19 12:14:07');
  3. echo $date->format('Y/m/d H:i:s') . PHP_EOL;
  4. $date->modify("+1 day");
  5. echo $date->format('Y/m/d H:i:s') . PHP_EOL;
  6. $date->setDate(3000,12,31);
  7. echo $date->format('Y/m/d H:i:s') . PHP_EOL;
  8. ?>

CODE:
  1. $ php 2038.php
  2. 2038/01/19 12:14:07
  3. 2038/01/20 12:14:07
  4. 3000/12/31 12:14:07

PHP 2007/02/12 15:01

PHP5.2.1 str_ireplaceでzend_mm_heap corruptedが発生する

PHP5.2.1でstr_ireplaceを使用するとzend_mm_heap corruptedが発生して処理が止まってしまう不具合があるようです。

PHP:
  1. <?php
  2. $Data = "Change tracking and management software designed to watch for abnormal system behavior.\nSuggest features, report bugs, or ask questions here."; $Data = str_ireplace("\r\n", "<br>", $Data); $Data = str_ireplace("\n", "<br>", $Data);
  3. $Data = str_ireplace("\r\n", "<br>", $Data);
  4. $Data = str_ireplace("\n", "<br>", $Data);
  5. $Data = str_ireplace("\r\n", "<br>", $Data);
  6. $Data = str_ireplace("\n", "<br>", $Data);
  7. $Data = str_ireplace("\r\n", "<br>", $Data);
  8. $Data = str_ireplace("\n", "<br>", $Data);
  9. $Data = str_ireplace("\r\n", "<br>", $Data);
  10. $Data = str_ireplace("\n", "<br>", $Data);
  11. $Data = str_ireplace("\r\n", "<br>", $Data);
  12. $Data = str_ireplace("\n", "<br>", $Data);
  13. $Data = str_ireplace("\r\n", "<br>", $Data);
  14. $Data = str_ireplace("\n", "<br>", $Data);
  15. ?>

php.internals: PHP 5.2.1 crashing Apache/IIS...

私の環境でも再現することができました。

修正パッチがありますのでstr_ireplaceを使用される方は適用されると良いでしょう。

PHP 2007/02/12 14:43

PHP5.2.1リリース

PHP5.2.1がリリースされています。

The PHP development team would like to announce the immediate availability of PHP 5.2.1. This release is a major stability and security enhancement of the 5.X branch, and all users are strongly encouraged to upgrade to it as soon as possible.

PHP: PHP 5.2.1 Release Announcement

PHP5ユーザの方はアップグレードを。

本リリースでは--enable-memory-limit無しでもmemory_limitが有効になっています。

デフォルトではmemory_limit=128Mが設定されるのであまり問題になるシーンは無いと思いますが、メモリを食う処理をしている箇所にはご注意下さい。(ちなみにmemory_limit=-1にすればメモリ制限は行われません)

PHP 2007/02/07 11:37

if: / endif;が使えなくなる?

php.internals: Removing if: endif; syntaxでif: / endif;構文を削除しようとする提案が出ています。

ビューテンプレート等でHTML内にPHPコードを埋める時に使っている例を見るので無くなると困る人はいると思います。(私は困ります。)

これがあるとforeachとifとの組み合わせで入れ子になった時などブロックの対応が分かりやすくて良いです。

あと単純にif: / endif;の方が違和感無いように感じるのですがどうでしょう。

・if(){}

PHP:
  1. <table>
  2. <?php foreach ($list as $v) { ?>
  3.   <tr>
  4.     <td>
  5.      <?php if ($v) { ?>
  6.        hoge
  7.      <?php } else { ?>
  8.        foo
  9.      <?php } ?>
  10.    </td>
  11.   </tr>
  12. <?php } ?>
  13. </table>

・if: / endif;

PHP:
  1. <table>
  2. <?php foreach ($list as $v): ?>
  3.   <tr>
  4.     <td>
  5.      <?php if ($v): ?>
  6.        hoge
  7.      <?php else: ?>
  8.        foo
  9.      <?php endif; ?>
  10.    </td>
  11.   </tr>
  12. <?php endforeach; ?>
  13. </table>

この例だときちんとインデントしているのでまだ{}でも良いのですが、デザイナさんがツールで編集するとインデントが崩れていたりして結構すごい事になってたりします。。。

冒頭のhttp://news.php.net/php.internals/では早速反対意見が出ているようですし、無くならないとは思いますが。

CakePHP & PHP & 雑記 2007/02/06 00:30

CakePHP1.1.13.4450&1.2.0.4451alphaリリース

CakePHP1.1.13.4450&1.2.0.4451alphaがリリースされています。

1.1.13.4450はバグフィックスリリース、1.2.0.4451alphaは1.2系のアルファ版となっています。

双方ともに多くの変更・修正が行われており、CakePHP Sessonコンポーネントに任意のコードが実行できる脆弱性 | Shin x blogも修正されています。

1.2の正式リリースが一歩一歩近づいてきましたね。

unix 2007/02/03 01:33

FreeBSD 4.x End of Life

FreeBSD 4.11 End of Life - 4.11採用のベンダは6系への計画的移行を (MYCOMジャーナル)

FreeBSD4.xがEnd of Lifeをむかえました。4.xを使っているところは多いのでこれは影響が大きそうですね。(まあ本来はEOLをむかえる前に対応しておくべきでしょうけど)

ウチでも4.11サーバがあるので、どれに移行するかを思案中。

素直に6.xへ移るか、CentOSへ移るか、はてさて。

他の4.xユーザさんはどこに向かうのでしょうか。

CakePHP & 雑記 2007/02/02 22:15

CakePHP Sessonコンポーネントに任意のコードが実行できる脆弱性

Sessionコンポーネントですが値を保存するキーに特定の値を仕込むと任意のコードが実行できる脆弱性があります。

この問題は1.1/1.2どちらにも存在します。

Sessionコンポーネントの親クラスであるCakeSessionクラス[cake/libs/session.php]では、セッション関連の処理にeval()を使用しています。このeval()に渡すPHPコード(evalで実行されるコード)を生成する過程で、セッションキーを使用するのですが、変数のチェックが不十分なため、任意の処理を書くことができてしまいます。

通常セッションのキーにGET/POST/COOKIEといった外部からの値は使用しないと思うのであまり影響は無いかもしれませんが、もしセッションキーにこれらの値を使用している場合は値のチェックを厳密に行う必要がありますのでご注意を。

念のためtikcet投げておいたのでいずれ修正されるかと思います。
早速パッチを適用してもらいました。openだったのは正味20分くらいでした。(早!)
Thanks phpnut!!

[.]区切りのセッションキーを配列にして使うためにeval()を使っているのですが、これはわざわざeval()を使う必要があるのでしょうか。安全性を考えるとこういった関数は極力使わない方が吉かと。

PHP & 雑記 2007/02/02 19:48

PHPテクニカルセミナーin東京に参加してきました

PHPテクニカルセミナーin東京に参加してきました。

関西在住なので平日+東京でのセミナーは普段なら参加しないのですが、Do You PHP?shimookaさんが参加されるという事だったので思い切って申し込みしました。

セミナーはフレームワークについての内容でとても興味深いお話が聞けました。Webで読むだけでなく実際にお話を聞くと理解度が格段に違います。これだけで十分来た甲斐がありました。

さらにその後の懇親会が楽しすぎました。

正直こういった場はあまり得意ではないのですが、立食形式が良かったのか、参加者の方々が良かったのか、風邪+薬で頭がボーとしてたのが良かったか;-)、この日はとても楽しく色々な方とお話ができました。

目的のshimookaさんは私がイメージしていたままでとても紳士な方でした。技術の話題から家庭の話題まで少しの時間ですがお話しできてとても楽しかったです。

あとhaltさんに「blog見てます」と声をかけてもらったのも嬉しかったです。声をかけることはあってもかけられた事は無いもので。(実はその場ではhaltさんだと分かっていなかったのですが、翌日blogのコメントで知りました。。。)

他にも色々な方々とお話したのですが、お名前を出して良いものやらと思い自粛します。。。

今回はホント東京まで行って良かったです。ありがとうございました。

# すっかり味を占めてしまったのでまた参加してみたいと思います。また相手してやってください。;-)