CGI講座 ≫ とにかく書く
準備
理屈だけじゃはじまらない。
とにかく簡単なのを書いてみましょう。
HTMLのときと同じくテキストエディタを使います。
よく使うようならショートカットを作成してデスクトップ上に置いておくのもいいでしょう。
書いたあとはPC環境に作ったWebサーバにブラウザからアクセスして確認をするので、こちらも前に説明した「準備」を参考にして環境を整えて置いてください。
さっそく書いてみましょう!
書き方はPerlとPHPで違うので、それぞれ別に説明します。

と、その前に、確認はPC環境で行うので、作ったファイルをドキュメントルート下にコピーするより、直接その場所に保存するように、ファイルの置き場所を最初から確保しておきましょう。
Webサーバのドキュメントルートが
C:\htdocs
だった場合、この直下か、その下にディレクトリを作ってそこに保存します。ディレクトリがない場合は、あらかじめ作っておきましょう。
また、ファイルを置いた場所でCGIが実行できるようになっている必要があります。Webサーバの設定ファイルでよく確認しましょう。
中身を書いてみよう!(Perl編)
実行パスを書く
まず一行目はスクリプトの実行パスを書かなくてはなりません。
perlを使いますので、
#!/usr/local/bin/perl
などと書いてみましょう。
しかし、これはサーバのPerlのパスです。Windowsではperlの位置は「#!c:/php/bin/perl」とかになるはずです。正式には「c:/php/bin/perl.exe」ですが、拡張子.exeは省略して書く事ができます。
#!c:/php/bin/perl
”#!”に続いてパスを書いて改行しましょう。
これはサーバによって違いますので、各自自分のサーバの設定を確認して書きましょう。
改行の前に空白などを絶対に入れないように気を付けます。
しかし!
CGIはサーバ上にアップして動かすのが目的なので、PC上で動いている1行目の書き方をそのままもっていってもサーバ上では「Perlのパスが違う」といって動きません。
つまり、PC上で確認してアップするときに、いちいちパスを変更しないといけません。
もしもサーバのパスが/usr/local/bin/perlで、Webサーバをインストールした場所と同じドライブ上に「/usr/local/bin/perl」という同じパスでPerlをインストールできていれば変更する必要はありません。
ですが、大抵Perlは別のところにインストールされているはずです。
が!これを変更せずに済む方法があります。
コマンドプロンプトを管理者として実行します。
C:\Users\ユーザ名>
と出ていて、カーソルが点滅している思います。このカーソルより前の部分は「プロンプト」といって入力を促す部分です。面倒なので、以降この部分はすべて省略します。
前提として、PC上のperl.exeの位置が
c:/perl/bin/perl.exe
だとします。
やりたいことは、
c:/usr/local/bin/がc:/perl/bin/の中身にアクセスしている状態になればいいわけです。

これをシンボリックシンクと呼びます。ショートカットみたいなものだとおもってください(あくまで「みたいな」ものです)
コマンドプロンプトで次のコマンドを一行ずつ実行してみてください。白文字部分だけです。右側の色のついた部分は説明です。
c: ←Cドライブに移動
cd / ←ルートに移動
mkdir usr ←usrディレクトリを作る
cd usr ←usrディレクトリに移動
mkdir local ←localディレクトリを作る
cd / ←localディレクトリに移動
mklink /D usr/local/bin c:/perl/bin ←シンボリックリンクを作る
こうすると、「/usr/local/bin/perl(.exe)」は「c:/perl/bin/perl(.exe)」を指していることになります。
なので、PC上で次のよう書いたものを実行しても、きちんと実行されます。
#!/usr/local/bin/perl
しかーし!
ここで気付いた人もいるかと思いますが、
ドライブ名はどこいった?
というのが疑問です。
実はこのシンボリックシンクですが、CGIを動かすためにはWebサーバの位置を基準に考えます。
例えばWebサーバApacheをインストールした場所が、Hドライブであった場合は上の方法でシンボリックリンクを作ってもCGIは上手く動きません。
1行目のパスは、ApacheのあるHドライブを基準に見るからです。この場合、H:/usr/local/bin/perlを見に行って、「そんなのないよー!」と言われてしまいます。
さらにperlの場所が「k:/perl/bin/perl.exe」であった場合、次のように書く必要があります。
H:
cd /
mkdir usr
cd usr
mkdir local
cd /
mklink /D usr/local/bin k:/perl/bin
こうすると、H:/usr/local/binからk:/perl/binにシンボリックリンクがはられます。
もしもApacheをインストールした場所がCドライブだった場合は
C:/usr/local/bin/perl
Hドライブだった場合は
H:/usr/local/bin/perl
が実行されることになります。Apacheのドライブの場所にあわせてシンボリックリンクを作りましょう。

このシンボリックリンクですが、利用できるのはWindows Vista以降になります。それ以前の環境の場合は、面倒ですがサーバにアップするときにパス部分を直しましょう。
一括で内容を変更してくれるソフトもあります。こちらを参考にしてください。
また、ドライブ問題もわかりにくいのですが、セキュリティソフトがジャマをしてうまくリンクがはれない場合があります。「アクセスが拒否されました」というメッセージが出来たらその可能性が高いです。
一時期セキュリティを切っておく、などして対応してください。
それでもできない場合はお気の毒ですがあきらめてください!
もしも間違えたりした場合は、シンボリックリンク側を削除してください。エクスプローラからできます。間違えて、大本のPerlインストール側をまるっと削除しないようにしてください。
また、シンボリックリンクは同じリンク元に対して複数作れます。
もしもサイトを2つ運用しようとして、片方のサーバが
/usr/bin/perl
もう一方が
/usr/local/bin/perl
だった場合でも、両方でシンボリックリンクを作っておけばどちらも使えます。
中身を書く
いきなり中身を書くのはなんなので、とりあえず一行目のパスの後に一行あけましょう。
この後、続いてperlで実行するスクリプトを書きます。
が、今の所何か実行するべき知識はありませんので、とりあえず何か出力してみましょう。
#!/usr/local/bin/perl
print "Content-type: text/html\n\nHello!";
1;
または
#!/usr/local/bin/perl
print <<"EOM";
Content-type: text/html
Hello!
EOM
1;
と書いて下さい。どちらでもやることは同じです。単に文字列を出力してるだけです。
CGIファイルとして保存する
名前を付けて保存しましょう。test.cgiとでもしておきましょうか。
拡張子を.plで指定されている場合はtest.plとして下さい。このとき、拡張子なしで保存すると拡張子がtest.txtとなってしまうので、きちんと拡張子まで指定しましょう。もし間違えてしまったらエクスプローラーから名前を変更します。
保存場所は、保存場所にきめたドキュメントルートの下です。
C:\htdocs
下におくと「C:/htdocs/test.cgi」となります。
さあ!早速アップしましょう。
と・・・行きたい所ですが。一つ注意を。
このtest.cgiぐらいでしたら問題ありませんが、自分で作ったCGIスクリプトは絶対に何か間違いがあります。文法上の間違いですね。
できたら、コマンドプロンプトを使って間違いをチェックしておきましょう。
コマンドプロンプトを立ち上げたら、次の順に実行します。
C:
cd /htdocs
perl -wc test.cgi
test.cgi syntax OK
と表示されればOKです。このあたりの詳しい説明はPerl入門でしています。参考にしてください。
ブラウザで確認する
ブラウザで確認してみましょう。実行したいCGIファイルが
C:/htdocs/test.cgi
だった場合、ドキュメントルートがC:/htdocs/だとすると、ブラウザのURL欄に
http://localhost/test.cgi
といれて実行します。結果は次のとおり。

動かない場合は、シンボリックリンクがうまくいっていない可能性が考えられます。
まずはシンボリックリンクを使わないパスで書いて確認しましょう。そもそもそのPerl自体がなかったりパスが違っている可能性も考えてください。
エクスプローラからファイルがあるか確認しましょう。
それ以外は文法チェック。Perlでの間違いはブラウザに表示されないので、コマンドプロンプトから確認しましょう。Perl入門の基礎知識の実行方法に、チェックする方法を載せています。をちらを参考にしてください。
文法上に間違いがなければCGIとしてのエラーになります。
HTMLを出力してみる
今まで書いてきたのは簡単なものです。
実際CGIはサーバ側で何か処理をして、それをHTMLとして出力する場合が多いです。
#!/usr/local/bin/perl
print <<"EOM";
Content-type: text/html
<!DOCTYPE html>
<html>
<head>
<title>MY HOME PAGE</title>
</head>
<body>
4の平方根は
EOM
print sqrt(4);
print <<"EOM";
です。
</body>
</html>
EOM
1;
結果
4の平方根は 2です。
数値の平方根を計算して出力しました。HTMLの出力を2回に分けて、途中で平方根を求めるプログラム部分をはさんでいます。