PHP 작동 모드에 대한 자세한 요약

藏色散人
풀어 주다: 2023-04-10 20:32:01
앞으로
4787명이 탐색했습니다.

PHP 실행 모드

SAPI

여기서 언급된 PHP 실행 모드는 실제로 SAPI(서버 응용 프로그램 프로그래밍 인터페이스, 서버 응용 프로그램 프로그래밍 포트)를 나타냅니다. SAPI는 PHP가 외부 세계와 통신할 수 있는 인터페이스를 제공합니다. PHP는 이 인터페이스를 사용하여 다른 응용 프로그램과 상호 작용합니다. 다양한 애플리케이션 시나리오를 위해 PHP는 apache, apache2filter, apache2handler, cli, cgi, embed, fast-cgi, isapi 등 다양한 SAPI도 제공합니다.

PHP 작동 모드에 대한 자세한 요약

php_sapi_name() — 웹 서버와 PHP 사이의 인터페이스 유형을 반환합니다. 가능한 반환 값에는 aolserver, apache, apache2filter, apache2handler, caudium, cgi(PHP 5.3까지), cgi-fcgi, cli, cli-server,continuity, embed, fpm-fcgi, isapi, litespeed, milter, nsapi, phttpd가 포함됩니다. , pi3web, roxen, thttpd, tux 및 webjames.
php_sapi_name() — 返回 web 服务器和 PHP 之间的接口类型。可能返回的值包括了 aolserver、apache、 apache2filter、apache2handler、 caudium、cgi (直到 PHP 5.3), cgi-fcgi、cli、 cli-server、 continuity、embed、fpm-fcgi、 isapi、litespeed、 milter、nsapi、 phttpd、pi3web、roxen、 thttpd、tux 和 webjames。

目前 PHP 内置的很多 SAPI 实现都已不再维护或者变的有些非主流了,PHP 社区目前正在考虑将一些 SAPI 移出代码库。 社区对很多功能的考虑是除非真的非常必要,或者某些功能已近非常通用了,否则就在 PECL 库中。

接下来会对其中五个比较常见的运行模式进行说明。

CLI 模式

CLI( Command Line Interface ), 也就是命令行接口,PHP 默认会安装。通过这个接口,可以在 shell 环境下与 PHP 进行交互 。在终端里输入 php -v,会得到类似下图的结果(安装了 PHP 前提下):

PHP 작동 모드에 대한 자세한 요약

因为有 CLI 的存在,我们可以直接在终端命令行里运行 PHP 脚本,就像使用 shell、Python 那样,不用依赖于 WEB 服务器。比如 Laravel 框架中的 Artisan 命令行工具,它其实就是一个 PHP 脚本,用来帮助我们快速构建 Laravel 应用的。

CGI 模式

CGI(Common Gateway Interface,通用网关接口)是一种重要的互联网技术,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI 描述了服务器和请求处理程序之间传输数据的一种标准。

WEB 服务器只是内容的分发者。比如 Nginx,如果客户端请求了 /index.html,那么 Nginx 会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据;如果客户端现在请求的是 /index.php,根据配置文件,Nginx 知道这个不是静态文件,需要去找 PHP 解析器来处理,那么它会把这个请求经过简单处理后交给PHP 解析器。Nginx 会传哪些数据给 PHP 解析器呢?url 要有吧,查询字符串也得有吧,POST 数据也要有,HTTP 请求头 不能少吧,好的,CGI 就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。

CGI 模式运行原理:当 Nginx 收到浏览器 /index.php 这个请求后,首先会创建一个对应实现了 CGI 协议的进程,这里就是 php-cgi(PHP 解析器)。接下来 php-cgi 会解析 php.ini 文件,初始化执行环境,然后处理请求,再以 CGI 规定的格式返回处理后的结果,退出进程。最后,Nginx 再把结果返回给浏览器。整个流程就是一个 Fork-And-ExecutePHP에 내장된 많은 SAPI 구현은 더 이상 유지되지 않거나 다소 비주류가 되었습니다. PHP 커뮤니티는 현재 일부 SAPI를 코드 기반에서 옮기는 것을 고려하고 있습니다. 커뮤니티는 실제로 필요하지 않거나 일부 기능이 거의 보편적이지 않는 한 PECL 라이브러리에 많은 기능이 포함되어 있다고 간주합니다.

다음은 보다 일반적인 5가지 작동 모드에 대해 설명합니다. PHP 작동 모드에 대한 자세한 요약

CLI 모드

명령줄 인터페이스인 CLI(Command Line Interface), PHP가 기본적으로 설치됩니다. 이 인터페이스를 통해 쉘 환경에서 PHP와 상호 작용할 수 있습니다. 터미널에 php -v를 입력하면 아래 그림과 유사한 결과를 얻게 됩니다(PHP가 설치되어 있다고 가정).

PHP 작동 모드에 대한 자세한 요약

Beca CLI를 사용하세요 웹 서버에 의존하지 않고 쉘이나 Python을 사용하는 것처럼 터미널 명령줄에서 직접 PHP 스크립트를 실행할 수 있습니다. 예를 들어, Laravel 프레임워크의 Artisan 명령줄 도구는 실제로 Laravel 애플리케이션을 빠르게 구축하는 데 사용되는 PHP 스크립트입니다. 🎜🎜CGI 모드🎜🎜CGI(Common Gateway Interface)는 클라이언트가 웹 브라우저에서 네트워크 서버에서 실행되는 프로그램으로 데이터를 요청할 수 있도록 하는 중요한 인터넷 기술입니다. CGI는 서버와 요청 처리기 간의 데이터 전송 표준을 설명합니다. 🎜WEB 서버는 단지 콘텐츠 배포자일 뿐입니다. 예를 들어, Nginx에서 클라이언트가 /index.html를 요청하면 Nginx는 파일 시스템에서 파일을 찾아 브라우저로 보냅니다. 클라이언트가 지금 배포하는 것은 정적 데이터입니다. 구성 파일에 따라 /index.php를 요청하면 Nginx는 이 파일이 정적 파일이 아니며 PHP 파서에서 처리해야 한다는 것을 인식한 다음 요청을 PHP 파서에 전달합니다. 간단한 처리. Nginx는 어떤 데이터를 PHP 파서에 전달합니까? URL이 있어야 하고, 쿼리 문자열이 있어야 하며, POST 데이터가 있어야 하며, HTTP 요청 헤더가 누락되어서는 안 됩니다. CGI는 어떤 데이터를 어떤 형식으로 전송할지 규정하는 프로토콜입니다. 요청 처리를 위해 백엔드로 전달됩니다. 🎜🎜CGI 모드 작동 원리: Nginx가 브라우저 /index.php 요청을 받으면 먼저 CGI 프로토콜에 해당하는 프로세스를 생성합니다. 여기에는 php-cgi(PHP 파서)가 있습니다. 다음으로 php-cgi는 php.ini 파일을 구문 분석하고 실행 환경을 초기화한 후 요청을 처리하고 처리된 결과를 CGI에서 지정한 형식으로 반환한 후 프로세스를 종료합니다. 마지막으로 Nginx는 결과를 브라우저에 반환합니다. 전체 프로세스는 Fork-And-Execute 패턴입니다. 사용자 요청 수가 매우 많으면 메모리, CPU 시간 등 시스템 자원을 많이 차지하게 되어 성능이 저하됩니다. 따라서 CGI를 사용하는 서버에서는 연결 요청 수만큼 CGI 하위 프로세스가 발생하게 됩니다. 하위 프로세스의 반복적인 로드는 CGI 성능이 저하되는 주요 원인입니다. 🎜🎜🎜🎜🎜CGI 모드의 장점은 모든 서버와 완전히 독립적이며 중개자 역할만 한다는 것입니다. 즉, 웹 서버 및 스크립팅 언어 또는 완전히 독립적인 프로그래밍 언어에 대한 인터페이스를 제공합니다. 데이터 전송을 완료하기 위해 CGI 프로토콜을 통해 연결됩니다. 이것의 장점은 그들 사이의 상관 관계를 최소화하여 서로를 더욱 독립적이고 독립적으로 만드는 것입니다. 🎜🎜🎜 CGI 모드는 이미 비교적 오래된 모드이며 최근에는 거의 사용되지 않습니다. 🎜🎜

FastCGI 모드

FastCGI(Fast Common Gateway Interface, Fast Common Gateway Interface)는 대화형 프로그램이 웹 서버와 통신할 수 있도록 하는 프로토콜입니다. FastCGI는 이전 CGI(Common Gateway Interface)의 향상된 버전입니다. FastCGI는 웹 서버와 CGI 프로그램 간의 상호 작용 오버헤드를 줄여 서버가 동시에 더 많은 웹 페이지 요청을 처리할 수 있도록 최선을 다하고 있습니다.

정의에 따르면 FastCGI도 프로토콜입니다. FastCGI 프로토콜을 구현하는 프로그램은 활성화된 한 항상 실행될 수 있으며 실행되지 않는 수명이 긴 CGI 프로토콜 프로그램에 가깝습니다. 매번 포크하는 데 시간이 걸립니다.

FastCGI 모드 작동 원리: FastCGI 프로세스 관리자가 시작된 후 먼저 php.ini 파일을 구문 분석하고 실행 환경을 초기화한 다음 여러 CGI 프로토콜 해석기 데몬을 시작합니다(여러 php-cig 또는 php-cgi를 볼 수 있음). .exe), 클라이언트 요청이 WEB 서버에 도달하면 FastCGI 프로세스 관리자는 CGI 인터프리터를 선택하고 연결하며 WEB 서버는 CGI 환경 변수와 표준 입력을 보냅니다. FastCGI 하위 프로세스 php-cgi에서는 php-cgi 하위 프로세스가 처리를 완료한 후 표준 출력 및 오류 정보를 WEB 서버에 반환하며 이때 php-cgi 하위 프로세스는 연결을 닫습니다. , 요청이 처리된 후 FastCGI 프로세스 관리자의 다음 요청 연결을 계속 기다리고 처리합니다.

PHP 작동 모드에 대한 자세한 요약

FastCGI 모드는 C/S 구조를 채택하여 WEB 서버와 스크립트 파싱 서버를 분리하고 스크립트 파싱 서버에서 하나 이상의 스크립트 파싱 데몬을 동시에 시작할 수 있습니다. 웹 서버가 동적 프로그램을 만날 때마다 실행을 위해 FastCGI 프로세스로 직접 전달된 다음 결과가 브라우저로 반환됩니다. 이 방법을 사용하면 웹 서버가 정적 요청을 독점적으로 처리하거나 동적 스크립트 서버의 결과를 클라이언트에 반환할 수 있으므로 전체 응용 프로그램 시스템의 성능이 크게 향상됩니다.

또한 CGI 모드에서는 php-cgi의 php.ini 구성이 변경된 후 새로운 php-ini 구성이 적용되려면 php-cgi 프로세스를 다시 시작해야 하며 원활한 다시 시작이 불가능합니다. FastCGI 모드에서 PHP-FPM은 새로운 하위 프로세스를 생성하여 php.ini 수정 후 원활한 재시작을 달성할 수 있습니다.

PHP-FPM(PHP-FastCGI 프로세스 관리자)은 FastCGI 프로토콜을 PHP 언어로 구현하는 프로세스 관리자로, Andrei Nigmatulin이 작성하고 구현했으며 PHP에 공식적으로 포함되어 커널에 통합되었습니다.

FastCGI 모드의 장점:

  • 안정성 관점에서 FastCGI 모드는 독립 프로세스 풀을 사용하여 CGI 프로토콜 프로그램을 실행합니다. 단일 프로세스가 종료되면 시스템은 이를 쉽게 폐기한 다음 새 프로세스를 다시 할당할 수 있습니다.

  • 보안 관점에서 FastCGI 모드는 분산 컴퓨팅을 지원합니다. FastCGI 프로그램과 호스트 서버는 완전히 독립적이며 FastCGI 프로그램이 중단되더라도 서버는 영향을 받지 않습니다.

  • 성능 관점에서 FastCGI 모드는 동적 로직 처리를 서버에서 분리합니다. 로드가 많은 IO 처리는 여전히 호스트 서버에 남아 있으므로 호스트 서버는 IO를 전적으로 처리할 수 있습니다. 이미지 등등.

FastCGI 모드는 현재 PHP의 주류 웹 서비스 운영 모드로 효율적이고 안정적인 성능을 갖추고 있어 누구나 사용하도록 권장됩니다.

모듈 모드

PHP는 종종 Apache 서버와 쌍을 이루어 LAMP 지원 운영 환경을 구성합니다. Apache에 하위 모듈로 PHP를 통합하는 것이 모듈 모드입니다. Apache의 일반적인 구성은 다음과 같습니다.

LoadModule php5_module modules/mod_php5.so
로그인 후 복사

이 명령은 LoadModule 명령을 사용합니다. 모듈 이름은 모듈 구현의 소스 코드에서 찾을 수 있습니다. 두 번째 옵션은 모듈이 있는 경로입니다. 서버가 실행되는 동안 모듈을 로드해야 하는 경우 HUP 또는 AP_SIG_GRACEFUL 신호를 서버에 보낼 수 있습니다. 신호가 수신되면 Apache는 모듈을 다시 로드합니다. 서버를 다시 시작하지 않고. 이 모듈은 Apache가 apache2의 ap_hook_post_config 후크에 등록하여 PHP 파일에 대한 요청을 수락하기 시작할 때 시작됩니다. LoadModule 命令,该命令的第一个参数是模块的名称,名称可以在模块实现的源码中找到。第二个选项是该模块所处的路径。如果需要在服务器运行时加载模块,可以通过发送信号 HUP 或者 AP_SIG_GRACEFUL 给服务器,一旦接受到该信号,Apache 将重新装载模块,而不需要重新启动服务器。通过注册到 apache2 的 ap_hook_post_config 挂钩,在 Apache 启动的时候启动此模块以接受 PHP 文件的请求。

例如,当客户端访问 PHP 文件时,Apache 就会调用 php5_module

예를 들어 클라이언트가 PHP 파일에 액세스하면 Apache는 php5_module을 호출하여 PHP 스크립트를 구문 분석합니다. Apache는 요청을 받을 때마다 PHP에 연결하여 요청을 완료하는 프로세스를 생성합니다. 모듈 모드에서는 PHP가 모듈로 Apache에 컴파일되는 경우가 있으므로 문제가 PHP에서 발생하는지 또는 Apache에서 발생하는지 판단하기 어렵습니다. 🎜
과거에는 풍부한 모듈과 기능으로 기업에서 Apache를 웹 서버로 사용하는 경우가 많았기 때문에 모듈 모드에서 실행되는 PHP + Apache의 조합이 매우 일반적이었습니다. 최근에는 비동기식 이벤트 기반 고성능 Nginx 서버의 등장으로 시장 점유율이 급격히 증가했습니다. FastCGI 모드에서 실행되는 PHP + Nginx 조합은 더 나은 성능을 제공하며 Apache를 따라잡는 경향이 있습니다.

ISAPI 모드

ISAPI(Internet Server Application Program Interface)는 Microsoft에서 제공하는 인터넷 서비스용 API 인터페이스 집합입니다. ISAPI DLL은 사용자 요청에 의해 활성화된 후 메모리에 상주하여 사용자의 다른 요청을 기다릴 수 있습니다. 하나의 DLL에 여러 사용자 요청 처리 기능을 설정할 수도 있습니다. 또한 ISAPI DLL 응용 프로그램과 WEB 서버가 동일한 프로세스에 있으므로 효율성이 CGI보다 훨씬 높습니다. Microsoft의 독점성으로 인해 Windows 환경에서만 실행할 수 있습니다.

거의 사용되지 않으므로 여기서는 자세히 소개하지 않겠습니다.

추천 학습: "PHP 비디오 튜토리얼"

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

관련 라벨:
php
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿