>  기사  >  백엔드 개발  >  4가지 PHP 작동 모드에 대한 자세한 설명

4가지 PHP 작동 모드에 대한 자세한 설명

小云云
小云云원래의
2018-05-12 11:26:415228검색

PHP에는 4가지 작동 모드가 있습니다:

1) cgi 공통 게이트웨이 인터페이스)

2) fast-cgi 상주(장기) CGI php-fpm

3) cli 명령줄 작업(명령줄 인터페이스)

4) 웹 모듈 모드(Apache 등의 웹 서버에서 실행되는 모듈 모드)

1. CGI(Common Gateway Interface)

CGI는 Common Gateway Interface(Common Gateway Interface)) 프로그램입니다. 평신도의 관점에서 CGI는 웹페이지와 웹서버의 실행프로그램을 연결하는 다리와 같다. 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 모드를 설치하려면 LoadModule php5_module module/libphp5.so 줄을 주석 처리해야 합니다. 이 줄에 주석을 달지 않으면 핸들러 모드로 계속 진행됩니다. 모듈 모드입니다.

그런 다음 httpd.conf에 작업을 추가합니다:

Action application/x-httpd-php /cgi-bin/

/cgi-bin/ 디렉토리에서 php-cgi를 찾을 수 없으면 다음에서 cp를 수행할 수 있습니다. PHP의 빈.

그런 다음 Apache를 다시 시작하고 테스트 페이지를 열고 서버 API가 CGI/FastCGI로 변경된 것을 확인하세요. 설명: CGI 모드로 성공적으로 전환되었습니다.

질문:

1) /usr/local/httpd/cgi-bin/에서 cgi 프로그램을 실행할 수 없고 403 또는 500 오류가 발생하는 경우

아파치 오류 로그를 열면 다음 메시지가 표시됩니다: Permission failed: exec of

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) apache 오류 메시지: .... 스크립트의 헤더가 잘못되었습니다. Bad header=

프롬프트에 따르면 헤더에 문제가 있습니다. 파일 출력은 다음과 유사해야 합니다.

Content-type: text/plain; charset=iso-8859-1nn

or Content-type: text/htmlnn

참고: 선언 후 두 개의 빈 줄을 출력해야 합니다. 콘텐츠 유형.

3) 아파치 오류 메시지: Exec 형식 오류

스크립트 해석기 설정 오류입니다. 스크립트의 첫 번째 줄은 '#!Interpreter Path' 형식으로 스크립트 해석기의 경로를 채워야 합니다. PERL 프로그램인 경우 일반적인 경로는 #!/usr/bin/perl 또는 #!/입니다. usr/local/bin /perl PHP 프로그램인 경우 인터프리터 경로를 입력할 필요가 없으며 시스템이 자동으로 PHP를 찾습니다.

2. Fastcgi 모드

fast-cgi는 cgi의 업그레이드 버전입니다. FastCGI는 활성화된 동안 항상 실행될 수 있습니다. 한 번 포크하는 데는 시간이 걸립니다(이것은 CGI에서 가장 비판받는 포크 및 실행 모드입니다).的 FastCGI의 작동 원리는 다음과 같습니다.

(1) 웹 서버는 FastCGI 프로세스 관리자 [PHP의 FastCGI 프로세스 관리자는 PHP-FPM(PHP-FASTCGI 프로세스 관리자)](IIS Isapi 또는 Apache 모듈)에 로드됩니다. (2) FastCGI 프로세스 관리자는 자체적으로 초기화되고 여러 CGI 인터프리터 프로세스(작업 관리자에 표시되는 여러 php-cgi.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는 분산 컴퓨팅을 지원하는 것 같습니다. Fastcgi는 호스트 서버와 완전히 독립적입니다. 아무리 fastcgi가 다운되더라도 서버가 다운되지는 않습니다.

3) 성능 측면에서 fastcgi는 동적 로직 처리를 분리합니다. 로드의 IO 처리는 여전히 호스트 서버에 남아 있으므로 호스트 서버는 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 install

설치 후,

/usr/local/httpd/modules/에 mod_fcgid.so

2) php

를 다시 컴파일하세요./ 구성 -- 접두어=/usr/local/php --enable-fastcgi --enable-force-cgi-redirect --disable-cli

make

make install

이렇게 컴파일한 후, php-cgi가 빈에 들어갑니다. PHP 디렉토리 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 module/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>
 
或者
<IfModule mod_fastcgi>ScriptAlias /fcgi-bin/ "/usr/local/php/bin"
 #定义目录映射FastCgiServer /usr/local/php/bin/php-cgi   -processes 10 
 #配置fastcgi server,<Directory "/usr/local/httpd/fcgi-bin/">
 SetHandler fastcgi-scriptOptions FollowSymLinksOrder allow,denyAllow from all
 </Directory>AddType application/x-httpd-php .php  
 #增加MIME类型AddHandler php-fastcgi .php   
 #.php结尾的请求都要用php-fastcgi来处理Action php-fastcgi /fcgi-bin/php-cgi 
 #设置php-fastcgi的处理器
</IfModule>

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>
改为:
<Directory />
    Options FollowSymLinks
    AllowOverride None
Order allow,deny
Allow from all
</Directory>

이 가능합니다.

ps -ef|grep php-cgi는 10개의 fastcgi 프로세스가 실행 중인 것을 볼 수 있습니다.

3. CLI 모드

cli는 php의 명령줄 실행 모드입니다. 자주 사용하지만 눈치채지 못할 수도 있습니다(예: PHP 설치를 찾기 위해 "php -m"을 자주 사용합니다). Linux 해당 확장은 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 | 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 확장입니다.)

[plain]view plaincopyprint?

1 LoadModule php5_module module/mod_php5.so

여기서 LoadModule 명령을 사용합니다. 모듈 구현의 소스 코드에서 찾을 수 있는 모듈의 이름입니다. 두 번째 옵션은 모듈이 있는 경로입니다. 서버가 실행되는 동안 모듈을 로드해야 하는 경우 HUP 또는 AP_SIG_GRACEFUL 신호를 서버에 보낼 수 있습니다. 신호가 수신되면 Apache는 서버를 다시 시작하지 않고 모듈을 다시 로드합니다.

관련 권장 사항:

PHP 실행 모드 요약

위 내용은 4가지 PHP 작동 모드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.