2011-08-12 1 views
6

기본적으로 "PHP"를 "웹 서버"에서 호출 할 수있는 방법을 찾으려고합니다.가상/사용자 정의 "웹 서버"에서 PHP 호출

설명서를 읽었지만 도움이되지 않았습니다.

지금까지 내가 말할 수있는, PHP 호출하는 세 가지 방법이 있습니다 : 명령 행 (예 : php -f "/path/to/script.php")를 통해

  • 를 FastCGI를 통해이 CGI를 통해
  • (??)/(???) 웹 서버 (예 : 아파치)를 통해
  • 모듈

는 그럼 CGI 시작하자. 어쩌면 나는 블라인드 일 수도 있지만, 스펙에서는 웹 서버가 CGI를 구현하는 것에 웹 서버가 데이터 (헤더 & 콜백)를 전달하는 방법을 언급하지 않습니다. 상황은 FastCGI으로 더욱 악화됩니다.

다음으로 우리는 서버 특정 모듈을 가지고 있는데, 모든 리드가 아무데도 끝나지 않기 때문에 무엇을 검색할지 모릅니다.

+1

코드를 읽은 것으로 생각하세요? 귀하의 질문에 이러한 모든 것들은 오픈 소스입니다. –

+0

@ Dan 지금 당장 * 시도하고 있습니다. 하지만 몇 가지 이유로 어려운 일이 있습니다 : ** (1) ** 모든 코드를 찾을 수 없습니다 ** (2) ** 코드는 c/C++ ** (3) ** 코드는 매우 오래되었고/또는 지저분한. – Christian

+0

@ 단이 누구인가? 내가 원한다면 Assembler 또는 ADA에서 (또는 FPC, 내가 계획하고있는) 그것을 수행 할 수 있습니다. – Christian

답변

7

CGI 스크립트를 호출하는 것은 매우 간단합니다. PHP는 몇 가지 특수성이 있지만, 당신은 기본적으로 만 후 전화 설치로 PHP-CGI 바이너리 환경 변수의 목록이 필요합니다

setenv GATEWAY_INTERFACE="CGI/1.1" 
setenv SCRIPT_FILENAME=/path/to/script.php 
setenv QUERY_STRING="id=123&name=title&parm=333" 
setenv REQUEST_METHOD="GET" 
... 

exec /usr/bin/php-cgi 

대부분이 보일러됩니다. SCRIPT_FILENAME은 exec 매개 변수가 아닌 실제 PHP 파일 이름을 PHP 인터프리터에 전달하는 방법입니다. PHP에서 중요한 것은 REDIRECT_STATUS=200 비표준 변수이기도합니다.

GET 요청의 경우 환경 변수 만 있으면됩니다. POST 요청의 경우 HTTP 요청 본문을 실행 된 php-cgi 바이너리에 stdin으로 파이프하기 만하면됩니다. 반환 된 stdout은 불완전한 HTTP 헤더 인 \ r \ n \ r \ n과 페이지 본문으로 구성된 CGI 응답입니다.

(메모리에서 온 것입니다.)

+0

OH. 그것은 그 모든 것을 설명합니다. – Christian

+0

문제가 발생하면 'PATH_INFO'및 'SCRIPT_PATH' 변수를 명시 적으로 채워야합니다. 자세한 내용은 [내 질문] (http://stackoverflow.com/questions/18962960)을 확인하십시오. – Andrey

1

FastCGI를 그것이 너무 현명하게 사용되는 때문에, 그것은 (당신이 예를 들어, 나중에 루비 드롭 수) 당신에게 언어 독립을 줄 것하고 lotsofexampleswell documented의 아마 가장 좋은 방법입니다.

정말로 원하는 경우 직접 Server API을 쓸 수도 있지만 FastCGI를 구현하는 것보다 더 까다 롭고 몇 가지 단점이 있습니다.

스트레이트 CGI로 전혀 신경 쓰지 않을 것이므로 FastCGI가 존재합니다.

+0

OK, 웹 서버는 PHP 실행 파일로 IPC를 어떻게 처리합니까? 로컬 (루프백) 연결? – Christian

+0

@Christian 그것은 다른 호스트 (임의의 TCP/IP 연결) 또는 유닉스 파이프의 다른 끝에있을 수 있습니다. 내가 링크 된 스펙을 읽으십시오, 아주 명백하게 쓰여졌습니다. –

+0

나는 몇 시간의 잠을 잘 잤어. 이미 오전 2시 30 분입니다./ – Christian