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

この記事へのトラックバック
404 Blog Not Found:CGIの神話と現実
404 Blog Not Found:CGIの神話と現実【】at 2012年01月21日 22:26
google-code-prettifyを本blogでも導入しました。 ul.favicon { list-style: none } google-code-prettify - Google Code ex: 404 Blog Not Found:CGIの神話と現実 404 Blog Not Found:たらいを回すならHaskell cf: 404 Hatena::Diary not Found - [Haten...
google-code-prettifyを導入【404 Blog Not Found】at 2007年03月26日 16:23
mod_perlは本当に速いのか?【PHPスクリプト無料配布所 :: PHP.TO】at 2007年02月02日 16:11
PHPについて書いたら404さんからツッコミが入った。 http://blog....
2006/4/18 PHP2【提督の野望 海軍広報】at 2006年04月18日 16:38
あなたは Web アプリを作成するときにどの言語を用いるか、あるいはどの言語を得意とするか。PHP? Java (Servlet/JSP)? Perl? Active Server Pages (.NET)? これらの全てに共通する事柄がある。そう、皆スクリプト言語だということだ。レスポンスキャッシュ(いちど使ったペ...
素朴な疑問 - なぜスクリプト系 Web アプリ言語がいまだ主流なのか?【Hardcoded】at 2006年04月17日 22:08
この記事へのコメント
プロは 2002 年の情報で充分なんですよ。
Posted by dam at 2006年04月19日 23:47
川合さんベンチマークはmod_perl/1.24 vs mod_php/4.0.5だったので、イマドキのmod_perl/2.0 vs mod_php/5.1.xあたりだとどうなるんでしょうね?mod_pythonも入れてちょっと興味あります。
Posted by shoma at 2006年04月18日 11:55
>「Perlはエラーメッセージが出ないからデバッグが難しい」などとまじめに言い出したりします。

そういうひとにはHTML::Masonをすすめてあげてください。
Posted by boguspokesman at 2006年04月17日 22:57
PHP なら while を使わず下記のように書くよ。

#!/usr/bin/env php
Content-Type: text/plain

<?php
print_r($_SERVER);
?>
Posted by test at 2006年04月17日 22:38
ああそうだ。
PHPを礼賛してPerlを貶める人は例外なくCGI::Carpを知りません。

「Perlはエラーメッセージが出ないからデバッグが難しい」などとまじめに言い出したりします。
Posted by Youth at 2006年04月17日 22:10
修正前の記事を読んでませんが。
修正箇所は
>大規模サイトではPerlよりもPHPよりも実績がある。
でしょうか?
文脈的に
大規模サイトではPerlはPHPよりも実績がある。
だと思って読みましたけど。

2chのWebProg板でPHPを礼賛するwebプログラマとその他のプログラマで煽りあっているスレが今年の夏くらいに盛り上がってました。
PHPを支持する人はPHP以外の言語に疎い、知っていたとしてPerl/CGIのみ、というのが読んでみた印象でしたね。
Posted by Youth at 2006年04月17日 22:05
あらいしゅんいちさん、
指摘を受け、修正するのではなく一般化しました。
Dan the Cyberpolyglot
Posted by at 2006年04月17日 20:56
↑うん。単なるtypoだと思う。

前に関わってたプレゼンスプロバイダ(非VPS共有サーバ方式)では「セキュリティ上の問題がある」のでPHPをmod_phpでは提供していなかったんですよね。今はどうなんだろう。モジュールで提供していないプロバイダがメインストリームなら、PHPにパフォーマンス上のアドバンテージはあまりない気がする。単にHTMLへの埋め込みが楽な言語だというだけ。

どっちにしても言語はTPOに応じて好きなのを使えばいいですよね。どれが優れてる云々という話は食傷…。

いつもコメント書き逃げでごめんなさい。悪意はないです。
Posted by boguspokesman at 2006年04月17日 20:50
>PHPは大規模サイト作成には向かない

Perlは大規模サイト作成には向かない
ですか?
Posted by あらいしゅんいち at 2006年04月17日 20:10