PHPとかPerl(CGI)とか、そういうものは初心者言語だと見下す風潮が、昔からあるらしいな。しかし、PHPプログラマをバカにしてはいけないんである。なぜなら、これほど習熟する必要のある言語もなかなかないからだ。
言語自体が抱えている多数のバグや非推奨の命令を回避するには知ってるしかないし、バージョンによってまったく違う挙動も憶えているしかない。
たとえば、「mysql_real_escape_string」という冗談みたいな命令があるが、この命令があらわす機能は「mysql_escape_stringはウソだから使うな」である。ググってコピペするとまず確実に間違える。
そんなPHPを使いこなしている技術者たちを、バカにすることなんかできない……。
いや冷静にいうなら、そういうのはどの言語にもあるが。
っていうか、ほんとに人を馬鹿にできるレベルなら、もう言語なんかどれでも関係なくなってるはずだと思うが。(というか、いったい誰がバカにしてるのか知らないけどw)
PHPは、言語自体がJAVAへの劣等感を抱えているようなところがある。だから技術者もだんだんそういう気になってきて、「JAVAが好き」という人を見ると反発したくなってしまうようにできているような気がする。バカにされてるんじゃなくて被害妄想かも。
ajaxとか流行っちゃって、わりと気軽につかわれてたりするわけですが。これがけっこう、やばいことになりがちなのです。
サーバに何回リクエストを投げるのかというのを意識しないで、onclickとか複数選択のselectタグのonchangeとか、危険なところにajaxを仕込んであったりする。けっこうよくある。
そういうイベントは、下手をするとすごい回数発生してしまうのです。サーバにも同じ回数のリクエストが飛ぶわけなので、そのあたりは意識しなければいけない。
サーバでは多くの場合、リクエストを受けるたびにSQL発行するはずだ。こういうコードは大変まずいのです。
というわけで、こんな関数を用意しておくといいと思う。
var ajaxTimer; function hogeOnChange() { window.clearTimeout(ajaxTimer); ajaxTimer = window.setTimeout("ajax()" , 1000); }
1秒間イベントが来なかったら初めてajaxする。
作法っていうか、考えてないとDBサーバが固まっちゃったりとか平気でするんで、ぜひとも気をつけたい。
正規表現でやろうと思ったんだけど、入れ子を無限に許すとした場合どうすんのかなあ……というのでつまってやめた。ていうか無理な気がする。
ようするにほしいのは、
「無限に入れ子構造を許可したカッコの、開始から終了までに一致する正規表現」
なんだが。中にかっこの組がいくつあるかわからないとなると、難しい。↓にもそんなこと書いてあるようだし。
http://www.hyuki.com/dig/paren.html
他のWikiのソース参考にしたくても、無限の入れ子構造を許可したWikiなんてないからなあ。
いままではどうしていたのかというと、一番内側から順に、マッチしなくなるまで変換をくりかえしていたのです。しかしこの方法はやめたい。
よくいうロジックとビューの分離をするために、一度オブジェクトとして表現したいんだが、内側から一致しちゃうとそれができない。一発でHTMLに変換しちゃうなら難しくないんだが……。
まあ理屈としては、無理に正規表現つかうよりも一文字ずつ読み出していったほうが速いはずなので、これでいいとは思うんだけど。(正規表現はコンパイル済みとはいえ)
なんか方法あるなら知りたい。
というわけで自分用サイト管理システムWiki風を作ってるわけですが。まだ2割もできてないのに、パフォーマンス計測が楽しくなっちゃってそっちばっかりやってたり。
今回わたし、すっかり反省しました。
いままでは、できるだけrequire_onceと書くようにしてたんです。重いという話は聞いてたけど、でも意味のある命令なんだし、言語にそういう命令がある以上、使うべきところでは使うべきだろう、と思ってたんです。
しかし。いろいろ測ってるうちに、これが一番時間かかってね? と気づいてしまったのです。
というわけで、require_onceを全部下のように書きかえてみた。
if(!class_exists('Hoge')) { include <絶対パス入れた定数> . '/Hoge.php'; }
結果。実に1秒以上も速くなったね。
びっくりです。
回数が多いのはたしかだが、しかし1秒って(笑)
さすがにこれほど違うなら「require_onceは使うな!」といってしまうべきだろう。
……うーむ。PHPって(ry
あ、バージョンは5.2です。5.3では修正されてるんだろうか。
不具合があるんだけどさすがにソースがひどすぎてうんざりしているこのサイトなので、PHPで作りなおそうかと思ったんだけど……。やばい。PHP遅い。
いや、一般には、mod_perl使わないPerlはPHPに負けるというのが通説だったような気もするが。(現状は、mod_perlもfastcgiもナシで稼動中)
まあロジックもまるっきり変えてるし、っていうか、遅いと評判のオブジェクト生成をしまくってるしとかあるので、一概にはいえないわけだけど。これからチューニングしはじめたらどうなるかわからんけど。
とはいえ、Devel::SmallProfとかやれるおかげで、Perlのほうがチューニングしやすかったのは大きい気がするなあ。