其他模式

CGI模式

CGI 即通用网关接口(Common Gateway Interface),通俗地讲,CGI 就是将 Web 服务器和 PHP 执行程序连接起来,把接收的指令传递给 PHP 执行程序,再把服务器执行程序的结果返还给 Web 服务器,如图7-20所示。

image 2024 06 10 11 27 14 699
Figure 1. 图7-20 CGI示意图

对于每一个用户请求,都会先创建 CGI 的子进程,然后处理请求,处理完后结束这个子进程,这就是 fork-and-execute 模式。用户请求数量非常多会大量挤占系统的资源(如内存、CPU 时间等),造成效率低下。所以,对于采用 CGI 模式的服务器,有多少连接请求,就会有多少 CGI 子进程,子进程反复加载也是导致 CGI 性能低下的主要原因,这也是 FastCGI 出现的原因。

Embed模式

PHP 提供了一个 Embed SAPI,也就是说,PHP 允许在 C/C++ 语言中调用 PHP/ZE 提供的函数,编译时增加 --enable-embed 生成。该模式对外提供了两个 API,即 php_embed_init 和 php_embed_shutdown。php_embed_ini 用于完成模块初始化和请求初始化,php_embed_shutdown 用于完成请求关闭和模块关闭工作。实现非常简单,可以在 C 程序里面调用 PHP,具体可以参考博客《使用 PHP Embed SAPI 实现 Opcodes 查看器》一文,这里不再展开。

PHPDBG模式

PHPDBG 是一个 PHP 的 SAPI 模块,可以在不修改代码和不影响性能的情况下控制 PHP 的运行环境。PHPDBG 的目标是成为一个轻量级、强大、易用的 PHP 调试平台,从 PHP 5.6 开始集成。

PHPDBG 提供了类似 GDB 的功能,支持单步调试,可以灵活地打断点,可以查看类方法、函数、文件的行、内存地址、opcode 等,可直接调用 PHP 的 eval,另外还支持远程 debug。

#phpdbg
prompt> exec ./test.php
prompt> b func#2
prompt> r
prompt> info break

感兴趣的读者可以进一步研究一下 PHPDBG 模式的实现,这里不再展开。