Home > PHP

PHP Archive

CakePHP 1.1環境で1.2を試す

この記事の所要時間: 212

1.1.x環境で1.2.xフレームワークを試す方法です。

まずcake1.2をCakeForge or リポジトリからダウンロードして設置します。ここでは[app/vendors/cake1.2]に設置します。

次に1.1.xの[app/]から1.2フレークワークを読み込みます。

1.1.xの[app/webroot/index.php]にてCAKE_CORE_INCLUDE_PATHの定義を以下のように変更すればokです。

< ?php
// snip
/**
 * This only needs to be changed if the cake installed libs are located
 * outside of the distributed directory structure.
 */
	if (!defined('CAKE_CORE_INCLUDE_PATH')) {
		 //define ('CAKE_CORE_INCLUDE_PATH', FULL PATH TO DIRECTORY WHERE CAKE CORE IS INSTALLED DO NOT ADD A TRAILING DIRECTORY SEPARATOR';
		 //You should also use the DS define to seperate your directories
//		 define('CAKE_CORE_INCLUDE_PATH', ROOT);
		 define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . APP_DIR . DS . 'vendors' . DS . 'cake1.2');
	}
// snip
?>

これで[app/vendors/cake1.2/cake]がフレームワークとして読み込まれます。

また別の方法として、include_pathに[app/vendors/cake1.2]を記述する方法もあります。

こちらの場合、php.iniやhttpd.conf、.htaccessなど設定ファイルに記述する場合は問題無いですが、PHPスクリプトに記述する場合は[app/webroot/index.php]の62行目以前に記述する必要があります。

1.2を試すだけでなく、1.1.x用に書いたアプリケーションが1.2で正しく動作するか確かめるのにも使えそうです。(フレームワーク側にこんな機能があっても良いですけどね)

続Win版PHPのコンパイラ

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

Win版PHPのコンパイラにてWIN版のPHPをビルドしている環境がVC++6.0からVC++8.0へ変わるかもしれないと書いていたのですが、結局元に戻るようです。

We are back to using VC6 compiler for the official PHP Windows build. VC8 (Visual Studio 2005) was causing trouble with loading the new C runtime.

Back to VC6 for PHP Windows build – Edin Kadribašić

CGI・CLI・IIS用のfastcgiでは問題無かったようですが、sapiでextensionを読み込む時に問題が発生したようです。ActiveStateやApacheなど他のプロジェクトではVC++6.0が使われており、それに習いApacheがVC++6.0でコンパイルされているため、異なるCランタイムで動作させるのに問題があるようです。そこで元に戻した方が良いだろうと判断したみたいですね。

前回のベンチマークではVC++8.0でもそれほど大きくパフォーマンスが向上したわけではないようですし、安定性を考えると賢明な判断かもしれません。(残念ではありますけど)

Vista登場後もVC++6.0はまだまだ活躍しそうですね。

CakePHPとRuby on Railsトレンド

この記事の所要時間: 045

SDozonoさんのエントリにインスパイアされました。:-)

恒例のGoogleトレンド。

CakePHP のおいしい食べ方: Zend Framework が間もなく Symfony をトレンドで追い抜く模様。

PHPフレームワークは比較されているので、CakePHPと先祖のRuby on Railsを見てみます。

Google Trends: cakephp,ruby on rails

やはり本家Rails圧倒的ですね。

一方言語で比べるとPHPが圧倒的です。

Google Trends: php,ruby

Railsが使いたくてRubyを触る人が多いのか、PHPではフレームワーク自体が普及していないのか。

なんとも締まらない結論ですが、いい加減PHPでもデファクトと呼ばれるフレームワークが登場して欲しいですね。

CakePHP Screencastまとめ

この記事の所要時間: 236

CakePHPを解説するScreencastをまとめてみました。

フレームワークを理解するのにソースやドキュメントを見て触るのが一番良いのは間違いないですが、動画や音声での解説はイメージを頭に作るのにとても役立ちます。

私も今はソースやファイル構成が(ざっくりですが)頭に入っていますが、Screencastを見るとより理解が深まるように感じます。

1. Admin Routing
Admin Routingの使用法です。(/adminでadminアクションを呼び出す方法)
bakeでMVCを生成して、adminアクションに対応させていきます。

2. Episode 1: Using Debug Messages
URLに対応するMVCが無い場合に表示されるエラーメッセージに従ってアプリケーションを構築していきます。
序盤はMVCをbake&エディッタで書いていきますが、途中からscaffoldを使用します。
phpnutによる音声解説付きです。

3. The Blog Tutorial
簡単なblog(というか単純なCRUD)をbake&scaffoldなしで構築していきます。
scaffoldで表示される画面をscaffoldを使わずに書いていくイメージです。

4. Using TortoiseSVN to Sync CakePHP applications
CakePHPの解説というよりsubversionの解説ですね。
開発用と本番用でブランチを切り、開発用の変更を本番用にマージしていくという内容です。
phpnutによる音声解説付きです。

5. Building the Bakery
bakeの解説です。
バージョンがかなり古い(1.1.2.2802)ので表示や生成される内容が現在と異なっています。(操作はほぼ同じなので問題は無いかと。)
複数テーブルの連携方法は参考になるかと思います。

6. cakephp basics screencast su Kuht.it Stage X
CakePHPのダウンロードから始まり、bake&scaffold無しでMVCを書いていきます。
CSSファイル・レイアウトファイルの作成、ビューヘルパの小技など画面デザインにフォーカスした内容です。
CRUDのうち、Rのみで、CUDについての解説はありません。

7. 10分で作るCakePHPアプリ for Windows – p4life
言わずと知れたp4lifeさんのScreencastです。
CakePHP+XAMPPのインストールから、scaffoldを使ったアプリケーション構築まで解説されています。

見る順番ですが、初心者の方はまず7.でざっくり雰囲気を見て、3./2./5.と進んでいけば良いと思います。(もちろんソースをダウンロードして、実際にソースを触りながら見るのがベターです。)

今後はさらにディープな内容のScreencastも出てくるのでしょうか。楽しみです。

CakePHP1.1.12.4205&1.2.0.4206_devリリース

この記事の所要時間: 038

CakePHP1.1.12.4205&1.2.0.4206_devがリリースされています。

CakeForge: CakePHP: Project Filelist

1.1.12.4205はバグフィックスリリースのようです。

注目はやはり1.2系初リリースの1.2.0.4206_devですね。開発版ながら今後のCakePHPの方向性を見る上でも楽しみなリリースです。

A gift for all to enjoy | The Bakery, Everything CakePHP : Articlesに新機能の概要が紹介されています。

# フォーラム – CakePHP Users in Japanで和訳が紹介されています。

Flash Lite1.1とPHPセッションの連携

  • 2006-12-23 (土)
  • PHP
この記事の所要時間: 048

Flash Lite1.1では起動時にSWFに値を渡す方法(URLパラメータやparamタグ)が使えないようなので、SWFにセッションIDを渡すことができません。
そのためloadVariable()等でサーバと通信できても、セッションが特定できないので、ユーザを識別するようなアプリケーション(ゲームや会員向けサイト等)には使えませんでした。

そこでSWFにセッションIDが渡せないならばと、URLにセッションIDを含める方法を考えました。

つまり

<a href="/path/to/hoge.swf?PHPSESSID=phpsessid">SWF</a>

<a href="/path/to/phpsessid/hoge.swf">SWF</a>

とするわけです。

ファイル構成

以下のようなファイル構成を想定しています。

[/path/to]
    + .htaccess
    + user.swf   < --- SWF
    + index.php  <--- セッション開始PHP
    + user.php   <--- ユーザデータ出力PHP

処理の流れ

おおまかな流れです。

  1. index.phpでセッション開始
    セッションIDを含めたURL[/path/to/phpsessid/user.swf]を生成
  2. [/path/to/phpsessid/user.swf]に来たリクエストをmod_rewriteで[/path/to/user.swf]に変換
  3. user.swfからloadVariable()でuser.phpを呼ぶ
  4. [/path/to/phpsessid/user.php]に来たリクエストをmod_rewriteで[/path/to/user.php?PHPSESSID=phpsessid]に変換
  5. user.phpでセッションデータを出力する

1. セッション開始・user.swfへのリンク生成[index.php]

セッションを開始するPHPファイルです。セッションに初期値をセットしておきます。(会員向けアプリケーションならここでログイン処理などを行います。)

あとuser.swfへのリンクを表示します。このリンクにはURLにセッションIDを含めるようにしておきます。

< ?php
session_start();
$_SESSION&#91;'count'&#93; = 1;

$url = sprintf("./%s/user.swf", session_id());
?>
<a herf="<?php echo $url ?>">SWF</a>

2. user.swfを出力 [.htaccess]

1.のリンクをクリックすると[/path/to/phpsessid/user.swf]にリクエストが来ます。当然そのようなURLは無いのでmod_rewriteでURLを[/path/to/user.swf]に書き換えます。

RewriteEngine On
RewriteRule ^[0-9A-Za-z]+/user\.swf user.swf

3. user.swfからuser.phpを呼ぶ [user.swf]

user.swfからセッションのデータを取得するためにuser.phpにリクエストを投げます。ここでURLを相対パスで書くのがポイントです。

loadVariable('user.php');

4. user.phpを呼び出す [.htaccess]

3.から[/path/to/phpsessid/user.php]にリクエストが来ます。これをmod_rewriteでURLを[/path/to/user.php?PHPSESSID=phpsessid]に書き換えます。

これすればセッションIDがuser.phpに渡され、セッションを取得することができます。

RewriteEngine On
RewriteRule ^[0-9A-Za-z]+/user\.swf user.swf
# ↓を追加
RewriteRule ^([0-9A-Za-z]+)/user\.php user.php?PHPSESSID=$1

5. user.phpからセッションデータを出力 [user.php]

4.でセッションIDが渡されているので、あとは通常とおりセッション処理を記述すればokです。

< ?php
session_start();
if (isset($_SESSION&#91;'count'&#93;)) {
  printf("count=%d", $_SESSION&#91;'count'&#93;);
  $_SESSION&#91;'count'&#93;++;
} else {
  print("count=-1");
}
?>

今回はPHPのセッションIDを使ったのですが、ようはユーザ(セッション)を識別できれば良いので一意なものであればトークンでも何でも良いです。

分かってしまえば簡単なのですが、思いつくまではかなり悩みました。。。

Lite 1.1上の開発は色々と大変なので誰かのお役に立てれば嬉しいです、はい。

Java風なメソッド呼び出し

  • 2006-12-21 (木)
  • PHP
この記事の所要時間: 244

via MikeNaberezny.com » Fluent Interfaces in PHP

PHP5で採用された記述方法です。そう言えばすっかり忘れていました。

$obj->foo()->bar();

ってやつです。

使えるシーンは色々あると思いますが、同じデータに繰り返し操作を行う文字列の変換を例に書いてみました。

< ?php
$str = ' Hello world!! ';
echo str_replace('ELL', '123', strtoupper(trim($str))) . PHP_EOL;
?>

というのを

< ?php
// 独自文字列クラス
class StringClass {
  private $str = "";

  public function __construct($str) {
    $this->str = $str;
  }

  public function toUpper() {
    $this->str = strtoupper($this->str);
    return $this;
  }

  public function toLower() {
    $this->str = strtolower($this->str);
    return $this;
  }


  public function strTrim() {
    $this->str = trim($this->str);
    return $this;
  }

  public function strReplace($search, $replace) {
    $this->str = str_replace($search, $replace, $this->str);
    return $this;
  }

  public function toString() {
    echo $this->str . PHP_EOL;
  }
}

$obj = new StringClass(" Hello world!! ");
$obj->strTrim()
    ->toUpper()
    ->strReplace('ELL', '123')
    ->toString();

?>

のように書けます。(文字列クラスが標準であれば良いのですが。。。)

ポイントは単にメソッドで$thisを返すだけです。

可読性も良いですし、メソッドの呼び出し順を入れ替えるのも容易です。美しいですしね;-)

ちなみに配列関数のように参照を返す関数でも同じような記述ができます。

< ?php
$array = array(new DateTime('2006/12/21'));
echo current($array)->format('Y/m/d') . PHP_EOL;
?>

Win版PHPのコンパイラ

  • 2006-12-18 (月)
  • PHP
この記事の所要時間: 127

Win版PHPバイナリはVC++6.0でビルドされているのですね。

The official PHP binaries for Windows are built using a very old version of Microsoft Visiual Studio C++. We are still using version 6.0 that was released back in 1998.

Compiler upgrade for PHP Widows distro – Edin Kadribašić

これまでVC++6.0を使っていた理由は「単にライセンスを持っているのがVC++6.0だった」だそうです。

普段ダウンロードして使うだけですが、考えてみれば誰かがビルドを行っていて、しかもそのツールは誰かがライセンスを購入しているのですね。有り難いことです。(こういうのはコミュニティで購入して、支給するとかできれば良いように思います。それはそれで管理が難しいかな。)

あとエントリではZendがWindows向けの最適化を行うのに合わせて、今後はVC++2005等のコンパイラに変更するかもしれないと書かれています。まずはPHP5.2.1RC1で試してみるそうです。

コンパイラによってバイナリの性能が変わる事はままあるので成果に期待したいですね。

[2006/12/21追記]
早速ベンチマークが出ています。Benchmarks – Edin Kadribašić – Mozilla Firefox
ざっと見る限りはそれほど目立った効果は出ていないようですね。。。
今後に期待ということで。

CakePHPでCSRF対策

この記事の所要時間: 33

CakePHPでCSRF対策を行う方法です。

フレームワークに含まれているSecurityコンポーネントを使います。

Security#requestAuth()にアクションを記述しておくと、アクション実行前に正規リクエストかどうかをチェックします。チェックの方法はCSRF対策で一般的なワンタイムトークン方式です。

まずController#beforeFilter()にてチェックを行うアクションを指定します。

[app/controller/test_controller.php]

< ?php
class TestController extends AppController {
  var $name = 'Test';
  var $components = array('Security');

  function beforeFilter() {
    $this->Security->requireAuth('add', 'edit');
  }

  function add() {
   //
  }

  function edit() {
   //
  }
}
?>

あとはビューファイルにトークンを埋め込みます。ポイントはformタグをHTMLで書かずにHtmlHelper#formTag()で記述するという事です。そうしておけばフレームワークがトークンをhiddenで埋め込んでくれます。(もとからformTag()で記述されている場合はそのままで良いです。)

[app/views/test/add.thtml]

< ?php echo $html->formTag() ?>

実行時のHTMLソースは以下のような感じになります。(トークンの値は表示毎に変化します。)

<form action="/test/add/" method="post">
<input type="hidden" name="data&#91;_Token&#93;&#91;key&#93;" value="cfa714174ecc102178c6c540b04fa94dc0d5bd5d" id="_TokenKey" /> 
</form>

トークンが一致しないリクエストが発生した場合は[HTTP/1.0 404 Not Found]が出力されます。(この動作は変更できます。)

上記は一つのコントローラでチェックを行っていますが、全てのフォームで同様のチェックを行うならSecurity#requestAuth()をAppController#beforeFileter()に書いておけばokです。

[app/app_controller.php]

< ?php
class AppController extends Controller {
  var $components = array('Security');

  function beforeFilter() {
    $this->Security->requireAuth('add', 'edit');
  }
}
?>

こうしておけば全てのControllerでadd/editアクションを実行する前にチェックがかかります。

 

ワンタイムトークン方式ではコントローラ/モデル側とビュー側の双方に記述が必要なのですが、フレームワーク側で考慮されているので手軽に使用できます。

ただ残念ながらbakeで生成したビューファイルはformタグがHTMLで書かれており、いちいち上記のように書き換える必要があります。HtmlHelperはデフォルトで読み込まれるのでformTag()で書いておいてくれれば楽なのですが。

# 気が向いたらTicket投げておきます。

mail関数のログを取る

  • 2006-12-15 (金)
  • PHP
この記事の所要時間: 042

mail() logging for PHP – iBlog – Ilia Alshanetskyでmail()関数のログを取るパッチが公開されています。

共有サーバでは様々なユーザが同居しているので、あるユーザが多数のSPAMを送ると、サーバ自体の動作が重くなる、RBLに含まれるなど他のユーザにも影響が及びます。

そこでmail関数を使用した場合は強制的にログを取るようにして監視しようという目的のようです。

実際に運用する際は、mail関数の他にfsockopenなども監視する必要が出てくると思いますが、関数の使用をログに吐いて監視するというのは面白い発想ですね。これは他にも転用できそうな気がします。

# mail関数だけでなく、ログ対象の関数を指定できるすると幅が広がりそうです。

ホーム > PHP

検索
フィード
メタ情報

Return to page top