2006年04月17日 18:52 [Edit]
CGIの神話と現実
PHPのパフォーマンスに関しては、すでに川合さんのPerlよりPHPの方が軽くて速いは本当?が出ていて、これでプロには充分なんだけど、すでにプロのプログラマーを離れて、一般の人でも動的Webページ生成プログラムを書くようになった今、もう一度整理しておいた方がいいかも知れない。
提督の野望 海軍広報: 2006/4/17 PHPたしかにCGIはパーミッションの設定とか面倒なことが多かったし、スピードも遅いから廃れても仕方ないんだけど、じゃあPHPはどのぐらい使いやすいのかね? と思って調べてみた。
誤解その1--CGIはPerlで書かれている
まず最初に抑えておきたいのは、CGIは言語の名前ではなく、Webサーバーが外部プログラムにページ生成を依頼する時にどんな情報を渡し、どう情報を受け取るのかを定めたプロトコルだということだ。このプロトコルを遵守する限り、CGIはどんな言語で書いてもかまわない。当然PHPでもCGIは書ける。以下は環境変数を列挙するCGIを、さまざまな言語で書いたものだ。
C
/*
* compile me as
* gcc -o c.cgi cgi.c
*/
#include <stdio.h>
int main(int argc, char **argv, char **envp){
int i;
printf("Content-Type: text/plain\n\n");
for (i = 0; envp[i] != NULL; i++){
printf("%s\n", envp[i]);
}
}
gauche
#!/usr/bin/env gosh
(use gauche.process)
(define env
(call-with-input-process '("/usr/bin/env") port->string-list))
(define (main argv)
(map print (append '("Content-Type: text/plain" "") env)))
perl
#!/usr/bin/env perl -Tw
use strict;
use warnings;
print "Content-Type: text/plain\n\n";
while(my ($k, $v) = each %ENV){
print "$k=$v\n";
}
__END__
PHP
#!/usr/bin/env php
Content-Type: text/plain
<?php
while(list($k, $v) = each($_SERVER)){
echo "$k=$v\n";
}
?>
Python
#!/usr/bin/env python
import os
print "Content-Type: text/plain"
print ""
for k in os.environ:
print "%s=%s" % (k, os.environ[k])
Ruby
#!/usr/bin/env ruby
puts "Content-Type: text/plain"
puts ""
ENV.each{|k, v|
puts "#{k}=#{v}\n"
}
sh # borne shell
#!/bin/sh echo "Content-Type: text/plain" echo env
CGIは、言語は問わない。環境変数と標準入力を受け取って、標準出力に書き出すだけのプログラムだ。標準出力のはじめにContent-Type:を書き出すことを除けば、何の変哲もないのだ。
誤解その2 -- PHPはPerlより高速
一般的に、PHPはCGIとして動かすのではなく、mod_phpというApache Moduleで動かす。CGIとは何が異なるか?
CGIは、業務に例えれば、Web Server本社から外注を受ける下請け業者のようなもので、当然社外とのやりとりのコストが発生する。しかしApache Moduleの場合、本社に部署があってそこがページ作成を行うので、このコストを節約できる。
ただし、その部署で事故や問題があった場合、Web Server全体が影響を被る。
違いは、実はこれだけなのだ。
そして、Perlにもまさに同様のことをするmod_perlがあり、ドメインを見てもわかるとおり、Apache ModuleとしてはむしろPHPよりもきめ細かく面倒が見られており、また出来る事もPHPよりも遥かに多い。そして速度的にも遜色はないどころか、私見だがmod_perlの方が高速のようにも思われる。最近はjakarta+tomcatが流行のようだが、メモリーの食い方はmod_phpもmod_perlも真っ青である。
誤解その3 -- ○○は大規模サイト作成には向かない
大規模サイトではPerlよりもPHPよりも実績がある。Amazonもはてなもmixiも利用されているのはmod_perlの方であり、PHPの方ではない。ただし、PHPの方は作者のRasmus LerdorfがYahooにいるということもあって、徐々に大規模サイトでも使われているようだ。あと、有名どころではWikipediaがPHPを使っている。PythonにはZopeがあるし、そしてRuby on RailsによるRubyの台頭もめざましい。gaucheにもkahuaがあるさ....といくだろうか。あとHaskellは?Haskell Server Pageなるものはすでに存在するようだけど....
誤解その4 -- ○○は××より優れている
結局言語Aが言語Bより優れているかどうかというのは、日本語と英語のどちらが優れているかという議論と同じく不毛になりがちだ。それよりもいろいろ試してみて、自分にあった言語を、自分にあった状況で使うのがいいだろう。電脳言語は自然言語ほど習得は難しくない。自然言語でPolyglot(多言語を話す人)は稀だが、電脳言語ならプロならむしろ普通だ。
というわけで、そろそろ「電脳多国語辞典」が出てもいいと思うのだけど....なんだかお前書けみたいな声が聞こえてくるような....空耳?
Dan the Man with Too Many Languages to Speak
この記事へのトラックバックURL
Perlは大規模サイト作成には向かない
ですか?
前に関わってたプレゼンスプロバイダ(非VPS共有サーバ方式)では「セキュリティ上の問題がある」のでPHPをmod_phpでは提供していなかったんですよね。今はどうなんだろう。モジュールで提供していないプロバイダがメインストリームなら、PHPにパフォーマンス上のアドバンテージはあまりない気がする。単にHTMLへの埋め込みが楽な言語だというだけ。
どっちにしても言語はTPOに応じて好きなのを使えばいいですよね。どれが優れてる云々という話は食傷…。
いつもコメント書き逃げでごめんなさい。悪意はないです。
指摘を受け、修正するのではなく一般化しました。
Dan the Cyberpolyglot
修正箇所は
>大規模サイトではPerlよりもPHPよりも実績がある。
でしょうか?
文脈的に
大規模サイトではPerlはPHPよりも実績がある。
だと思って読みましたけど。
2chのWebProg板でPHPを礼賛するwebプログラマとその他のプログラマで煽りあっているスレが今年の夏くらいに盛り上がってました。
PHPを支持する人はPHP以外の言語に疎い、知っていたとしてPerl/CGIのみ、というのが読んでみた印象でしたね。
PHPを礼賛してPerlを貶める人は例外なくCGI::Carpを知りません。
「Perlはエラーメッセージが出ないからデバッグが難しい」などとまじめに言い出したりします。
#!/usr/bin/env php
Content-Type: text/plain
<?php
print_r($_SERVER);
?>
そういうひとにはHTML::Masonをすすめてあげてください。