사실 CGI는 CLI 앱입니까? 생각했기 때문에 시도했습니다.

5490 단어 CgiCPHP

문득 깨달음



이번에 CGI는 말하지 않는다? 몰라? 그런 코타 좋아요.
문득 생각했어요, CGI와 CLI 앱은 본질적으로 같은 것이 아닐까.
왜냐하면 PHP는 이런 식으로 써 브라우저로 액세스하면 いろはにほへと 라고 나오지 않습니까?
그리고 이것을 php index.php 같아서 두드려도 いろはにほへと
index.php
<?php

echo 'いろはにほへと';

그래, 알아차렸어요.
사실 CGI는 본질적으로는 CLI 앱이 아닐까…
오히려 무엇이 다를까요?

메커니즘을 조사해 보겠습니다.



신경이 쓰였기 때문에 어떤 구조로 움직이고 있는지 가볍게 조사하기 위해서, 굳이 C 언어로 CGI를 만들어 보는 것에.
지금까지 C 언어로 CGI 라든지 광인이 하는 일은 인상이 있었습니다만, 의외로 해 보면 큰 일은 없다고 할까, 아무튼 큰 것을 만들지 않았기 때문에 당연합니다만…
이것이 무엇을 하고 있는가 하면(자), 환경 변수를 취해 와 표준 출력에 토하고 있을 뿐이므로, 어딘가에서 어떻게 봐도 CLI 앱입니다.

index.c
#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로 움직일 수있는 사람입니다.

index.php
<?php

echo $_SERVER['REQUEST_URI'];

좋은 웹페이지 즐겨찾기