実はCGIってCLIアプリなのでは?と思ったので試してみた
ふとした気づき
今時 CGI なんて言わない?知らない?そんなこたぁいいんですよ。
ふと思ったんですよ、CGIとCLIアプリって本質的に同じものなんじゃないかなって。
だってPHPってこんなふうに書いてブラウザでアクセスしたら いろはにほへと
って出るじゃないですか?
そしてこれを php index.php
みたいにして叩いても いろはにほへと
って出ますよね?
<?php
echo 'いろはにほへと';
そう、気付いてしまったのです。
実は CGI って本質的には CLI アプリなのではないかと…。
むしろ何が違うんでしょう?
仕組みを調べてみることに
気になったのでどういう仕組で動いてるのか軽く調べるために、敢えて C 言語で CGI を作ってみることに。
今まで C 言語で CGI とか狂人のやることって印象があったのですが、意外とやってみると大したことはないというか、まぁ大したものを作ってないから当たり前なんですが…。
これが何をしているかというと、環境変数を取ってきて標準出力に吐いてるだけなので、どっからどう見ても CLI アプリです。
#include <stdio.h>
// getenv
#include <stdlib.h>
// strcmp
#include <string.h>
/*
get path for after hostname
*/
char* getPath(void) {
char *path = getenv("REQUEST_URI");
return path;
}
int main(void) {
// put http header
printf("Content-type: text/plain\n\n");
char *path = getPath();
// show current path
printf("Current path: %s\n", path);
// routing, required .htaccess to serve on apache
if (strcmp(path, "/foo") == 0) {
printf("hoge");
} else if (strcmp(path, "/bar") == 0) {
printf("piyo");
} else {
printf("fuga");
}
return 0;
}
実際に動かしてみたところ
CGI として
CLIとして
辿り着いた結論
恐らくこれは動作環境が重要なのであって、多分 CGI と CLI アプリの作りとしては大きな違いはないのではないか?というのが辿り着いた結論です。
いやまぁ引数を argv
から取るか環境変数から取るかは結構違う気もしますが、基本的に表示したいものを標準出力に吐く点は同じですし、別に CGI で TCP ソケットを触るわけでもないので、同じようなものでは?と思った次第。
これは多分、 HTTP サーバーを通すことで 標準出力が HTTP レスポンスに出力され、 X サーバーを通すなら画面に、プリンタサーバーを通せば紙にといった具合に、どこのサーバーを通して標準出力をするかで出てくるところが変わるのでは?と感じました。(細かいことを言うともっと複雑らしい)
多分 Apache とかの HTTP サーバーは TCP ソケットをいい感じにやってくれて、 HTTP ヘッダを環境変数に入れて CGI スクリプトを起動といったところをしてくれているのではないかと思ったので、暇な時に TCP 通信から始める HTTP サーバーの実装でもやってみたいところですね…。
おまけ
取り敢えず PHP の CGI を CLI として動かせるやつです。
<?php
echo $_SERVER['REQUEST_URI'];
Author And Source
この問題について(実はCGIってCLIアプリなのでは?と思ったので試してみた), 我々は、より多くの情報をここで見つけました https://qiita.com/Lycolia/items/a1a6e1abf1edd066caea著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .