Archived entries for PHP

[PHP] パフォーマンス向上の心得

hint先だってのPHP高速化に関するポストの導入で、GoogleによるPHPのパフォーマンスTipsが物議をかもしている件を紹介しました。
先日、最初に疑問を投げかけたZendの技術者であるStanislav Malyshev氏が、自身のblog”PHP 10.0 Blog“上で、前述のGoogleのそれに対するアンチテーゼとして”More on PHP performance“という記事を書いています。つい小手先のシンタックスなどを期待してしまいがちな高速化Tipsですが、「初心者向けにまず」としながら、極めて本質的なパフォーマンスチューニング方法をまとめています。
とても良い記事だと思ったので、タイトルに沿ってまとめてみます。(翻訳ではないので注意して下さい)
Continue reading…

[PHP] 高速化Tipsのオカルト(2) echoとprint

fortuneteller高速化Tipsには、実践的に役立つものも多々ありますが、実際的にはほとんど役に立たないものも含まれていることが多いです。

知識として「ふーん」という以上には役立たないTipsの、PHPにおける最右翼はこのechoとprintの速度差問題ではないでしょうか。前回挙げたGoogleのページでも、公開当初はあったものの、後に消されたエントリの1つです。
Smartyなどのレンダリングエンジンに慣れていれば、そもそもデバッグ時以外では使わない場合も多いこのステートメントの「速度差」が、果たしてどの程度のものなのかを確かめてみます。
Continue reading…

[PHP] 高速化Tipsのオカルト(1) 関数への参照渡し

superstition他の言語同様、PHPにも多くの高速化Tipsがあります。汎用で効果的なもの、守銭奴的で本質的に意義の乏しいものなど様々ですが、中には「全く無意味なこと」や「過去のバージョンの話」、「状況次第では逆効果になる」ようなものも散見されます。

先日は、にわかに高速化づいているGoogleも、サイト高速化に関するコミュニティをオープンさせました。その中には、PHPに関するパフォーマンスTipsも含まれています。ところが、これも「オカルト」に毒された誤った内容が多く指摘され、公開から僅か1週間で何度も書き直されるような事態になっています。

ここでは巷間に溢れるPHP高速化Tipsの幾つか怪しいものを検証してみます。
※なお、検証に使ったPHPのバージョンは5.2.9です。
Continue reading…

[PHP] 配列やオブジェクトの値渡しと参照渡し

PHPでの関数への値渡し/参照渡しは、C言語などのそれと基本的には同様ですが、若干の高級言語らしいトリックが含まれています。
少し前ですが、新たにジョインしたメンバーT君(PHPは初心者)が、レスポンスを気にして参照渡しを多用してくれていたので、ちょっと説明。

値渡しでも、ポインタが渡される

T君は、関数に大きな配列を渡す際に参照渡しにしてくれていました。
メモリコピーのオーバーヘッドを無くすためです。

function get_value(array &$a){
  return $a[0];
}
$a = get_big_array();
$v = get_value($a);

こういった意識・心がけは非常に良いことなのですが、実はPHPにおいて、このケースは値渡しでも参照渡しでも同じ挙動をします。
確認してみましょう。
Continue reading…

[PHP] bitの異なるOS間でのserializedデータ交換

例えば64bit OS上で、あるデータを serialize します。
次に32bit OSでこの値を取得して unserialize した場合のお話。
レアなケースとは思いますが、それにハマってしまったので一応共有。

現象

64bit OSから、例えば次のようなコードで、配列をシリアライズして memcache に保存します。

$x = '1062430001292';
$a[$x] = $x;
$v = serialize($a);
$m->set('test', $v);

本来 memcache::set を使うなら serialize 不要ですが、ここは分り易くするために。
で、この値を32bit OS側から取得してやります。

$v = $m->get('test');
$a = unserialize($v);
print_r($a);

すると、結果は次のようになってしまいます。

Array
(
    [1573079180] => 1062430001292
)

添え字と値は同じものを指定していたはずですが、全く異なる値になってしまいます。
Continue reading…

[PHP] 論理演算子「and, or」と「&&, ||」の違い

論理式を評価する演算子、皆さんはどちらを使っていますか?

if ( $a and $b ) echo "it's true!\n";
if ( $a && $b ) echo "it's also true!\n";

先日、両者の違いについてチームで話題になったので、ちょっとまとめ。

Quick Questions

次の問いにサクサク答えられれば、バッチリ理解しているということで無問題かと。
回答は全て、$xが真(true)か偽(false)で。各問いをクリックすると、答えがわかります。

1. $x = (true and false);
2. $x = true and false;
3. $x = false and true;
4. $x = (true && false);
5. $x = true && false;
6. $x = false && true;
7. $x = (false or true);
8. $x = false or true;
9. $x = true or false;
10. $x = (false || true);
11. $x = false || true;
12. $x = true || false;
13. $x = (false and true or true and true);
14. $x = (false and true || true and true);

さて、正解率はどれくらいだったでしょうか?
Continue reading…



Copyright © 2004–2009. All rights reserved.

RSS Feed. This blog is proudly powered by Wordpress.