Home

Shin x blog

Zend PHP 5 Certification self test

  • 2007-03-13 (火)
  • PHP
この記事の所要時間: 19

Zend社のサイトにZend認定資格「Zend PHP 5 Certification」のSelf Testがあるようです。

いちおうベンダ資格ホルダー(wなのでチャレンジしてみました。

結果は「6/8」という微妙な得点。。。

まあ思ったよりは良かったのでチャレンジしてみようかな。(こういう作戦か?)

<ちょい脱線>

ベンダ資格は「資格なんか何の役に立たない」とバカにされる向きもありますが、あると割と便利です。特に初対面の相手には対して簡潔にスキルが証明できるという点ではそれなりに効果があると思います。

(こう言うと「資格なんかあてにならない。資格は持っているが使えないヤツを知っている。」と反論してくる人がいるのですが、これは資格があろうと無かろうと同じ事で、相手が資格を持っていても盲信しなければ良い事だと思います。)

もちろんスキルを身につける事が大事なのは間違いないですが、スキルを身につける取っかかりとして資格を取るというのもありなのでは。

試験やセミナー等でお金がかかるというのは確かに何とかして欲しいところではありますが。:-p

</ちょい脱線>

ちなみにSelf Testでは正解が表示されませんので、解答を知りたい方はZend PHP5 Certification self-test – David Coallierでどうぞ。

CakePHPをWebサイトの一部で使う

この記事の所要時間: 053

以前依頼を受けた案件でこんなのがありました。

  • 現在稼働中のサイトに機能(ページ)追加
  • 実装方法はお任せ(既存のライブラリ等は使用しなくて良い)
  • 但し、Smartyは必須
  • あとSmartyテンプレート、PHPの内部エンコーディングはSJIS

仕様自体はそれほど複雑で無いのでDBライブラリ(PEAR::DBとか)+Smaryでゴリゴリ書いても良いのですが、せっかくの機会なのでCakePHPを使ってみる事にしました。

DocumentRoot以下には既に稼働中のページがあるので、イメージとしてはそこにPageControllerを置き、そこからCakePHPを呼び出すといった感じです。

(CakePHP自体を追加ディレクトリに入れるという力業もあるのですが、ファイル構成が複雑になって、メンテナンスされる方が困りそうなのと個人的にもDocumentRoot以下にライブラリがあるのは抵抗があるのでそれはやめました。。。)

構成としてはこんな感じです。

[cake] <-- CakePHPを置く
  + [app]
  + [cake]
  + [vendors]
[DocumentRoot]
  + [new]
    + index.php
    + add.php
    + update.php
    + delete.php
  + [new2]
    + index.php
    + add.php
    + update.php
    + delete.php

DocumentRoot以下では単純にCakeのappを呼びます。

<?php
$_GET&#91;'url'&#93; = '/new/index';
// cake/をinclude_pathに入れたら
include('app/webroot/index.php');
// cake/をinclude_pathに入れないなら
//include('../../cake/app/webroot/index.php');
?>

$_GET['url']に渡すパスを変えれば任意のコントローラ・アクションが呼べます。

この方法ならブラウザから見るパスとCake用のパスを異なるものにできるので小さな案件ならわりと使えるシーンはあるのではないかと思います。(突然「URLを変えてくれ」とかありません?)

Smarty関係も小ネタがあるので、それはまた書きたいと思います。

# 昨今のWebフレームワークはFrontControllerが主流ですが、PageControllerももうちょっと見直されても良いかなと思ったり。

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

  • 2007-02-25 (日)
  • PHP
この記事の所要時間: 038

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

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

<?php
function gc(RecursiveDirectoryIterator $itr, $term) {
  foreach ($itr as $elem) {
    if ($itr->hasChildren()) {
      gc($itr->getChildren(), $term);
    } else {
      if ($elem->isFile() && $elem->getMTime() < $term) {
//        unlink($elem->getPathname());
        echo $elem->getPathname() . PHP_EOL;
      }
    }
  }
}

$term = strtotime('-1 day');
gc(new RecursiveDirectoryIterator('/tmp'), $term);
?>

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

<?php
function gc($path, $term) {
  $itr = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
  foreach ($itr as $elem) {
    if ($elem->isFile() && $elem->getMTime() < $term) {
//        unlink($elem->getPathname());
      echo $elem->getPathname() . PHP_EOL;
    }
  }
}

$term = strtotime('-1 day');
gc('/tmp', $term);
?>

うーん便利。

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

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

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

2038年問題

  • 2007-02-12 (月)
  • PHP
この記事の所要時間: 039

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

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

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

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

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

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

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

  • 2007-02-12 (月)
  • PHP
この記事の所要時間: 025

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

<?php
$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);
$Data = str_ireplace("\r\n", "<br>", $Data);
$Data = str_ireplace("\n", "<br>", $Data);
$Data = str_ireplace("\r\n", "<br>", $Data);
$Data = str_ireplace("\n", "<br>", $Data);
$Data = str_ireplace("\r\n", "<br>", $Data);
$Data = str_ireplace("\n", "<br>", $Data);
$Data = str_ireplace("\r\n", "<br>", $Data);
$Data = str_ireplace("\n", "<br>", $Data);
$Data = str_ireplace("\r\n", "<br>", $Data);
$Data = str_ireplace("\n", "<br>", $Data);
$Data = str_ireplace("\r\n", "<br>", $Data);
$Data = str_ireplace("\n", "<br>", $Data);
?>

php.internals: PHP 5.2.1 crashing Apache/IIS…

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

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

PHP5.2.1リリース

  • 2007-02-12 (月)
  • PHP
この記事の所要時間: 10

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にすればメモリ制限は行われません)

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

  • 2007-02-07 (水)
  • PHP
この記事の所要時間: 112

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

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

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

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

・if(){}

<table>
<?php foreach ($list as $v) { ?>
  <tr>
    <td>
     <?php if ($v) { ?> 
       hoge
     <?php } else { ?> 
       foo
     <?php } ?> 
   </td>
  </tr>
<?php } ?>
</table>

・if: / endif;

<table>
<?php foreach ($list as $v): ?>
  <tr>
    <td>
     <?php if ($v): ?> 
       hoge
     <?php else: ?> 
       foo
     <?php endif; ?> 
   </td>
  </tr>
<?php endforeach; ?>
</table>

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

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

CakePHP1.1.13.4450&1.2.0.4451alphaリリース

この記事の所要時間: 026

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の正式リリースが一歩一歩近づいてきましたね。

FreeBSD 4.x End of Life

  • 2007-02-03 (土)
  • unix
この記事の所要時間: 029

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 Sessonコンポーネントに任意のコードが実行できる脆弱性

この記事の所要時間: 19

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()を使う必要があるのでしょうか。安全性を考えるとこういった関数は極力使わない方が吉かと。

Home

検索
フィード
メタ情報

Return to page top