как работает пхп
Прежде всего, сначала поймите, какая связь между cgi, php-cgi, fastcgi и php-fpm, которые часто можно услышать, чтобы помочь понять принцип работы php.
cgi-протокол
Протокол cgi используется для определения веб-сервера (например, nginx), то есть, какие данные и в каком формате данные доставляет сервер распространения контента.
интерпретатор процесса php-cgi
php-cgi — это интерпретатор процесса протокола cgi в php.Каждый раз, когда он запускается, ему необходимо пройти через процесс загрузки файла php.ini -> инициализация среды выполнения -> обработка запроса -> возврат содержимого на веб-сервер -> выход из процесса php-cgi
протокол fastcgi
Протокол fastcgi является дополнением к повышению эффективности протокола cgi.Он в основном оптимизирован для необходимости запуска процесса интерпретатора cgi каждый раз, когда приходит запрос.Процессу интерпретатора cgi больше не нужно перезагружать php каждый раз он получает запрос веб-сервера.ini файл и среду выполнения инициализации
Менеджер процессов php-fpm
php-fpm — это реализация протокола fastcgi. Это менеджер процессов. Он включает в себя главный и рабочий процессы при запуске. Главный процесс отвечает за управление рабочими процессами. Как правило, существует несколько рабочих процессов, которые используются для мониторинга портов. , получать запросы от веб-серверов, и каждый рабочий процесс имеет интерпретатор процесса cgi для выполнения php-кода.
Как запускается и работает php
При запуске phpfpm запускается основной процесс, загружается файл php.ini, инициализируется среда выполнения и запускаются несколько рабочих процессов. Каждый раз, когда приходит запрос, рабочий процесс, слушающий порт, будет его обрабатывать.
Принцип плавного перезапуска PHP
Каждый раз, когда конфигурация php.ini изменяется и перезапускается, будет запускаться новый рабочий процесс для загрузки новой конфигурации, а существующий процесс будет уничтожен после завершения работы, что обеспечивает плавный перезапуск.
Как работает нгинкс
Если вы хотите понять принцип взаимодействия nginx и php, вам также необходимо разобраться в серверной части в конфигурационном файле nginx
server {
listen 80; #监听80端口,接收http请求
server_name www.example.com; #一般存放网址,表示配置的哪个项目
root /home/wwwroot/zensmall/public/; # 存放代码的根目录地址或代码启动入口
index index.php index.html; #网站默认首页
#当请求网站的url进行location的前缀匹配且最长匹配字符串是该配置项时,按顺序检查文件是否存在,并返回第一个找到的文件
location / {
#try_files,按顺序检查文件是否存在,返回第一个找到的文件
#$uri代表不带请求参数的当前地址
#$query_string代表请求携带的参数
try_files $uri $uri/ /index.php?$query_string; #按顺序检查$uri文件,$uri地址是否存在,如果存在,返回第一个找到的文件;如果都不存在,发起访问/index.php?$query_string的内部请求,该请求会重新匹配到下面的location请求
}
#当请求网站的php文件的时候,反向代理到php-fpm去处理
location ~ \.php$ {
include fastcgi_params; #引入fastcgi的配置文件
fastcgi_pass 127.0.0.1:9000; #设置php fastcgi进程监听的IP地址和端口
fastcgi_index index.php; #设置首页文件
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #设置脚本文件请求的路径
}
}
Общий смысл приведенной выше конфигурации сервера таков: каждый раз, когда nginx прослушивает запрос URL-адреса на порту 80, он будет выполнять сопоставление местоположения с URL-адресом. Если он соответствует правилу /, внутренний запрос будет перенаправлен, и будет инициирован внутренний запрос /index.php?$query_string, а соответствующее правило конфигурации местоположения отправит запрос рабочему процессу php-fpm, прослушивающему порт. 9000.
Суммировать
Ниже приводится простейший процесс запроса пользователя:
Пользователь получает доступ к доменному имени -> доменное имя выполняет разрешение DNS -> запросы к соответствующему IP-серверу и порту -> nginx прослушивает запрос соответствующего порта -> nginx соответствует расположению URL-адреса -> выполняет правила под соответствующее местоположение -> nginx перенаправляет запрос в php -> рабочий процесс php-fpm прослушивает запрос nginx -> рабочий процесс выполняет запрос -> рабочий процесс возвращает результат выполнения в nginx -> nginx возвращает результат пользователю