キーワード:Perl 解除
何年も前に作ったCGI用の自前ライブラリを使って作っていたアップローダーを
少し改変してみましたので羞恥プレイの一環天草発のオープンソースの一環として
ソースごと公開しようと思います。

※2014/03/07 includeがひとつ漏れてたのに後から気付いたので差し替えました。。。

はっきり言って糞コードと言われてもしょうがないようなコードです。。。

「CGIってPerlで書いてあるからソース晒さないと公開できないじゃん」
と思った方もおられると思いますが、このCGIはPerlではなくC言語で作ったものです。。。
なので、使用するにはsshなんかでシェルにログインしてgccでコンパイルする必要があります。
何故Perlじゃなくて、C言語だったかと言うと単純に私がC言語の方が使い慣れてるからです。
Perlを使い慣れているならPerlを使っていたでしょう。

サーバーサイドのWebプログラミングと言ったらPHPと言ってもいいくらい
PHPが普及していますが、今更CGIを公開しようとしたのは、
アップローダーという特性上、大きなファイルをアップロードする場合があるからです。

PHPでもアップローダーは作れますが、PHPにはそれぞれ
upload_max_filesizepost_max_sizememory_limit
といった設定値があり、その設定値は以下のようになっています。

memory_limitは、PHPが使用可能なメモリの最大サイズ。
post_max_sizeは、一回アップロードの最大サイズで、memory_limitより小さくないといけない。
upload_max_filesizeは、1つのファイルの最大サイズで、post_max_sizeより小さくないといけない。

これからもわかるようにアップロードするファイルをどうやらメモリに
すべて溜め込んでいるっぽい感じじゃないですか?
なので最大でもmemory_limitの値より小さいファイルしかアップロードできません。

memory_limitを増やすと大きなファイルもアップロードできるようになると思いますが、
サーバーへの負荷を考えると、いくらメモリが大きくなったとはいえ、数十MB程度ぐらいしか
使う気になりません。(まぁ、個人の気分次第だとは思いますがw)

そこで、CGIで大きなファイルを送ってもメモリを大量に使わないようなロジックを書けば
解決するわけです。
ようは送られてくるデータをメモリに溜め込まずにファイルに書き出すだけですけどね。

なので1GBとかのファイルも送信可能です。
2GB以上はブラウザによっては送信させてくれなかったり古いWebサーバーだとエラーになったりして
うまく送れない場合も多いですが(実際に2GB以上のファイル送信ができるのか試してませんw)

まぁ、そういう訳でわざわざCGIのアップローダーを作ってみたわけです(作ったのは何年も前ですが)
私が知らないだけで、PHPでも巨大ファイルの送信可能な方法があるのかもしれませんけどねw

ちなみにHTML以外にCSSとJavascriptも一応は使用していますが、
その辺はド素人なんでご了承くださいw

今後、JavascriptとかCSSは勉強する予定ですからw
勉強したら、アップロードとかそのあたりもajaxでやるように
改良するとナウくていいですよねw

ちなみにこれはWindowsのVC++でもコンパイルはできましたが、動作確認は自宅の
Linux環境でしかやっておりません。
また、動作も完璧な動作確認をしたわけではないので、バグが無い保証もありません。

サンプルとして設置したURLを貼りたい所ですが・・・
自宅サーバーのため、あまり晒したくないので、スクリーンショットで勘弁してくださいw
アップロード時にファイルのMD5ハッシュ値を計算するのでファイル破損のチェックもできますよ!
uploader-ss

Webについてあんまり詳しくないのに偉そうに語ってしまいました。。。
間違いはご遠慮なく指摘ください。

この記事の内容はいつも以上に自信がありませんwww

いつも自信満々のような書き方で書いていますが、自分のスキルには全く自信がありません。。。
色んな事に手を出しすぎてどれも中途半端ですからしょうがないんですけどw
CGIって聞いたことありますかね?
最近ではこの仕組みを使わずにWebサーバーのモジュールとして実行する方式が
流行ってますよね?たぶん。
Webプログラマーなら知らないと始まらないPHPなんかがそうですね。
(PHPをCGIとして動作させている風変わりな珍しいサーバーも中にはあるようですが)

さて、このCGIですがCommon Gateway Interfaceのそれぞれの頭文字を取っています。
いやだから頭文字の意味を解説したから何?と、毎回思いますがお決まりなので・・・

ざっくりとCGIについて説明すると
Webサーバーから外部のプログラムを実行して結果を受け取る仕組みです。

ざっくり過ぎてわからん!
例えば"Amakusa"と出力するだけのプログラムがあったとします。
このプログラムを起動すると「Amakusa」と表示されますが
Webサーバー側で起動すると「Amakusa」という出力結果をWebサーバーが受け取り
その結果をブラウザに返します。
ブラウザでは何と表示されるでしょう?

500 Internal Server Error

おい。

なぜエラーになるのかというと、HTTPのヘッダーを出力してないからです。
なのでこのように出力するプログラムを書くといいはずです。
Content-type: text/html

Amakusa
1行空いてますね、これは決まりごとです。
これでブラウザに「Amakusa」と表示されます。

さて、Webサーバーにこのプログラムを実行して!と命令するにはどうすればいいんでしょうか?
簡単です。そのプログラムのURLにブラウザでアクセスするだけです。
http://abcdefg.aaa.jp/xxxx.cgi
のような感じで、この例だとxxxx.cgiがプログラムになります。
CGIの場合は拡張子が主に「cgi」となっている場合が多いです。

このCGIですが、標準入出力ができるプログラミング言語なら何でも作れます。
テキスト処理が多いCGIプログラムではテキスト処理に優れたPerlというスクリプト言語が
多く使われてますが、C言語でもC++でもPHPでも、Linuxなんかのシェルスクリプトでも可能です。

標準入出力について長くなりそうなのでここでは説明しませんw

早い話、CGIプログラムは実行結果をHTTPヘッダーとHTMLで出力してそれを
Webサーバーを経由してブラウザに表示させているだけなんです。

では、CGIでない場合はどうでしょうか?
Webサーバーのモジュールとして実行されるので新しいプロセスを作る必要がないので
起動が早いです。
PHPがこの方式が多いのでPHPの方がPerlより速い!と言ってる人もいますが、
PHPが速いんじゃなくて、動作方式の違いによる差です。
PHPもPerlと同じCGIモードで動かす(またはmod_perlを使うか)と、
たいした速度差なんてないんじゃないの?と思います。

一昔前はCGIと言えばPerlというぐらいPerlがメジャーになってましたが、
今ではPHPの勢いが強そうですね。

私もPerlとPHPを使ってちょっとしたサイトを作った事がありますが、PHPはかなり楽です。
そもそも、Perlと違いWeb用に作られているから当然なんでしょうけど・・・
また、プログラミングの中でも難易度がそんなに高くなく、ホームページが作れるようになって来た
という人も結構とっつきやすいのではないでしょうか。

PerlなんかでCGIプログラムを作成する場合はフォームデータのエンコードやデコードについても
勉強が必要になってきます。(CGI用のモジュールがあるので楽なんですかね?)

なのでWeb技術でサーバーサイドのプログラムを組みたい場合はPHPを勉強するのがオススメです。

本業がプログラマーでない、Web技術素人の日曜プログラマーがエラソーな事書きましたが、
盛大な間違いがあるかもしれませんので気をつけてくださいねw
[ 1 ]      2件中 1-2件