<?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>Screw-Axis &#187; PHP</title>
	<atom:link href="http://screw-axis.com/category/tips/php-tips/feed/" rel="self" type="application/rss+xml" />
	<link>http://screw-axis.com</link>
	<description>flexible, elastic and principled.</description>
	<lastBuildDate>Thu, 08 Apr 2010 01:00:18 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>[PHP] パフォーマンス向上の心得</title>
		<link>http://screw-axis.com/2009/07/17/php-performance-hints/</link>
		<comments>http://screw-axis.com/2009/07/17/php-performance-hints/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 08:54:32 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=673</guid>
		<description><![CDATA[先だってのPHP高速化に関するポストの導入で、GoogleによるPHPのパフォーマンスTipsが物議をかもしている件を紹介しました。
先日、最初に疑問を投げかけたZendの技術者であるStanislav Malyshev [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full" style="margin-left: 5px;" title="hint" src="http://farm1.static.flickr.com/30/97787113_99d18c082f_m.jpg" alt="hint" width="240" height="160" />先だっての<a href="/2009/07/04/php-performance-superstitions1-reference/">PHP高速化に関するポスト</a>の導入で、<a href="http://code.google.com/speed/articles/optimizing-php.html">GoogleによるPHPのパフォーマンスTips</a>が物議をかもしている件を紹介しました。<br />
先日、最初に疑問を投げかけたZendの技術者であるStanislav Malyshev氏が、自身のblog&#8221;<a href="http://php100.wordpress.com/">PHP 10.0 Blog</a>&#8220;上で、前述のGoogleのそれに対するアンチテーゼとして&#8221;<a href="http://php100.wordpress.com/2009/07/13/php-performance/">More on PHP performance</a>&#8220;という記事を書いています。つい小手先のシンタックスなどを期待してしまいがちな高速化Tipsですが、「初心者向けにまず」としながら、極めて本質的なパフォーマンスチューニング方法をまとめています。<br />
とても良い記事だと思ったので、タイトルに沿ってまとめてみます。(翻訳ではないので注意して下さい)<br />
<span id="more-673"></span></p>
<h5>Bytecode cache</h5>
<p><em>バイトコードキャッシュを用いずしてパフォーマンスを語る無かれ(超意訳)</em></p>
<blockquote><p>If you care about performance and don’t use bytecode cache then you don’t really care about performance.</p></blockquote>
<p>というほど、まず重要としているのがこの部分。<br />
まずは(Zend社員としては当然) <a href="http://www.zend.com/en/community/zend-server-ce">Zend Server</a>の導入検討を奨めていますが、自分でPHPをコンパイルできる環境であるならば<a href="http://php.net/apc">APC</a>などを使えば良いでしょう。ちなみに、このblogを動かしているPHPもAPCを使っています。GUIの管理画面もあってステータス管理も簡単。キャッシュヒット率99.9%。プログラム中からmemcache的に変数を格納したりも出来るし、非常にありがたいモジュールです。</p>
<h5>Profiling</h5>
<p><em>最適化する前にプロファイルを!(意訳)</em></p>
<blockquote><p>Profile you code before you start optimizing it!</p></blockquote>
<p>どの関数がボトルネックになっているのか、ちゃんと把握してからチューニングしましょうということで。そのためのツールとして<a href="http://www.zend.com/en/products/studio/">Zend Studio/Debugger</a>や<a href="http://xdebug.org/">Xdebug</a>が挙げられています。</p>
<h5>Caching</h5>
<p><em>殆どのPHPは&#8221;shared nothing&#8221;でインストールされているわけで、リクエスト処理の終了と同時に作業内容は全部飛んでしまいます。これは処理の複雑さを回避するなどのメリットは大きいのですが、パフォーマンス的にはデメリットですよね。繰り返し処理はキャッシュに入れて、いいとこどりにしちゃいましょう。(意訳)</em></p>
<blockquote><p>Most PHP installations run in “shared nothing” mode where as soon as the request processing ends, all the data associated with the request is gone. It has some advantages, but also one big disadvantage – you can not preserve results of repeated operations. That is, unless you use caching.</p></blockquote>
<p>実際、DBへのアクセスや複雑な計算のような大きな処理はもちろん、XMLによる設定ファイルをパースしておくような簡易な処理でも、アクセス毎に発生するようであればDisk I/Oとあわせてトータルでかなりの軽量化になります。<br />
キャッシュ先としては <a href="http://jp2.php.net/manual/ja/book.memcached.php">memcached</a> や前述の APC などが挙げられます。用途によってはHDDでも良いでしょうが、基本的には高速なメモリでのキャッシュを考えるべきです。ポスト元では他にも、Zend Serverに含まれた<a href="http://framework.zend.com/manual/ja/zend.cache.html">Zend Frameworkによるキャッシュ機能</a>を奨めています。</p>
<h5>Optimize your data</h5>
<p><em>通常、PHPアプリケーションで最もコストのかかる処理は、データベースやファイルシステムのような外部データや、ネットワークにアクセスすることです。クエリーを減らすこと、データベース構造の改良、ファイルシステムへのアクセス減、データ取得のためのサービス呼び出しを複数回行わずに1度でまとめるなど、これらの最適化に注力しましょう。更に言えば、システムコールトレーサ(Unixであれば strace、Windowsであれば Process Explorer など)などを使い、スクリプトが呼び出しているシステムコールを減らせないかどうか検討しましょう。それらの全てを除くことは不可能だと思いますが、いくつかは検討の余地があるでしょう。(意訳)</em></p>
<blockquote><p>Usually the most expensive places of the PHP application are where it accesses external data – namely, database or filesystem or network. Look hard into optimizing that – reduce number of queries, improve database structure, reduce filesystem accesses, try to bundle data to make one service call instead of several, etc. For more advanced in-depth look, use tools like strace (Unix) and Process Explorer (Windows) to look into system calls your script produces and think about ways to eliminate some of  them. You would not be able to eliminate all of them but each of them is a worthy target.</p></blockquote>
<p>ほぼ、そのまま。<br />
下手にPHPでの処理をいじるより、RDBのチューニングを行った方が遥かに効果的なことは、非常によくあります。また、先述のキャッシュを使うような工夫は、ここにも繋がります。</p>
<h5>Don&#8217;t try to outsmart the engine</h5>
<p><em>世の中には&#8221;Tips&#8221;と呼ばれる「ああしたほうが速い」「こうすると遅い」というような話題があります。しかし特にビギナーのうちは、そういったものに惑わされない方がいいでしょう。十中八九は何も変わらず、残った1つも手持ちのコードに容易にあてることは出来ないか、費やした時間ほどの価値は無いというのがオチでしょう。確かにopcodesを軽くしたり、lookupsを減らしたりするような手法はありますが、他の全ての条件が整っていなければ無意味です。加えて、こういったアドバイスのいくつかは、寧ろコードを遅くしたり、堅牢性やセキュリティを失わせてしまったりします。特に初心者は、こういったトリッキーな手法に手を出さない方が良いでしょう。(意訳)</em></p>
<blockquote><p>There are a lot of “tips” floating around about which constructs in PHP are faster or slower than others. I think you can safely ignore all of these tips, especially if you’re a beginner. Odd are, 9 cases out of 10 they won’t give you any improvement at all, and in the remaining one case it will be either not applicable in your code or not worth the time spent on it. Yes, there are ways to save couple of opcodes and remove couple of lookups here and there – but unless you’ve already done with all of the previous steps it is not worth it. And some of the advice out there will actually make you code slower, less robust and less secure without you even noticing. So I think for the beginners is better to stay away from trying to outsmart the engine altogether.</p></blockquote>
<p>この辺が恐らく、Googleの(そして、その他「高速化Tips」と銘打つほぼ全ての)アドバイスに対する反発心に繋がっているのでは。<br />
王道をきちんとおさえるのが近道というのは、何にでも言えることですよね。</p>
<h5>Benchmark in real life</h5>
<p><em>ここまでに話題に挙げたアドバイスの多くは、証拠としてベンチマークを使っています。問題は、これらのベンチマークはいつも、ほんの数行の部分的なコードで書かれていることです。しかしながら、実際に実行されなければいけないコードは大きなアプリケーションで、そのような一行コードではありません。(意訳)</em></p>
<blockquote><p>Many of the advices I mentioned above have benchmarks as a proof. The problem is these benchmarks always test only a short piece of code. However, you would not be running that one-liner – you would be running the whole big application.</p></blockquote>
<p>これに続けて筆者は、「勝ち馬を予想するために真空状態でのモデルを使う科学者のジョーク」を引き合いにだしています。<br />
確かに条件が複合的に絡む場合は多く、数行のベンチマーク結果を妄信することを危惧する必要はあります。しかし、現実に「A/Bどちらの方法が速いのか?」と確かめるには、むしろ他の要因を取り払って調べる必要がある場合もあるように思います。ここに関しては、「最終的なパフォーマンスチューニングは、実際のアプリケーションを用いるべき」というアドバイスと捉えれば良いのではないでしょうか。</p>
<h5>Leverage the extensions</h5>
<p><em>あまりにも自明のことを言うようですが、それでもPHP extensionで可能となる機能を重複して作っているようなコードを数多く見かけます。PHPには多くの関数があるので、誰か他の人がやっていそうなものを作る前に、マニュアルをチェックしてみて下さい。DOM/SimpleXML拡張も、JSONパーサも、SOAP送受信のための拡張なども、利用することができます。serialize/deserialize関数が使えないのでなければ、独自のものを作ったりするのは止めましょう。<br />
もしパフォーマンスが非常に重要で、あなたがCプログラムを書けるなら(PHP初心者が、全てにおいて初心者だということを意味しませんよね)、独自のPHPエクステンションを作ることを検討してみてください。それは、それほど難しくはありません。(意訳)</em></p>
<blockquote><p>That seems too obvious, but I have seen a lot of code that duplicates functions available in some PHP extension. There are a lot of functions in PHP and if you do something that others may have done before, check in the manual. You have DOM/SimpleXML extensions for XML, JSON extension for JSON, SOAP extension for doing SOAP, etc., etc. Do not create custom serialization/deserialization if serialize()/deserialize() would work for you.<br />
If you have some very performance-sensitive bit of script and you can do C programming (beginner in PHP doesn’t mean beginner in everything  , consider even making your own extension, it’s not that hard.</p></blockquote>
<h5>Avoid extra notices/errors/etc.</h5>
<p><em>PHPでエラーを抑止することが大変だったとしても、noticeやstrict notice、warningなどが出ないコードを書くよう挑戦してみて下さい。その際、全てのエラーが出力されるように設定したいと思いますが、実運用環境ではエラー表示を決してしないようにしましょう。恥を大っぴらにするだけですから。(意訳)</em></p>
<blockquote><p>Even suppressed errors have cost in PHP, so try and write your code so it would not produce notices, strict notices, warnings, etc. You may want to enable logging of all errors to examine that. Never enable displaying errors in production though – it will only lead to a major public embarrassment.</p></blockquote>
<p>変数の未定義や配列に添え字が無い場合など、noticeエラーを出しておくことは、タイポなどの単純で気付きにくいバグを回避するのに有効です。ちゃんと無くしましょう&#8230;と心から思うのですが、一方で「それってスクリプト言語の手軽さ」を失うことでもあるのかなと考えてしまいます。<br />
いっそ変数型宣言必須の&#8221;strict mode&#8221;みたいなのが欲しいような。</p>
<h5>Use php.ini-production as a start</h5>
<p>もしphp.iniの設定をするのに、PHPのソースコードに含まれる php.ini-production を参考にしましょう。include pathなど幾つかの項目は変更が必要でしょうが、土台にするには最適です。(意訳)<br />
<em>If you need a set of php.ini settings which would not hurt your performance and not break anything, look into php.ini-production in PHP source. You may need to change a couple of details (e.g. include path) but it’s a good starting point.</em><br />
<a href="http://www.php.net/manual/ja/migration53.ini.php">マニュアル</a>によると、PHP5.3.0からはphp.ini-development(開発環境用)、php.ini-production(運用環境用)の2つが同梱されているようです。自分はまだPHP5.3を落としていませんが、以前のrecommendedなどとどの辺が違うのか、確認してみようと思います。</p>
<h5>Use big realpath cache</h5>
<p><em>リアルパス・キャッシュは、ファイル名や相対パスからユニークなフルパスを取得する際に非常に有用です。初期設定ではこのキャッシュサイズは16kですが、多くの長いパス名のファイルを扱うのであれば、この値を増やすのが良いでしょう。これはディスクアクセスという重い処理を軽減します。(意訳)</em></p>
<blockquote><p>Realpath cache is very useful for the engine when it tries to find the unique full name of the file from just filename or relative path. By default, it’s 16K but if you have a lot of files with long pathes, it’s better to increase the size – it would save the expensive disk accesses.</p></blockquote>
<p>この機能はPHP5.1から実装されたものですが、ちょっと大きい規模のアプリケーションになると、16kという値はすぐに超えてしまうかもという話は、よく聞きます。よほどメモリに困窮していなければ(そんな場合は既にパフォーマンスを云々言っていられないと思いますが)、64kくらい確保してしまうのが良いようです。</p>
<p>最後に、次のように締められています。</p>
<p><em>ここに挙げた以外にも、もっと多くのことが挙げられると思いますが、既にちょっと長くなりすぎました。一旦ここで終わりますが、あなたの考えをコメント欄で追加してくれると嬉しいです。</em></p>
<blockquote><p>There are probably more things that could be said, but this post is pretty long already, so I will end it here and you are welcome to add your opinion in comments. </p></blockquote>
<p>同じ言葉で、終わりたいと思います。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/07/17/php-performance-hints/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[PHP] 高速化Tipsのオカルト(2) echoとprint</title>
		<link>http://screw-axis.com/2009/07/05/php-performance-echo-print/</link>
		<comments>http://screw-axis.com/2009/07/05/php-performance-echo-print/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 15:35:18 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=651</guid>
		<description><![CDATA[高速化Tipsには、実践的に役立つものも多々ありますが、実際的にはほとんど役に立たないものも含まれていることが多いです。
知識として「ふーん」という以上には役立たないTipsの、PHPにおける最右翼はこのechoとpri [...]


Related posts:<ol><li><a href='http://screw-axis.com/2009/07/04/php-performance-superstitions1-reference/' rel='bookmark' title='Permanent Link: [PHP] 高速化Tipsのオカルト(1) 関数への参照渡し'>[PHP] 高速化Tipsのオカルト(1) 関数への参照渡し</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm4.static.flickr.com/3357/3515913165_723970550b_m.jpg" alt="fortuneteller" title="fortuneteller" width="240" height="160" class="alignright size-full" style="margin-left: 5px;" />高速化Tipsには、実践的に役立つものも多々ありますが、実際的にはほとんど役に立たないものも含まれていることが多いです。</p>
<p>知識として「ふーん」という以上には役立たないTipsの、PHPにおける最右翼はこのechoとprintの速度差問題ではないでしょうか。<a href="/2009/07/04/php-performance-superstitions1-reference/">前回</a>挙げた<a href="http://code.google.com/intl/ja/speed/articles/optimizing-php.html">Googleのページ</a>でも、公開当初はあったものの、後に消されたエントリの1つです。<br />
Smartyなどのレンダリングエンジンに慣れていれば、そもそもデバッグ時以外では使わない場合も多いこのステートメントの「速度差」が、果たしてどの程度のものなのかを確かめてみます。<br />
<span id="more-651"></span></p>
<h5>大きな文字列を出力</h5>
<p>1Mほどの大きな文字列を出力させてみます。</p>
<pre name="code" class="php">
$s = str_repeat('x', 1024 * 1024);
echo $s."\n";
print $s."\n";
print $s."\n";
echo $s."\n";
</pre>
<p>実行順序で結果が変わることがあるので、2回ずつ呼んでみました。</p>
<pre>
echo: 0.005774974823
print: 0.00450992584229
print: 0.0048840045929
echo: 0.00483393669128
</pre>
<p>誤差の範囲しか、違いを見出すことは出来ませんでした。</p>
<h5>繰り返し出力</h5>
<p>256bytesほどの文字列を、繰り返し出力させます。</p>
<pre name="code" class="php">
$s = str_repeat('x', 256);
$cnt = 10000;
for($i=0; $i&lt;$cnt; ++$i)
  print $s."\n";
for($i=0; $i&lt;$cnt; ++$i)
  echo $s."\n";
for($i=0; $i&lt;$cnt; ++$i)
  echo $s."\n";
for($i=0; $i&lt;$cnt; ++$i)
  print $s."\n";
</pre>
<pre>
print: 0.0117089748383
echo: 0.0106270313263
echo: 0.0104529857635
print: 0.0104429721832
</pre>
<p>こちらも、わずかに echo の方が速いと言えるかもしれない程度です。</p>
<h5>速度差を気にする必要は無い</h5>
<p>気にしなければならないほどの速度差は、無いと判断します。<br />
PHP自体のCのソースコードを読めば、printの方が少し余計な処理をしている分だけ遅いのが道理ですが、意識しなければいけないほどではありません。<br />
OSなど標準出力の機構によってはもう少し大きな差が出るケースがあるのかもしれませんが、基本的には動作・シンタックスの違いだけを気にしておけば良いと思います。(これすら、実際には使い分ける必要はまず無いと思いますが)<br />
一応、簡単に違いを挙げておきます。</p>
<h5>echoとprintの違い(1) 文法</h5>
<p>どちらも関数ではなく言語構造である点は共通しているので、括弧なしに呼ぶようなことが可能です。しかしprintの方が、比較的関数に近しい記述を許されています。<br />
例えば、次のような記述はechoでは出来ません。</p>
<pre name="code" class="php">
$ret = $flag ? print 'true' : print 'false';
echo "return code: $ret";
</pre>
<p>このコードは、標準出力が成功すれば$flagの値がどうあれ&#8221;1&#8243;を返します。</li>
<h5>echoとprintの違い(2) 引数</h5>
<p>echoは複数の引数を取り、これを連続して出力することが出来ます。</p>
<pre name="code" class="php">
echo "x", "y", "z";
print "x"."y"."z";
</pre>
<p>カンマで渡した方が、若干高速なようです。(これもよくきくオカルトですし、実際に<a href="http://pastie.org/523020">逆の検証結果</a>もあるようですが、自分の方で試した結果はやはり文字列結合より引数渡しの方が、やや速いようでした)</p>


<p>Related posts:<ol><li><a href='http://screw-axis.com/2009/07/04/php-performance-superstitions1-reference/' rel='bookmark' title='Permanent Link: [PHP] 高速化Tipsのオカルト(1) 関数への参照渡し'>[PHP] 高速化Tipsのオカルト(1) 関数への参照渡し</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/07/05/php-performance-echo-print/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PHP] 高速化Tipsのオカルト(1) 関数への参照渡し</title>
		<link>http://screw-axis.com/2009/07/04/php-performance-superstitions1-reference/</link>
		<comments>http://screw-axis.com/2009/07/04/php-performance-superstitions1-reference/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 09:09:26 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=645</guid>
		<description><![CDATA[他の言語同様、PHPにも多くの高速化Tipsがあります。汎用で効果的なもの、守銭奴的で本質的に意義の乏しいものなど様々ですが、中には「全く無意味なこと」や「過去のバージョンの話」、「状況次第では逆効果になる」ようなものも [...]


Related posts:<ol><li><a href='http://screw-axis.com/2009/07/05/php-performance-echo-print/' rel='bookmark' title='Permanent Link: [PHP] 高速化Tipsのオカルト(2) echoとprint'>[PHP] 高速化Tipsのオカルト(2) echoとprint</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm4.static.flickr.com/3120/2384975035_230a0eac30_m.jpg" alt="superstition" title="superstition" width="191" height="240" class="alignright size-full" style="margin-left: 5px;" />他の言語同様、PHPにも多くの高速化Tipsがあります。汎用で効果的なもの、守銭奴的で本質的に意義の乏しいものなど様々ですが、中には「全く無意味なこと」や「過去のバージョンの話」、「状況次第では逆効果になる」ようなものも散見されます。</p>
<p>先日は、にわかに高速化づいているGoogleも、<a href="http://code.google.com/intl/ja/speed/">サイト高速化に関するコミュニティ</a>をオープンさせました。その中には、<a href="http://code.google.com/intl/ja/speed/articles/optimizing-php.html">PHPに関するパフォーマンスTips</a>も含まれています。ところが、これも「オカルト」に毒された<a href="http://groups.google.com/group/make-the-web-faster/browse_thread/thread/ddfbe82dd80408cc?pli=1">誤った内容が多く指摘</a>され、公開から僅か1週間で何度も書き直されるような事態になっています。</p>
<p>ここでは巷間に溢れるPHP高速化Tipsの幾つか怪しいものを検証してみます。<br />
※なお、検証に使ったPHPのバージョンは5.2.9です。<br />
<span id="more-645"></span></p>
<h5>大きな配列はポインタで渡す?</h5>
<p>PHPには厳密な意味でのポインタは無く、zvalのリファレンスということになりますが。<br />
関数内で元の変数を参照するだけの場合でも、変数のコピーが行われないように参照渡しにする開発者を見かけます。しかし、少しPHPの内部構造を学べば、copy-on-writeの仕組みによってその必要が無いということを知っていると思います。<br />
しかし、実際にはやはり値渡しとポインタ渡しは、値の変更が無かったとしても「同じ」ではありません。<br />
関数内での変数の扱い方によって、速度が変わることを確認してみましょう。</p>
<h5>foreach</h5>
<p>まずは、foreachを使って大きな配列にアクセスしてみます。</p>
<pre name="code" class="php">
function test1($a){
  $c = 0;
  foreach($a as $v){ if($v=='xxxxx') ++$c; }
}
function test2(&#038;$a){
  $c = 0;
  foreach($a as $v){ if($v=='xxxxx') ++$c; }
}
$x = array_fill(0, 1000000, 'xxxxx');
test1($x);
test2($x);
</pre>
<p>時間を測るあたりのロジックは割愛しますが、以下、結果です。</p>
<pre>
time: 0.627353906631
time: 0.374164819717
</pre>
<p>参照で渡した方が速くなっています。これは結局、test1でforeachが値のコピーを作る際に配列全体のコピーを行ってしまうためです。メモリ使用量を考えても参照渡しの方が優位ですが、これほどの巨大な配列でなければ気にするほどではないと思います。</p>
<h5>for</h5>
<p>次に、foreachではなくfor文を用いて、変数のコピーを行わずにアクセスするパターンを見てみましょう。</p>
<pre name="code" class="php">
function test1($a){
  $cnt = count($a); $c = 0;
  for($i=0; $i<$cnt; ++$i)
    if($a[$i]=='xxxxx') ++$c;
}
function test2(&#038;$a){
  $cnt = count($a); $c = 0;
  for($i=0; $i<$cnt; ++$i)
    if($a[$i]=='xxxxx') ++$c;
}
$x = array_fill(0, 1000000, 'xxxxx');
test1($x);
test2($x);
</pre>
<p>処理としてはforeachのものと同じです。結果は、次のようになりました。</p>
<pre>
time: 0.508368015289
time: 0.736795186996
</pre>
<p>処理速度が逆転してしまっています。これは逆にメモリコピーが行われなくなれば、リファレンスやfunction-stackの追跡が挟まる分だけ少し遅くなってしまうということです。</p>
<h5>for + count</h5>
<p>更に、もう1つ確認してみましょう。</p>
<pre name="code" class="php">
function test1($a){
  $c = 0;
  for($i=0; $i&lt;count($a); ++$i)
    if($a[$i]=='xxxxx') ++$c;
}
function test2(&#038;$a){
  $c = 0;
  for($i=0; $i&lt;count($a); ++$i)
    if($a[$i]=='xxxxx') ++$c;
}
$x = array_fill(0, 10000, 'xxxxx');
test1($x);
test2($x);
</pre>
<p>countをループの外に出さず、毎回評価しています。これも高速化Tipsの基本ですが、ついつい手抜きをして、このようなコードを書いてしまう人も多いのでは。<br />
この実行結果は、次の通りです。</p>
<pre>
time: 0.00851798057556
time: 20.5319070816
</pre>
<p>驚くべき結果になりました。<br />
実はこのテスト、前のものに比べて配列のサイズを2桁下げています。test1の所要時間が短くなっているのはそのためで、決してこちらの書き方が高速というわけではありません。<br />
それにしても、このtest2の眼を疑うような劣化ぶりは、どうしたことでしょうか。良かれと思ってわざわざ参照渡しにしたはずが、悲惨なまでにパフォーマンスを劣化させる結果になってしまいました。</p>
<p>結論としては、関数内で値を直接変更しなければいけないような必要性が無ければ、PHPのcopy-on-writeに委ねたコーディングをするのが正解だと思います。<br />
そして、countはちゃんとループの外に出しましょう <img src='http://screw-axis.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>


<p>Related posts:<ol><li><a href='http://screw-axis.com/2009/07/05/php-performance-echo-print/' rel='bookmark' title='Permanent Link: [PHP] 高速化Tipsのオカルト(2) echoとprint'>[PHP] 高速化Tipsのオカルト(2) echoとprint</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/07/04/php-performance-superstitions1-reference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PHP] 配列やオブジェクトの値渡しと参照渡し</title>
		<link>http://screw-axis.com/2009/06/05/php-%e9%85%8d%e5%88%97%e3%82%84%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e5%80%a4%e6%b8%a1%e3%81%97%e3%81%a8%e5%8f%82%e7%85%a7%e6%b8%a1%e3%81%97/</link>
		<comments>http://screw-axis.com/2009/06/05/php-%e9%85%8d%e5%88%97%e3%82%84%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e5%80%a4%e6%b8%a1%e3%81%97%e3%81%a8%e5%8f%82%e7%85%a7%e6%b8%a1%e3%81%97/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 04:26:40 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=348</guid>
		<description><![CDATA[PHPでの関数への値渡し/参照渡しは、C言語などのそれと基本的には同様ですが、若干の高級言語らしいトリックが含まれています。
少し前ですが、新たにジョインしたメンバーT君(PHPは初心者)が、レスポンスを気にして参照渡し [...]


Related posts:<ol><li><a href='http://screw-axis.com/2009/07/05/php-performance-echo-print/' rel='bookmark' title='Permanent Link: [PHP] 高速化Tipsのオカルト(2) echoとprint'>[PHP] 高速化Tipsのオカルト(2) echoとprint</a></li>
<li><a href='http://screw-axis.com/2009/05/22/php-bit%e3%81%ae%e7%95%b0%e3%81%aa%e3%82%8bos%e9%96%93%e3%81%a7%e3%81%aeserialized%e3%83%87%e3%83%bc%e3%82%bf%e4%ba%a4%e6%8f%9b/' rel='bookmark' title='Permanent Link: [PHP] bitの異なるOS間でのserializedデータ交換'>[PHP] bitの異なるOS間でのserializedデータ交換</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>PHPでの関数への値渡し/参照渡しは、C言語などのそれと基本的には同様ですが、若干の高級言語らしいトリックが含まれています。<br />
少し前ですが、新たにジョインしたメンバーT君(PHPは初心者)が、レスポンスを気にして参照渡しを多用してくれていたので、ちょっと説明。</p>
<h5>値渡しでも、ポインタが渡される</h5>
<p>T君は、関数に大きな配列を渡す際に参照渡しにしてくれていました。<br />
メモリコピーのオーバーヘッドを無くすためです。</p>
<pre name="code" class="php">
function get_value(array &#038;$a){
  return $a[0];
}
$a = get_big_array();
$v = get_value($a);
</pre>
<p>こういった意識・心がけは非常に良いことなのですが、実はPHPにおいて、このケースは値渡しでも参照渡しでも同じ挙動をします。<br />
確認してみましょう。<br />
<span id="more-348"></span></p>
<pre name="code" class="php">
function byVal(array $a){
  echo memory_get_usage()."\n";
}
function byRef(array &#038;$a){
  echo memory_get_usage()."\n";
}
$a = get_big_array();
echo memory_get_usage()."\n";
byRef($a);
byVal($a);
</pre>
<p>$aは50kほどの大きさです。値渡しの際にメモリコピーが行われるならば、byVal関数を呼んだ際にメモリ使用量が50kくらい増えるはずです。<br />
実行結果を見てみましょう。</p>
<pre>
2538312
2538408
2538456
</pre>
<p>メモリ消費量はほとんど変わっていません。</p>
<h5>値渡しされた変数の値がコピーされるタイミング</h5>
<p>このように、PHPでは関数に変数を渡しても、その場でコピーされるわけではありません。<br />
しかしあくまで「値渡し」ですから、関数内のスコープで値が変更された際に、呼び出し元の変数値を変えてしまうことはありません。<br />
つまり、値はちゃんとコピーされ（てしまい）ます。いつでしょう？<br />
関数内で「値を変えようとした際」にコピーされるのです。</p>
<p>確認してみましょう。</p>
<pre name="code" class="php">
function byVal(array $a){
  $x = array_shift($a);
  echo memory_get_usage()."\n";
}
function byRef(array &#038;$a){
  $x = array_shift($a);
  echo memory_get_usage()."\n";
}
$a = get_big_array();
echo memory_get_usage()."\n";
byRef($a);
byVal($a);
</pre>
<p>先ほどのテストとほぼ同じですが、関数内でarray_shiftを呼び、配列の値に変更が入るようにしてみます。</p>
<pre>
2538464
2539888
2586808
</pre>
<p>値渡しの際に、メモリ利用量が増えていることが確認できます。</p>
<h5>まとめ</h5>
<p>関数で配列やオブジェクトの値を参照だけする場合、明示的に参照渡しにする必要はありません。<br />
寧ろ、値が変更された場合の事故を防ぐためにも、参照渡しにすべきでは無いとも言えます。<br />
しかし一方で、渡された値に対して値渡しであることで安心して変更を加えると、思わぬオーバーヘッドが発生してしまうこともあります。</p>
<pre name="code" class="php">
function byVal1(array $a){
  $a[0] .= 'A';
  return $a[0];
}

function byVal2(array $a){
  $x = $a[0] . 'A';
  return $x;
}

$a = get_big_array();

$s = microtime(true);
for($i=0; $i<100000; ++$i){
  byVal1($a);
}
$e = microtime(true);
echo $e-$s."\n";

$s = microtime(true);
for($i=0; $i<100000; ++$i){
  byVal2($a);
}
$e = microtime(true);
echo $e-$s."\n";
</pre>
<pre>
30.0323519707
0.145305156708
</pre>
<p>2つの関数は結果として同じことをしていますが、経過として配列のコピーが行われるか否かで200倍以上の差が出ています。<br />
こういった点を注意しようと思えば、結局のところ挙動をしっかりと意識しなければなりません。</p>
<ul>
<li>実行結果の事故を防ぐため、必要に迫られない場合は値渡しにする</li>
<li>値渡しであっても、不必要にコピーが行われないように意識する</li>
</ul>
<p>という、ある意味矛盾した方針でコーディングしていくのが良いと思います。>T君</p>
<p><strong>追記</strong><br />
メモリ利用量ではなくパフォーマンスの角度から、<a href="/2009/07/04/php-performance-superstitions1-reference/">別のエントリ</a>を書きました。<br />
関数内でforeachを用いるとメモリコピーが行われること、値そのものへのアクセスは参照渡し(リファレンス渡し)の方が寧ろコストがかかることなどを検証しるので、参考にしてください。</p>


<p>Related posts:<ol><li><a href='http://screw-axis.com/2009/07/05/php-performance-echo-print/' rel='bookmark' title='Permanent Link: [PHP] 高速化Tipsのオカルト(2) echoとprint'>[PHP] 高速化Tipsのオカルト(2) echoとprint</a></li>
<li><a href='http://screw-axis.com/2009/05/22/php-bit%e3%81%ae%e7%95%b0%e3%81%aa%e3%82%8bos%e9%96%93%e3%81%a7%e3%81%aeserialized%e3%83%87%e3%83%bc%e3%82%bf%e4%ba%a4%e6%8f%9b/' rel='bookmark' title='Permanent Link: [PHP] bitの異なるOS間でのserializedデータ交換'>[PHP] bitの異なるOS間でのserializedデータ交換</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/06/05/php-%e9%85%8d%e5%88%97%e3%82%84%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e5%80%a4%e6%b8%a1%e3%81%97%e3%81%a8%e5%8f%82%e7%85%a7%e6%b8%a1%e3%81%97/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PHP] bitの異なるOS間でのserializedデータ交換</title>
		<link>http://screw-axis.com/2009/05/22/php-bit%e3%81%ae%e7%95%b0%e3%81%aa%e3%82%8bos%e9%96%93%e3%81%a7%e3%81%aeserialized%e3%83%87%e3%83%bc%e3%82%bf%e4%ba%a4%e6%8f%9b/</link>
		<comments>http://screw-axis.com/2009/05/22/php-bit%e3%81%ae%e7%95%b0%e3%81%aa%e3%82%8bos%e9%96%93%e3%81%a7%e3%81%aeserialized%e3%83%87%e3%83%bc%e3%82%bf%e4%ba%a4%e6%8f%9b/#comments</comments>
		<pubDate>Fri, 22 May 2009 05:36:54 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=197</guid>
		<description><![CDATA[例えば64bit OS上で、あるデータを serialize します。
次に32bit OSでこの値を取得して unserialize した場合のお話。
レアなケースとは思いますが、それにハマってしまったので一応共有。
 [...]


Related posts:<ol><li><a href='http://screw-axis.com/2009/06/05/php-%e9%85%8d%e5%88%97%e3%82%84%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e5%80%a4%e6%b8%a1%e3%81%97%e3%81%a8%e5%8f%82%e7%85%a7%e6%b8%a1%e3%81%97/' rel='bookmark' title='Permanent Link: [PHP] 配列やオブジェクトの値渡しと参照渡し'>[PHP] 配列やオブジェクトの値渡しと参照渡し</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>例えば64bit OS上で、あるデータを serialize します。<br />
次に32bit OSでこの値を取得して unserialize した場合のお話。<br />
レアなケースとは思いますが、それにハマってしまったので一応共有。</p>
<h5>現象</h5>
<p>64bit OSから、例えば次のようなコードで、配列をシリアライズして memcache に保存します。</p>
<pre name="code" class="php">
$x = '1062430001292';
$a[$x] = $x;
$v = serialize($a);
$m->set('test', $v);
</pre>
<p>本来 memcache::set を使うなら serialize 不要ですが、ここは分り易くするために。<br />
で、この値を32bit OS側から取得してやります。</p>
<pre name="code" class="php">
$v = $m->get('test');
$a = unserialize($v);
print_r($a);
</pre>
<p>すると、結果は次のようになってしまいます。</p>
<pre>
Array
(
    [1573079180] => 1062430001292
)
</pre>
<p>添え字と値は同じものを指定していたはずですが、全く異なる値になってしまいます。<br />
<span id="more-197"></span></p>
<h5>原因</h5>
<p>書き込む前の、64bit OS上での $a を var_dump してみます。</p>
<pre>
array(1) {
  [1062430001292]=>
  string(13) "1062430001292"
}
</pre>
<p>そして、serialize した $v の値を見てみましょう。</p>
<pre>
a:1:{i:1062430001292;s:13:"1062430001292";}
</pre>
<p>一見良さそうですが、問題点が潜んでいます。</p>
<pre>
a:1:{<span style="color: red; font-weight: bold;">i</span>:1062430001292;s:13:"1062430001292";}
</pre>
<p>そう、添え字が int となってしまっています。<br />
明示的にキャストしたり、色々と試してみましたが、添え字の中身が全て数値の場合はどうしても int と識別してしまう様子。<br />
そのため、32bit OSの int では桁が足りず、32bit分だけの数値になってしまうワケですね。</p>
<h5>対処方法</h5>
<p>我々のプロジェクトでは、添え字の値は捨てることで対応可能でした。<br />
しかしいつもそういった対応が可能とは限りません。<br />
出来るならば、例えばアタマに &#8220;id&#8221; と付けるなど、イヤでも文字列になるような対処も方法のひとつだと思います。</p>
<pre name="code" class="php">
$x = '1062430001292';
$a["id:{$x}"] = $x;
</pre>
<p>それも難しければ、serialize した後で文字列に無理矢理変換する方法もあるかもしれませんが、オススメはしにくいですよね。</p>
<pre>
a:1:{i:1062430001292;s:13:"1062430001292";}
</pre>
<p>↓</p>
<pre>
a:1:{s:13:"1062430001292";s:13:"1062430001292";}
</pre>


<p>Related posts:<ol><li><a href='http://screw-axis.com/2009/06/05/php-%e9%85%8d%e5%88%97%e3%82%84%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e5%80%a4%e6%b8%a1%e3%81%97%e3%81%a8%e5%8f%82%e7%85%a7%e6%b8%a1%e3%81%97/' rel='bookmark' title='Permanent Link: [PHP] 配列やオブジェクトの値渡しと参照渡し'>[PHP] 配列やオブジェクトの値渡しと参照渡し</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/05/22/php-bit%e3%81%ae%e7%95%b0%e3%81%aa%e3%82%8bos%e9%96%93%e3%81%a7%e3%81%aeserialized%e3%83%87%e3%83%bc%e3%82%bf%e4%ba%a4%e6%8f%9b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PHP] 論理演算子「and, or」と「&amp;&amp;, &#124;&#124;」の違い</title>
		<link>http://screw-axis.com/2009/05/20/php-%e8%ab%96%e7%90%86%e6%bc%94%e7%ae%97%e5%ad%90%e3%80%8cand-or%e3%80%8d%e3%81%a8%e3%80%8c-%e3%80%8d%e3%81%ae%e9%81%95%e3%81%84/</link>
		<comments>http://screw-axis.com/2009/05/20/php-%e8%ab%96%e7%90%86%e6%bc%94%e7%ae%97%e5%ad%90%e3%80%8cand-or%e3%80%8d%e3%81%a8%e3%80%8c-%e3%80%8d%e3%81%ae%e9%81%95%e3%81%84/#comments</comments>
		<pubDate>Wed, 20 May 2009 06:20:27 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=163</guid>
		<description><![CDATA[論理式を評価する演算子、皆さんはどちらを使っていますか？

if ( $a and $b ) echo "it's true!\n";
if ( $a &#038;&#038; $b ) echo "it's also  [...]


Related posts:<ol><li><a href='http://screw-axis.com/2009/06/05/php-%e9%85%8d%e5%88%97%e3%82%84%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e5%80%a4%e6%b8%a1%e3%81%97%e3%81%a8%e5%8f%82%e7%85%a7%e6%b8%a1%e3%81%97/' rel='bookmark' title='Permanent Link: [PHP] 配列やオブジェクトの値渡しと参照渡し'>[PHP] 配列やオブジェクトの値渡しと参照渡し</a></li>
<li><a href='http://screw-axis.com/2009/07/05/php-performance-echo-print/' rel='bookmark' title='Permanent Link: [PHP] 高速化Tipsのオカルト(2) echoとprint'>[PHP] 高速化Tipsのオカルト(2) echoとprint</a></li>
<li><a href='http://screw-axis.com/2009/05/17/javascript%e3%81%aenull%e3%81%a8undefined%e3%81%a8false%e3%81%a80%e3%81%a8%e7%a9%ba%e6%96%87%e5%ad%97%e3%81%a8/' rel='bookmark' title='Permanent Link: [Javascript] nullとundefinedとfalseと0と空文字と'>[Javascript] nullとundefinedとfalseと0と空文字と</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>論理式を評価する演算子、皆さんはどちらを使っていますか？</p>
<pre>
if ( $a and $b ) echo "it's true!\n";
if ( $a &#038;&#038; $b ) echo "it's also true!\n";
</pre>
<p>先日、両者の違いについてチームで話題になったので、ちょっとまとめ。</p>
<h5>Quick Questions</h5>
<p>次の問いにサクサク答えられれば、バッチリ理解しているということで無問題かと。<br />
回答は全て、$xが真(true)か偽(false)で。各問いをクリックすると、答えがわかります。</p>
<p>1. <code class="qq-false">$x = (true and false);</code><br />
2. <code class="qq-true">$x = true and false;</code><br />
3. <code class="qq-false">$x = false and true;</code><br />
4. <code class="qq-false">$x = (true &#038;&#038; false);</code><br />
5. <code class="qq-false">$x = true &#038;& false;</code><br />
6. <code class="qq-false">$x = false &#038;& true;</code><br />
7. <code class="qq-true">$x = (false or true);</code><br />
8. <code class="qq-false">$x = false or true;</code><br />
9. <code class="qq-true">$x = true or false;</code><br />
10. <code class="qq-true">$x = (false || true);</code><br />
11. <code class="qq-true">$x = false || true;</code><br />
12. <code class="qq-true">$x = true || false;</code><br />
13. <code class="qq-true">$x = (false and true or true and true);</code><br />
14. <code class="qq-false">$x = (false and true || true and true);</code></p>
<p>さて、正解率はどれくらいだったでしょうか？<br />
<span id="more-163"></span></p>
<h5>解説</h5>
<p>まず誤解の無いようにしておくと、論理演算子としての意味は and でも &#038;&#038; でも変わりません。共に論理積です。<br />
では、何故このような違いが起きるのでしょうか。<br />
そのポイントは、<a href="http://jp2.php.net/manual/ja/language.operators.precedence.php">演算子の優先順位</a>にあります。</p>
<p>例えば「2」の問題、パッと期待してしまうのは、「true and false」という論理式の結果である「false」が$xに代入されることだと思います。</p>
<pre>$x = true and false;</pre>
<p>しかし、PHPにおける論理式の優先順位は &#8220;&#038;&#038;&#8221; > &#8220;=&#8221; > &#8220;and&#8221; の順です。<br />
つまり、この式はまず「$x = true」が評価されて代入され、その結果とfalseの論理積を計算する（結果はどこにも代入されない）ということになってしまいます。</p>
<p>逆に、同じ式に見える「5」の問題では、&#8221;&#038;&#038;&#8221;の方が&#8221;=&#8221;よりも実行順位が高いため、論理積の結果が$xに代入されるようになります。</p>
<pre>$x = true &#038;& false;</pre>
<p>こうして考えると、全ての問題に納得がいくでしょうか。</p>
<p>念のため、最後に挙げた「13」「14」について見ておきましょう。</p>
<pre>
$x = (false and true or true and true);
$x = (false and true || true and true);
</pre>
<p>&#8220;and&#8221;と&#8221;or&#8221;が並んだ場合、優先されるのは&#8221;and&#8221;です。<br />
そのため、「13」では次のように評価され、結果は&#8221;true&#8221;となります。</p>
<pre>
$x = ((false and true) or (true and true));
</pre>
<p>しかし、&#8221;and&#8221;と&#8221;||&#8221;では、優先順位は&#8221;||&#8221;の方が高くなっています。<br />
そのため、「14」では次のように評価されてしまいます。</p>
<pre>
$x = ((false) and (true || true) and (true));
</pre>
<p>結果は、&#8221;false&#8221;になります。</p>
<h5>まとめ</h5>
<p>括弧を省略せず、明示的に書く癖をつけることが第一です。</p>
<p>そして、同じチーム内では&#8221;and&#8221;と記述する人と&#8221;&#038;&#038;&#8221;と書く人が混在しないように、コーディングルールなどにしっかりと明記すべきでしょう。<br />
さもないと、チーム内で他人のコードを編集した際などに、最後の14問目のような思わぬ不具合を招く可能性があります。</p>
<p>新メンバーを向かえた際などについ、「そんなの、どっちでもいいじゃん」となってしまうこともあります。<br />
単なるコード表記上の美学ではなく動作の安全性にかかわることなので、しっかり統一することをオススメします。</p>


<p>Related posts:<ol><li><a href='http://screw-axis.com/2009/06/05/php-%e9%85%8d%e5%88%97%e3%82%84%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e5%80%a4%e6%b8%a1%e3%81%97%e3%81%a8%e5%8f%82%e7%85%a7%e6%b8%a1%e3%81%97/' rel='bookmark' title='Permanent Link: [PHP] 配列やオブジェクトの値渡しと参照渡し'>[PHP] 配列やオブジェクトの値渡しと参照渡し</a></li>
<li><a href='http://screw-axis.com/2009/07/05/php-performance-echo-print/' rel='bookmark' title='Permanent Link: [PHP] 高速化Tipsのオカルト(2) echoとprint'>[PHP] 高速化Tipsのオカルト(2) echoとprint</a></li>
<li><a href='http://screw-axis.com/2009/05/17/javascript%e3%81%aenull%e3%81%a8undefined%e3%81%a8false%e3%81%a80%e3%81%a8%e7%a9%ba%e6%96%87%e5%ad%97%e3%81%a8/' rel='bookmark' title='Permanent Link: [Javascript] nullとundefinedとfalseと0と空文字と'>[Javascript] nullとundefinedとfalseと0と空文字と</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/05/20/php-%e8%ab%96%e7%90%86%e6%bc%94%e7%ae%97%e5%ad%90%e3%80%8cand-or%e3%80%8d%e3%81%a8%e3%80%8c-%e3%80%8d%e3%81%ae%e9%81%95%e3%81%84/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
