CGI와 PHP 관계

2015. 10. 16. 23:07

https://kldp.org/node/73386

 

PHP 도 CGI 로 돌아갈 수도 있습니다. 다만 그렇게 쓰는 경우는 거의 없습니다. 님께서 말씀하신대로 CGI 로 돌아가면 각각의 요청마다 프로세스를 생성하므로 성능이 현저하게 떨어지기 때문입니다.

먼저 CGI 란 것부터 간단하게 설명드리겠습니다. CGI 는 소리님께서 말씀하셨듯이 웹서버와 프로그램 간에 데이터를 어떻게 주고 받을 것인가에 대한 규약입니다. 웹서버가 웹브라우저 같은 클라이언트로부터 요청을 받았는데, 웹 서버가 그 요청이 특정 프로그램이 실행될 필요가 있다고 설정 되어 있으면, 프로그램을 실행시키고 그 규약에 따라서 데이터를 프로그램에 넘깁니다. 프로그램 실행이 끝나고 결과가 나오면 프로그램은 규약에 정한대로 결과를 웹서버에 넘겨 줍니다.따라서 보통의 경우 CGI 로 처리를 하면 각 요청마다, 프로세스를 뛰워야 하기 때문에 성능이 좋지 못한 것입니다.

만약 PHP를 CGI 형식으로 수행 한다면, 아마 님 컴퓨터에서도 /usr/bin/php 또는 /usr/local/bin/php 라는 실행파일이 있을텐데, 웹서버를 특정 URL로 요청이 들어오면 php 를 실행시켜서 html 로 변환한후 웹서버에 넘겨주어 처리하게 됩니다. 실제로 이런식으로 설정하는 것도 가능하구요.

그러나 가장 흔한 PHP 설정은 웹서버 내에 php 인터프리터를 내장하는 방법입니다. 즉 요청이 들어왔을 때, 따로 프로그램을 실행시키지 않고 바로 웹서버가 직접 결과를 생성해서 클라이언트로 보내줍니다. 이 방법은 어차피 웹서버는 데몬 형태로 항상 실행중이므로, 요청이 들어와도 다른 프로세스를 생성하지 않기 때문에 성능이 좋습니다. 보통의 경우는 아파치 웹서버에 mod_php4 혹은 mod_php5 라는 모듈을 올려서 사용합니다. 이 모듈은 아파치를 컴파일 하는 시점에서 아예 같이 하나의 프로그램으로 컴파일 할 수도 있지만, 보통은 동적 모듈로 만들어서 아파치가 실행 될때 아파치가 직접 모듈을 자신에게 불러들이게 됩니다.

그리고 웹서버에 직접 내장하는 방법 이외에도, 웹서버 밖에다 따로 데몬을 뛰워 놓고 아파치와 이 데몬 프로세스가 소켓 통신으로 데이터를 주고 받는 방법도 있습니다. SCGI, FCGI 등등이 이런 기술인데, 이 방법을 사용해도 각 요청마다 따로 프로세스를 뛰우지 않고 소켓으로 데이터만 보내고 받으면 되기 때문에 오버헤드를 크게 줄일 수 있게 됩니다.

 

 

원래 의도와는 다른 내용의 답글이 먼저 올라간 스레드네요.
소타님이 이야기한 대로 CGI는 규약입니다.
어떠한 프로그램의 일종으로 볼 수 있는 것이 아닙니다.

웹 서버는 정적 파일 - 이미지, HTML문서 - 를 보내기 위한 프로그램입니다.
그렇기에 동적으로 바뀌는 내용(예를 들어, 게시판 글 목록)이 전달이 되려면 웹서버 자체로는 해결이 안되겠지요. 이를 해결하기 위한 것이 외부 프로그램을 불러서 그 프로그램의 결과를 대신 전달해주는 방법을 만든 것입니다. 이 때 외부 프로그램을 부를때 규칙을 정해서 전달하게 하면 외부 프로그램을 작성/사용할 때 편할 것입니다.

그 규칙을 CGI(Common Gateway Interface)라고 한 것입니다.
이 규칙을 지키지 않고서는 절대로 웹 서버에서 호출을 받거나 웹서버로 결과를 전달할 때 기대했던 결과를 얻지 못합니다.

PHP, ASP, JSP 모두 CGI 규칙을 지키는 프로그래밍 언어입니다.(프로그램이 아닙니다.)
ASP는 항상 웹서버의 모듈 형태로 동작을 합니다.(ASP.DLL 파일)
PHP,JSP는 웹서버의 모듈 형태로 동작할 수도, 별도의 프로그램으로 동작할 수 있습니다.

CGI하고 CGI프로그램하고 분리해서 생각하는 것이 필요합니다.

 

 

 

php는 cgi형태로 돌아갈 수도 있고, 웹서버에 내장할 수도 있습니다.

cgi형태로 돌아가면 PHP코드를 분석 실행하는 인터프리터가 외부에 존재합니다.
웹서버는 php 파일에 대한 요청이 들어올때마다 php 인터프리터 실행시키고 통신합니다.
이때 통신하는 방식이 CGI 규약입니다. (환경변수 세팅하고 뭐 하고 등등...)

하지만 웹서버에 모듈로 내장된다면 웹서버가 PHP코드를 직접 인터프리팅하죠.
이때는 CGI규약하고는 전혀 상관이 없습니다.
웹서버에 내장된 모듈은 PHP에 대한 요청이 올때마다 웹서버와 통신하는데,
이것들은 파이프나 소켓 필요없이 웹서버 프로세스 내에서 다 처리됩니다.
아파치면 아파치 고유의 형식이 있을꺼고 M$ IIS라면 ISAPI를 이용합니다.
성능은 웹서버 내장이 훨씬좋죠.

결론은 PHP != CGI입니다.
내장이면 CGI랑 전혀 상관없고
CGI 형태로 돌아간다면 CGI프로그램에서 인터프리팅되는 스크립트 언어죠.

'' 카테고리의 다른 글

X11 색상 이름  (0) 2016.04.25
HTML 특수문자코드표  (0) 2016.04.25
HTTP 프로토콜  (0) 2015.09.30
MySQL join  (0) 2015.08.24
[HTML] favicon 생성  (0) 2015.07.29
Posted by 캐논볼
,