Heim > Fragen und Antworten > Hauptteil
Ich habe einige Zweifel an der Verwendung von PHP-CGI, bitte helfen Sie mir.
Das hypothetische Szenario sieht wie folgt aus:
Nginx überwacht 192.168.1.101:80, es gibt keine PHP-Umgebung
index.php 192.168.1.101::/dev/shm/index.php
php-fpm hört 192.168.1.102:90000
Die Verwirrung besteht darin, dass index.php während des laufenden Prozesses analysiert und auf 192.168.1.101 ausgeführt wird, oder dass es zum Parsen und Ausführen an 192.168.1.102 gesendet wird? Kann ein Experte den detaillierten Prozess erklären?
Wenn Sie 1.102 analysieren und ausführen und auf ein relativ großes Codepaket wie Phar oder eine einzelne große PHP-Datei stoßen, wird dann das gesamte Paket zusammen gesendet? Sieht der Intranetverkehr nicht beeindruckend aus?
仅有的幸福2017-05-16 17:25:26
监听 192.168.1.101:80 的 Nginx 通过 fastcgi_pass 把 PHP 请求分发到 PHP-FPM 监听的 192.168.1.102:9000 , PHP-FPM 根据 Nginx 请求, 解析 Nginx 传过来的这个参数 $_SERVER['SCRIPT_FILENAME'] 指定的 PHP 文件, PHP-FPM 工作进程内部的 PHP 解释器执行完脚本后把结果通过局域网返回给 Nginx.
Nginx 和 PHP-FPM 进程间采用了 TCP 网络通信, 而 MOD_PHP 这种把 PHP 解释器作为一个模块集成到 Apache 进程(线程)内部运行的模式是完全不同的, 通过 Nginx 的 upstream, 很容易实现 PHP-FPM 集群和高可用.
另外:
Apache 通过 mod_fastcgi 模块可以搭配 PHP-FPM 使用, 这时建议 Apache 使用 event MPM 这个多进程多线程 epoll 事件驱动的 MPM. PHP-FPM 则采用默认的非线程安全版本, 更高效和稳定.
Apache 通过 mod_fcgid 模块可以搭配 PHP-CGI 使用, 建议同上.
注意到, Apache 的 mod_fastcgi 模块类似于 Nginx 提供的 fastcgi 支持, 功能跟 mod_fcgid 不一样, 比mod_fcgid 高效, 因为 mod_fcgid 需要自己管理 PHP-CGI 进程,而 mod_fastcgi 下,是 PHP-FPM 主进程管理自己的 FPM 工作进程.
天蓬老师2017-05-16 17:25:26
感谢 @白一梓,@eechen 两位大拿的回答,其实问这个问题,想了解的是192.168.1.102 这个机器上是否需要布php脚本。因为之前主要用的是apache,很少用到php-fpm~
刚刚自己找了两台服务器搭了一下环境,大概理解了。
其实 php-fpm 只是接收到 nginx 传过来的header,也就是fastcgi_param,然后找到 SCRIPT_FILENAME 之后,从1.102 自身硬盘上加载脚本并执行,也就是 nginx 和 php-fpm 传输的过程,只是 header,与脚本无关,然后通过 header 跟apache一样执行php代码~
也就是,抛开apache的其他高级功能以及内部运行原理不谈,nginx + php-fpm 和 nginx + apache 在运行的流程上是基本一样的~~