PHP에는 4가지 작동 모드가 있습니다:
1) cgi 공통 게이트웨이 인터페이스)
2) fast-cgi long-live CGI
3) cli 명령줄 작업(Command 라인 인터페이스)
4) 웹 모듈 모드(아파치 등 웹 서버가 실행되는 모듈 모드)
5) ISAPI(Internet Server Application Program Interface)
참고: PHP5.3 이후에는 PHP 더 이상 ISAPI 모드가 없으며 설치 후 더 이상 php5isapi.dll 파일이 없습니다. IIS6에서 더 높은 버전의 PHP를 사용하려면 FastCGI 확장을 설치한 다음 IIS6이 FastCGI를 지원하도록 활성화해야 합니다.
1. CGI(Common Gateway Interface)
CGI는 Common Gateway Interface(공통 게이트웨이 인터페이스)를 말하는데, CGI는 웹 페이지를 연결하는 다리와 같습니다. 및 WEB 서버의 실행 프로그램이 연결되어 HTML로 받은 명령을 서버의 실행 프로그램에 전달한 후 서버의 실행 프로그램의 결과를 HTML 페이지로 반환합니다. CGI는 크로스 플랫폼이며 거의 모든 운영 체제에서 구현될 수 있습니다. CGI는 이미 오래된 모델이며 최근에는 거의 사용되지 않았습니다.
사용자 요청이 있을 때마다 먼저 cgi 하위 프로세스가 생성된 후 요청이 처리되고 하위 프로세스가 처리 후 종료됩니다. 및 실행 모드. 사용자 요청 수가 매우 많으면 메모리, CPU 시간 등 시스템 리소스를 많이 차지하게 되어 성능이 저하됩니다. 따라서 CGI를 사용하는 서버는 연결 요청만큼 많은 CGI 하위 프로세스를 가지게 됩니다. 하위 프로세스의 반복적인 로드는 CGI 성능이 저하되는 주요 원인입니다.
PHP를 서버측 소프트웨어(예: Apache)에 내장하여 모듈로 설치하고 싶지 않은 경우 CGI 모드로 설치하도록 선택할 수 있습니다. 또는 다양한 CGI 래퍼와 함께 PHP를 사용하여 코드에 대한 보안 chroot 및 setuid 환경을 만듭니다. 이렇게 각 클라이언트는 php 파일을 요청하고, 웹 서버는 php.exe(win에서는 php.exe, Linux에서는 php)를 호출하여 파일을 해석한 후, 해석 결과를 다음과 같은 형태로 클라이언트에게 반환합니다. 웹페이지. 이 설치 방법은 일반적으로 웹 서버의 cgi-bin 디렉터리에 PHP 실행 파일을 설치합니다. CERT 권장 사항 CA-96.11에서는 cgi-bin 디렉터리에 인터프리터를 배치하지 않을 것을 권장합니다.
이 방법의 장점은 명확한 구조와 강력한 제어성으로 웹 서버를 특정 프로그램 처리와 분리한다는 것입니다. 동시에 단점은 액세스 수요가 높을 경우 CGI 프로세스가 수백 개의 동시 요청으로 인해 서버가 수백 개의 프로세스를 포크한다고 상상해 보십시오. 이것이 바로 CGI가 항상 낮은 성능과 높은 리소스 소비로 악명이 높았던 이유입니다.
CGI 모드 설치:
CGI는 이미 오래된 모드이고 최근 몇 년간 거의 사용되지 않았기 때문에 테스트용일 뿐입니다.
CGI 모드를 설치하려면
LoadModule php5_module module/libphp5.so 줄을 주석 처리해야 합니다. 이 줄에 주석을 달지 않으면 핸들러 모드로 계속 진행됩니다. 모듈 모드입니다.
그런 다음 httpd.conf에 작업을 추가합니다.
Action application/x-httpd-php /cgi-bin/
/cgi-bin/ 디렉토리에서 php-cgi를 찾을 수 없는 경우 다음을 수행할 수 있습니다. PHP에서 다운로드하세요. 빈에 cp가 있습니다.
그런 다음 Apache를 다시 시작한 다음 테스트 페이지를 열고 서버 API가 CGI/FastCGI로 변경된 것을 확인하세요. 설명: CGI 모드로 성공적으로 전환되었습니다.
문제:
1) cgi 프로그램이 /usr/local/httpd/cgi-bin/에 있고 403 또는 500 오류가 발생하여 실행할 수 없는 경우
아파치 열기 오류 로그에는 다음 메시지가 표시됩니다. 권한 거부됨:
의 exec는 cgi 프로그램의 속성을 확인할 수 있습니다. Linux 컨텍스트 파일에 정의된 대로 /usr/local/httpd/cgi-bin/은 httpd_sys_script_exec_t 속성이어야 합니다. ls -Z로 확인하고 그렇지 않은 경우 다음 명령으로 변경합니다: chcon -t httpd_sys_script_exec_t /var/www/cgi-bin/*.cgi 가상 호스트에 cgi가 있는 경우 질문 2를 참조하여 사용하도록 합니다. 그런 다음 chcon을 통해 cgi 파일의 컨텍스트를
httpd_sys_script_exec_t로 설정합니다. chcon -R -t httpd_sys_script_exec_t cgi-bin/
2) 아파치 오류 메시지: .... 스크립트의 잘못된 헤더. 잘못된 헤더=
프롬프트에 따르면 문제가 있습니다. 헤더, 파일 출력을 확인하십시오. 첫 번째 문장은 무엇입니까?
Content-type: text/plain; 끝에 두 개의 빈 줄이 출력되어야 합니다.
3) 아파치 오류 메시지: Exec 형식 오류
스크립트 해석기 설정 오류입니다. 스크립트의 첫 번째 줄은 '#!Interpreter Path' 형식으로 스크립트 해석기의 경로를 채워야 합니다. PERL 프로그램인 경우 일반적인 경로는 #!/usr/bin/perl 또는 #!/입니다. usr/local/bin /perl PHP 프로그램인 경우 인터프리터 경로를 입력할 필요가 없으며 시스템이 자동으로 PHP를 찾습니다.
2. Fastcgi 모드
FastCGI는 CGI의 업그레이드 버전입니다. 활성화 후에는 항상 실행될 수 있습니다. 매번 포크하는 데 시간이 걸리지 않습니다(이것은 CGI에서 가장 비판받는 포크 및 실행 모드입니다).
FastCGI의 작동 원리는 다음과 같습니다.
(1) FastCGI 프로세스 관리자는 웹 서버가 시작될 때 로드됩니다. [PHP의 FastCGI 프로세스 관리자는 PHP-FPM(php-FastCGI)입니다. 프로세스 관리자)] (IIS ISAPI 또는 Apache 모듈);
(2), FastCGI 프로세스 관리자는 자체적으로 초기화되고 여러 CGI 인터프리터 프로세스를 시작합니다(여러 PHP는 작업 관리자에서 볼 수 있음). exe)을 실행하고 웹 서버로부터의 연결을 기다립니다.
(3) 클라이언트 요청이 웹 서버에 도달하면 FastCGI 프로세스 관리자가 CGI 인터프리터를 선택하고 연결합니다. 웹 서버는 CGI 환경 변수와 표준 입력을 FastCGI 하위 프로세스 php-cgi로 보냅니다.
(4) FastCGI 하위 프로세스는 처리를 완료한 후 동일한 연결에서 웹 서버로 표준 출력 및 오류 정보를 반환합니다. FastCGI 하위 프로세스가 연결을 닫으면 요청이 처리됩니다. 그런 다음 FastCGI 하위 프로세스는 FastCGI 프로세스 관리자(WebServer에서 실행)의 다음 연결을 기다리고 처리합니다. 일반 CGI 모드에서는 php-cgi.exe가 여기서 종료됩니다.
CGI 모드에서는 일반적으로 CGI가 얼마나 느린지 상상할 수 있습니다. PHP에 대한 모든 웹 요청은 php.ini를 다시 구문 분석하고, 모든 dll 확장을 다시 로드하고, 모든 데이터 구조를 다시 초기화해야 합니다. FastCGI를 사용하면 이 모든 작업이 프로세스가 시작될 때 한 번만 발생합니다. 추가 보너스는 지속적인 데이터베이스 연결이 작동한다는 것입니다.
Fastcgi의 장점:
1) 안정성 관점에서 fastcgi는 독립된 프로세스 풀에서 CGI를 실행합니다. 매우 불안정합니다. 쉽게 폐기한 다음 새 프로세스를 다시 할당하여 로직을 실행하세요.
2) 보안 관점에서 Fastcgi는 분산 컴퓨팅을 지원합니다.
3) 성능 측면에서 fastcgi는 동적 로직 처리를 서버에서 분리합니다. 부하가 심한 IO 처리는 여전히 호스트 서버에 맡겨져 있습니다. 일반적인 동적 웹 페이지의 경우 논리적 처리의 일부만 있고 정적 그림이 많을 수 있습니다.
FastCGI 단점:
장점을 얘기한 뒤 단점을 얘기해보자. 실제 사용해본 결과 FastCGI 모드는 프로덕션 환경의 서버에 더 적합합니다. 그러나 개발 기계에는 적합하지 않습니다. Zend Studio를 사용하여 프로그램을 디버깅할 때 FastCGI는 PHP 프로세스가 시간 초과되었다고 생각하고 페이지에 500 오류를 반환하기 때문입니다. 이것이 너무 짜증나서 개발 컴퓨터에서 ISAPI 모드로 다시 전환했습니다.
fastcgi 모드 설치:
Apache 설치 경로는 /usr/local/httpd/
php 설치 경로는 /usr/local/php/
1) mod_fastcgi 설치
wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz tar zxvf mod_fastcgi-2.4.6.tar.gz cd mod_fastcgi-2.4.6 cp Makefile.AP2 Makefile vi Makefile,编辑top_dir = /usr/local/httpd make make insta
설치 후
/usr/local/에 파일이 하나 더 생성됩니다. httpd/modules/:
mod_fcgid.so
2) PHP를 다시 컴파일
./configure –prefix=/usr/local/php –enable-fastcgi –enable-force-cgi-redirect –disable-cli make make install
이렇게 컴파일한 후 , PHP의 bin 디렉토리에 있는 php-cgi는 fastcgi 모드 PHP 인터프리터입니다.
성공적인 설치 후
php -v 输出 PHP 5.3.2 (cgi-fcgi).
을 실행하세요.
여기 출력에는 cgi가 포함되어 있습니다. -fcgi
참고:
1. 컴파일 매개변수는 추가할 수 없습니다 –with-apxs=/usr/local/httpd/bin/apxs, 그렇지 않으면 설치된 PHP 실행 파일은 cli 모드가 됩니다
2 컴파일 시 –disable-cli를 추가하지 않으면 PHP 5.3.2(cli)
3) apache 구성
설정이 필요합니다 fastcgi 모드에서 PHP 프로그램을 실행하기 위한 Apache
vi httpd.conf
가상 머신을 사용하여 다음을 구현합니다:
#加载fastcgi模块 LoadModule fastcgi_module modules/mod_fastcgi.so #//以静态方式执行fastcgi 启动了10进程 FastCgiServer /usr/local/php/bin/php-cgi -processes 10 -idle-timeout 150 -pass-header HTTP_AUTHORIZATION <VirtualHost *:80> # DocumentRoot /usr/local/httpd/fcgi-bin ServerName www.fastcgitest.com ScriptAlias /fcgi-bin/ /usr/local/php/bin/ #定义目录映射 /fcgi-bin/ 代替 /usr/local/php/bin/ Options +ExecCGI AddHandler fastcgi-script .php .fcgi #.php结尾的请求都要用php-fastcgi来处理 AddType application/x-httpd-php .php #增加MIME类型 Action application/x-httpd-php /fcgi-bin/php-cgi #设置php-fastcgi的处理器: /usr/local/php/bin/php-cgi <Directory /usr/local/httpd/fcgi-bin/> Options Indexes ExecCGI Order allow,deny allow from all </Directory> </VirtualHost>
4).restart apache, phpinfo를 확인하세요. 서버 정보가
Apache/2.2.11 (Unix) mod_fastcgi/2.4.6 등이라면 설치가 성공한 것입니다.
403 오류가 발생하면 /usr/local/httpd/fcgi-bin/에 충분한 권한이 있는지 확인하세요.
또는
<Directory /> Options FollowSymLinks AllowOverride None Order deny,allow Deny from all </Directory>
괜찮습니다.
ps -ef|grep php-cgi는 10개의 fastcgi 프로세스가 실행 중인 것을 볼 수 있습니다.
3. CLI 모드
cli는 PHP의 명령줄 실행 모드입니다. 자주 사용하지만 눈치 채지 못할 수도 있습니다. (예: Linux에서 자주 사용합니다.) ) php -m "PHP 명령줄 실행 모드인 PHP가 설치한 확장 기능을 찾으세요. 관심 있는 학생은 php -h를 입력하여 실행 모드를 자세히 알아볼 수 있습니다.)
1. PHP를 실행시키세요. 지정된 파일.
php script.php php -f script.php
위의 두 가지 방법 모두(-f 매개변수 유무에 관계없이) 스크립트의 script.php를 실행할 수 있습니다. 실행할 파일을 선택할 수 있습니다. 지정하는 PHP 스크립트는 .php 확장자를 가질 필요가 없습니다. 파일 이름과 확장자를 가질 수 있습니다.
2. 명령줄에서 직접 PHP 코드를 실행합니다.
php -r "print_r(get_define_constants());"
이 방법을 사용할 때 쉘 변수 대체 및 따옴표 사용에 주의하세요. .
참고: 위의 예를 주의 깊게 읽으십시오. 코드를 실행할 때 시작 및 끝 표시가 없습니다! -r 매개변수를 사용하면 이러한 표시가 필요하지 않으며 구문 오류가 발생합니다.
3. 표준 입력(stdin)을 통해 실행해야 하는 PHP 코드를 제공합니다.
위 사용법은 다음 예와 같이 PHP 코드를 동적으로 생성하고 명령줄을 통해 이러한 코드를 실행할 수 있는 매우 강력한 기능을 제공합니다.
$ some_application | some_filter | php | sort -u >final_output.txt
4. 모듈 모드
이때 모듈 모드는 mod_php5 모듈로 통합됩니다. mod_php5 모듈의 역할 Apache가 전달한 PHP 파일 요청을 받아 처리한 후 처리된 결과를 Apache로 반환합니다. Apache가 시작되기 전에 구성 파일에서 PHP 모듈(mod_php5)을 구성하면 PHP 모듈은 apache2의 ap_hook_post_config 후크를 등록하고 Apache가 PHP 파일에 대한 요청을 수락하기 시작할 때 이 모듈을 시작합니다.
시작 시 이러한 로딩 방법 외에도 Apache 모듈은 런타임 시 동적으로 로드될 수 있습니다. 즉, 소스 코드를 다시 컴파일하거나 전혀 중지할 필요 없이 서버를 확장할 수 있습니다. 서버. 우리가 해야 할 일은 HUP 또는 AP_SIG_GRACEFUL 신호를 서버에 보내 서버에 모듈을 다시 로드하라고 알리는 것뿐입니다. 그러나 동적 로딩 전에 모듈을 동적 링크 라이브러리로 컴파일해야 합니다. 이때 동적 로딩은 동적링크 라이브러리를 로딩하는 것입니다. Apache에서 동적 링크 라이브러리의 처리는 mod_so 모듈을 통해 완료되므로 mod_so 모듈은 동적으로 로드될 수 없으며 Apache의 핵심으로 정적으로 컴파일될 수만 있습니다. 이는 Apache와 함께 시작된다는 의미입니다.
Apache는 모듈을 어떻게 로드하나요? 앞서 언급한 mod_php5 모듈을 예로 들어보겠습니다. 먼저 Apache의 구성 파일인 httpd.conf에 한 줄을 추가해야 합니다.
이 운영 모드는 Windows 환경에서 Apache 서버를 사용할 때 자주 사용하는 모드이고, 모듈화(DLL)에서는 PHP 웹 서버와 함께 실행 중입니다. (PHP의 운영 효율성을 높이기 위한 CGI 기반의 Apache 확장입니다.)
LoadModule php5_module module/mod_php5.so
여기에서는 LoadModule 명령을 사용합니다. 이 명령의 첫 번째 매개변수는 모듈 이름입니다. 이름은 모듈 구현의 소스 코드에서 찾을 수 있습니다. 두 번째 옵션은 모듈이 있는 경로입니다. 서버가 실행되는 동안 모듈을 로드해야 하는 경우 HUP 또는 AP_SIG_GRACEFUL 신호를 서버에 보낼 수 있습니다. 신호가 수신되면 Apache는 서버를 다시 시작하지 않고 모듈을 다시 로드합니다.
5 ISAPI 모드
ISAPI(Internet Server Application Program Interface)는 Microsoft에서 제공하는 인터넷 서비스용 API 인터페이스 집합입니다. 이후 사용자 요청에 따라 ISAPI DLL을 활성화할 수 있습니다. , 이는 메모리에 상주하며 사용자의 다른 요청을 기다립니다. 또한 하나의 DLL에 여러 사용자 요청 처리 기능을 설정할 수도 있으며 ISAPI DLL 응용 프로그램과 WWW 서버가 동일한 프로세스에 있으므로 효율성이 향상됩니다. CGI보다 훨씬 높습니다. (Microsoft의 독점성으로 인해 Windows 환경에서만 실행 가능)
PHP는 Apache 모듈입니다. Apache 서버가 시스템을 시작한 후 여러 프로세스 복사본을 미리 생성하여 메모리에 상주합니다. 요청이 발생하면 즉시 처리되므로 이러한 예비 하위 프로세스를 사용하여 하위 프로세스 생성으로 인한 지연이 발생하지 않도록 하세요. 이러한 서버 복사본은 HTTP 요청을 처리한 후 즉시 종료되지 않고 다음 요청을 기다리는 동안 컴퓨터에 남아 있습니다. 클라이언트 브라우저 요청에 대한 응답이 더 빠르고 성능도 더 높습니다.
6. Nginx의 PHP 실행 모드(Nginx+ PHP-FPM)
FastCGI를 사용하는 두 가지 일반적인 스택이 있습니다: lighthttpd+spawn-fcgi; 다른 하나는 nginx+PHP -FPM(spawn- fcgi도 사용할 수 있습니다).
A. 위에서 언급한 것처럼 두 구조 모두 FastCGI를 사용하여 PHP를 지원하므로 HTTPServer가 완전히 해방되어 더 나은 응답과 동시 처리가 가능합니다. 따라서 lighttpd와 nginx는 모두 작지만 강력하고 효율적이라는 평판을 얻고 있습니다.
B. 둘은 좋은 것과 나쁜 것으로 나눌 수 있습니다.spawn-fcgi는 lighttpd의 일부이므로, lighttpd가 설치되면 일반적으로spawn-fcgi가 PHP를 지원하는 데 사용됩니다. 그러나 현재 일부 사용자는 lighttpd의 spwan- fcgi의 동시 액세스 권한이 높으면 위에서 언급한 메모리 누수가 발생하고 fastcgi도 자동으로 다시 시작됩니다. 즉, 이때 사용자가 PHP 스크립트 프로세서에 접근하면 흰색 페이지가 나타날 수 있습니다(즉, PHP를 구문 분석할 수 없거나 오류가 발생함).
또 하나: 우선 nginx에는 lighttpd 자체처럼 fastcgi(spawn-fcgi)가 포함되어 있지 않기 때문에 완전히 가볍습니다. PHP를 구문 분석하려면 타사 FastCGI 프로세서를 사용해야 하므로 실제로는 다음과 같습니다. 이 nginx는 매우 유연합니다. 타사 구문 분석 프로세서에 연결하여 PHP 구문 분석을 실현할 수 있습니다(nginx.conf에서 설정하기 쉽습니다). nginx는 spwan-fcgi를 사용할 수 있습니다(lighthttpd는 함께 설치해야 하지만 nginx의 경우 포트를 피해야 합니다. 일부 오래된 블로그에는 이와 관련된 설치 튜토리얼이 있습니다). 그러나spwan-fcgi에는 언급한 대로 사용자가 점차적으로 결함을 발견하기 때문입니다. 위의 내용은 이제 nginx+spawn-fcgi 조합의 사용을 천천히 줄입니다.
C.spawn-fcgi의 결함으로 인해 새로운 타사가 있습니다(현재 가까운 시일 내에 PHP 코어에 추가하기 위해 열심히 노력하고 있다고 들었습니다). PHP -FPM이라고 불리는 PHP용 프로세서(자세한 내용은 구글에서 찾아볼 수 있습니다). Spawn-fcgi와 비교하면 다음과 같은 장점이 있습니다.
PHP 패치로 개발되기 때문에 설치 시 PHP 소스코드와 함께 컴파일해야 하는데, 이는 PHP 코어로 컴파일된다는 의미이므로, 성능 측면에서는 더 좋습니다.
동시에 높은 동시성을 처리하는 데 있어서spawn-fcgi보다 낫습니다. 적어도 fastcgi 프로세서를 자동으로 다시 시작하지는 않습니다. 사용된 특정 알고리즘과 디자인은 Google에서 찾을 수 있습니다.
따라서 위에서 언급한 것처럼 nginx의 가볍고 유연성으로 인해 현재 성능이 우수하며 점점 더 많은 사람들이 nginx+PHP/PHP-FPM 조합을 사용하고 있습니다
7. 요약
현재
HTTPServer 영역에는 세 가지 인기 스택이 있습니다:
(1) Apache+mod_php5
( 2) lighttp+spawn-fcgi
(3) nginx+PHP-FPM
세 가지 중 후자 두 가지의 성능이 약간 더 좋을 수 있지만 Apache에는 풍부한 모듈과 기능이 있습니다. 현재, 여전히 상사입니다. 일부 사람들은 높은 동시성 조건에서 nginx+PHP-FPM이 Apache+mod_php5의 5~10배에 도달할 수 있다는 것을 테스트했습니다. 이제 점점 더 많은 사람들이 nginx+PHP-FPM을 사용하고 있습니다.
PHP 작동 모드 요약과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!