<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Groove Labo &#187; PHP</title>
	<atom:link href="http://labo.opengroove.com/blog/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://labo.opengroove.com/blog</link>
	<description>株式会社オープングルーヴの開発者のブログ</description>
	<lastBuildDate>Wed, 25 Aug 2010 06:55:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CakePHP で連結テーブルのモデルは先に宣言すること</title>
		<link>http://labo.opengroove.com/blog/2010/06/30/cakephp-%e3%81%a7%e9%80%a3%e7%b5%90%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%ae%e3%83%a2%e3%83%87%e3%83%ab%e3%81%af%e5%85%88%e3%81%ab%e5%ae%a3%e8%a8%80%e3%81%99%e3%82%8b%e3%81%93%e3%81%a8/</link>
		<comments>http://labo.opengroove.com/blog/2010/06/30/cakephp-%e3%81%a7%e9%80%a3%e7%b5%90%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%ae%e3%83%a2%e3%83%87%e3%83%ab%e3%81%af%e5%85%88%e3%81%ab%e5%ae%a3%e8%a8%80%e3%81%99%e3%82%8b%e3%81%93%e3%81%a8/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 03:58:36 +0000</pubDate>
		<dc:creator>sugimoto</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://labo.opengroove.com/blog/?p=621</guid>
		<description><![CDATA[
sugimoto です。最近、CakePHPを使ってます。



しばらくRails を使っていたこともあり、わかりやすい所もある反面、衝撃的に違うところがあったりして試行錯誤な毎日です。



先日、連結テーブルに「並び順」カラムを持たせて、hasManyAndBelongsToなリレーションの順番をつけようとしたところ、うまく動きませんでした。



プロジェクトとユーザーを以下のようなテーブルで関連つけていました



projects
users
projects_users



このとき、「各プロジェクトの参加者ごとに並び順を設定したい」という要望があり、 projects_users に position カラムを持たせて並び順を設定することにしました。



positionカラムの更新をするために ProjectsUser という中途半端なmodel クラスを作ったところ、問題発生。



projects_controller のuses 句で ProjectsUser を設定しているにもかかわらず、ProjectsUser の関数が呼べず、controller内での $this->ProjectsUser の実体がなぜか AppModel となっていました。



AppController など、ソースを確認したところ、controller のイニシャライズ時、以下のようなロジックでした。



  Projectモデルのインスタンス を作成
  Projectモデルで設定されているリレーションに該当するモデルのインスタンスを作成(Userなど)
  リレーションテーブルを扱うのインスタンス ProjectsUserを作成
  その際、デフォルト実装である AppModel のインスタンスとして作成
  上記作成したインスタンスはすべてキャッシュ
  ProjectsUserを作成するが、すでにキャッシュされているためそれを使用



つまり、上記処理がcontroller の uses句内で宣言された順に処理されているため、ProjectsUserをロードするとき、先に処理したProjectモデルのリレーションとして作成されたProjectsUserが優先されていたわけです。


今日の格言


リレーショナルテーブルのモデルを作ったら、uses 句内では必ず先に宣言すること。


ソフトウェアエンジニアのためのバグトラッキングシステム : Ciklone



ソフトウェアエンジニアのためのバグトラッキングシステム
]]></description>
			<content:encoded><![CDATA[<p>
sugimoto です。最近、CakePHPを使ってます。
</p>

<p>
しばらくRails を使っていたこともあり、わかりやすい所もある反面、衝撃的に違うところがあったりして試行錯誤な毎日です。
</p>

<p>
先日、連結テーブルに「並び順」カラムを持たせて、hasManyAndBelongsToなリレーションの順番をつけようとしたところ、うまく動きませんでした。
</p>

<p></p>
プロジェクトとユーザーを以下のようなテーブルで関連つけていました


<pre>
projects
users
projects_users
</pre>

<p>
このとき、「各プロジェクトの参加者ごとに並び順を設定したい」という要望があり、 projects_users に position カラムを持たせて並び順を設定することにしました。
</p>

<p>
positionカラムの更新をするために ProjectsUser という中途半端なmodel クラスを作ったところ、問題発生。
</p>

<p>
projects_controller のuses 句で ProjectsUser を設定しているにもかかわらず、ProjectsUser の関数が呼べず、controller内での $this->ProjectsUser の実体がなぜか AppModel となっていました。
</p>

<p>
AppController など、ソースを確認したところ、controller のイニシャライズ時、以下のようなロジックでした。
</p>

<ol>
  <li>Projectモデルのインスタンス を作成</li>
  <li>Projectモデルで設定されているリレーションに該当するモデルのインスタンスを作成(Userなど)</li>
  <li>リレーションテーブルを扱うのインスタンス ProjectsUserを作成</li>
  <li>その際、デフォルト実装である AppModel のインスタンスとして作成</li>
  <li>上記作成したインスタンスはすべてキャッシュ</li>
  <li>ProjectsUserを作成するが、すでにキャッシュされているためそれを使用</li>
</ol>

<p>
つまり、上記処理がcontroller の uses句内で宣言された順に処理されているため、ProjectsUserをロードするとき、先に処理したProjectモデルのリレーションとして作成されたProjectsUserが優先されていたわけです。
</p>

<h4>今日の格言</h4>

<p>
リレーショナルテーブルのモデルを作ったら、uses 句内では必ず先に宣言すること。
</p>

<h3><span style="color: #999999;">ソフトウェアエンジニアのためのバグトラッキングシステム : Ciklone</span></h3>

<p><a title="ソフトウェアエンジニアのためのバグトラッキングシステム" href="http://ciklone.com/"><img class="alignnone" title="ソフトウェアエンジニアのためのバグトラッキングシステム" src="http://www.opengroove.com/images/ciklone-banner.png" alt="ソフトウェアエンジニアのためのバグトラッキングシステム" width="224" height="50" /></a></p>

<p><a style="color: #999999;" href="http://ciklone.com/" title="ソフトウェアエンジニアのためのバグトラッキングシステム">ソフトウェアエンジニアのためのバグトラッキングシステム</a></p>
]]></content:encoded>
			<wfw:commentRss>http://labo.opengroove.com/blog/2010/06/30/cakephp-%e3%81%a7%e9%80%a3%e7%b5%90%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%ae%e3%83%a2%e3%83%87%e3%83%ab%e3%81%af%e5%85%88%e3%81%ab%e5%ae%a3%e8%a8%80%e3%81%99%e3%82%8b%e3%81%93%e3%81%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IIS 7 + FastCGI で PHP 5.3 を実行する</title>
		<link>http://labo.opengroove.com/blog/2010/02/22/php-5-3-on-iis7-via-fastcgi/</link>
		<comments>http://labo.opengroove.com/blog/2010/02/22/php-5-3-on-iis7-via-fastcgi/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 03:05:30 +0000</pubDate>
		<dc:creator>omae</dc:creator>
				<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://labo.opengroove.com/blog/?p=493</guid>
		<description><![CDATA[こんにちわ。omae です。

今回は IIS 7 で PHP 5.3 を実行する環境が必要になったのでその手順を残しておきたいと思います。

作業しようとしてから気づいたのですが PHP 5.3 から isapi モジュールが廃止されていました。PHP 5.2 以前までは isapi モジュールで環境を作成していたのですが、廃止されてしまったものはしょうがありません。IIS 7 からは FastCGI が正式に対応しているので、こちらで設定することにします。

手順

1. PHP 5.3.1 をインストール

PHP For Windows: Binaries and sources Releases より今回は VC6 x86 Thread Safe (ZIP) を使うことにしました。この zip ファイルを C:\php に展開します。

ここでコマンドプロンプトを起動して C:\php\php-cgi.exe -h が実行できることを確認しておきます。実行すると以下のようなエラーが上がる場合は php.ini から extension=php_mssql.dll をコメントアウトします。SQL Server に接続する予定があるなら ntwdblib.dll を準備します。



無事に実行出来た場合:
C:\&#62;C:\php\php-cgi.exe -h
Usage: php [-q] [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちわ。omae です。</p>

<p>今回は IIS 7 で PHP 5.3 を実行する環境が必要になったのでその手順を残しておきたいと思います。</p>

<p>作業しようとしてから気づいたのですが PHP 5.3 から isapi モジュールが廃止されていました。PHP 5.2 以前までは isapi モジュールで環境を作成していたのですが、廃止されてしまったものはしょうがありません。IIS 7 からは FastCGI が正式に対応しているので、こちらで設定することにします。</p>

<h2>手順</h2>

<h3>1. PHP 5.3.1 をインストール</h3>

<p><a href="http://windows.php.net/download/">PHP For Windows: Binaries and sources Releases</a> より今回は <a href="http://windows.php.net/downloads/releases/php-5.3.1-Win32-VC6-x86.zip">VC6 x86 Thread Safe (ZIP)</a> を使うことにしました。この zip ファイルを C:\php に展開します。</p>

<p>ここでコマンドプロンプトを起動して <code>C:\php\php-cgi.exe -h</code> が実行できることを確認しておきます。実行すると以下のようなエラーが上がる場合は php.ini から <code>extension=php_mssql.dll</code> をコメントアウトします。SQL Server に接続する予定があるなら ntwdblib.dll を準備します。</p>

<p><img src="/blog/wp-content/uploads/2010/02/iis7-php-ntwdblib.png" /></p>

<p>無事に実行出来た場合:
<pre>C:\&gt;C:\php\php-cgi.exe -h
Usage: php [-q] [-h] [-s] [-v] [-i] [-f &lt;file&gt;]
       php &lt;file&gt; [args...]
  -a               Run interactively
  -b &lt;address:port&gt;|&lt;port&gt; Bind Path for external FASTCGI Server mode
  -C               Do not chdir to the script's directory
  -c &lt;path&gt;|&lt;file&gt; Look for php.ini file in this directory
  -n               No php.ini file will be used
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -f &lt;file&gt;        Parse &lt;file&gt;.  Implies `-q'
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -q               Quiet-mode.  Suppress HTTP Header output.
  -s               Display colour syntax highlighted source.
  -v               Version number
  -w               Display source with stripped comments and whitespace.
  -z &lt;file&gt;        Load Zend extension &lt;file&gt;.
  -T &lt;count&gt;       Measure execution time of script repeated &lt;count&gt; times.
</pre></p>

<h3>2. IIS で FastCGI が使えるように設定します</h3>

<p>サーバーマネージャを起動して「Web サーバー (IIS)」の機能に「CGI」がインストール済みになっていることを確認します。
インストールされていない場合は「役割サービスの追加」からインストールします。</p>

<p><img src="/blog/wp-content/uploads/2010/02/iis7-cgi.png" /></p>

<h3>3. php.ini に fastcgi のための設定を行う</h3>

<p>php.ini を開いて次の設定に変更します。
<pre>fastcgi.impersonate = 1
fastcgi.logging = 0
cgi.fix_pathinfo = 1
cgi.force_redirect = 0</pre>
</p>

<h3>4. IIS マネージャから PHP のハンドラを設定する</h3>

<p>
a. IIS マネージャを起動し、ハンドラマッピングを開きます。<br />
<img src="/blog/wp-content/uploads/2010/02/iis7-handler-mapping.png" />
</p>

<p>
b. 「モジュールハンドラの追加」を選択し、以下の要領で *.php に対して fastcgi による php の実行を設定します。<br />
<img src="/blog/wp-content/uploads/2010/02/iis7-add-php-handler.png" />
</p>

<h3>5. phpinfo.php にアクセスして確認</h3>

<p>C:\inetpub\wwwroot\phpinfo.php などに <code>&lt;?php phpinfo();</code> と書いたファイルを用意して、このファイルにブラウザからアクセスしてみます。<br />
<img src="/blog/wp-content/uploads/2010/02/iis7-phpinfo.png" />
</p>

<p>無事に phpinfo() が参照できれば、設定は完了です。</p>

<p>ついでにタスクマネージャを起動して FastCGI なので php-cgi.exe プロセスがいるか確認してみましょう。<br />
<img src="/blog/wp-content/uploads/2010/02/iis7-taskmgr.png" /><br />
ちゃんといますね。
</p>

<h2>参考</h2>

<ul>
<li><a href="http://www.php.net/manual/ja/install.windows.iis7.php">PHP: Microsoft IIS 7.0 以降 &#8211; Manual</a></li>
<li><a href="http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis-70/">Using FastCGI to Host PHP Applications on IIS 7.0 : Host Applications on the Microsoft Web Platform : Running PHP Applications on IIS : The Official Microsoft IIS Site</a></li>
</ul>

<h3><span style="color: #999999;">ソフトウェアエンジニアのためのバグトラッキングシステム : Ciklone</span></h3>

<p><a title="ソフトウェアエンジニアのためのバグトラッキングシステム" href="http://ciklone.com/"><img class="alignnone" title="ソフトウェアエンジニアのためのバグトラッキングシステム" src="http://www.opengroove.com/images/ciklone-banner.png" alt="ソフトウェアエンジニアのためのバグトラッキングシステム" width="224" height="50" /></a></p>

<p><a style="color: #999999;" href="http://ciklone.com/" title="ソフトウェアエンジニアのためのバグトラッキングシステム">ソフトウェアエンジニアのためのバグトラッキングシステム</a></p>
]]></content:encoded>
			<wfw:commentRss>http://labo.opengroove.com/blog/2010/02/22/php-5-3-on-iis7-via-fastcgi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
