这篇文章整理和翻译了一系列关于PHP架构、内核函数以及运行原理的参考资料。通过串读这些内容,可以比较清晰地理解PHP和Zend引擎的具体含义与区别、PHP的整体架构、中间码(opcode)的生成机制、扩展模块的工作方式,以及一个完整的用户请求是如何被处理的。
PHP内核代码运行过程
激活并运行PHP解释器,大概要经历这么几个关键步骤:
当某个应用程序(比如Web服务器)想要启动一个PHP解释器,第一个调用的函数就是php_module_startup。这个函数可以看作是整个解释器的主开关——它负责激活注册好的SAPI,初始化输出缓存系统,启动Zend引擎,读入php.ini配置文件,并启用所有配置项,为处理第一个请求做好准备。
在整个核心模块的运行过程中,下面这几个函数扮演着至关重要的角色:
- php_module_startup — PHP的主入口函数,一切从这里开始。
- php_startup_extensions — 遍历所有已注册的扩展,依次调用它们的初始化函数。
- php_output_startup — 启动输出系统,为后续的缓存和发送做准备。
- php_request_startup — 每次请求到来时,SAPI函数会向下调用这个函数。它接着会调用Zend引擎进行初始化,同时触发所有已注册模块的请求启动函数。
- php_output_activate — 激活输出系统,让SAPI相关的输出函数能够正常使用。
- php_init_config — 读取
php.ini文件,并启用其中的配置项。 - php_request_shutdown — 主要负责销毁每个请求占用的资源,清理现场。
- php_end_ob_buffers — 刷新输出缓存(如果输出缓存被启用了的话),确保数据真正发送出去。
- php_module_shutdown — PHP的主关闭函数,触发解释器所有剩余的关闭流程,完成收尾工作。
上面反复提到的SAPI(Server Application Programming Interface),是PHP为Web服务器和其他应用提供的开放接口。它定义了PHP如何与外部环境交互,是整个架构中非常关键的一层。
PHP架构图:
