首页 > 编程语言 >PHP7内核实现原理-基本架构

PHP7内核实现原理-基本架构

时间:2023-09-08 21:44:08浏览次数:56  
标签:PHP 架构 SAPI FPM worker 内核 PHP7 FastCGI listen

发展史

PHP 最早是由 Lerdorf 于 1995年,使用 Perl 语言,以 Personal Home Page Tools (PHP Tools) 的形式创建的,目的是为了方便记录个人网站的访客记录和支持留言本等功能,此时称为 PHP 1

后来越来越多的网站开始使用 PHP 并希望能提供更多的功能,之后 Lerdorf 将 PHP 开源,此时称为 PHP 2

1997 年两个以色列程序员 Zeev Suraski 和 Andi Gutmans 重写了 PHP 的解析器,并于 1998 年正发布,此为 PHP 3,并从此开始 PHP 改为 Hypertext Preprocessor,新版的解析器命名为 Zend Engine。Zend 的命名来自于两位作者的名字。

2000 年,以 Zend 1.0 为基础的 PHP 4 发布。2004 年,以 Zend 2.0 为基础的 PHP 5 发布,至此 PHP 支持了面向对象、PDO、命名空间等特性,性能方面也大幅提升。

2015 年 12 月 3 日 PHP 7 发布,重构了 PHP 中很多重要且常用的数据结构,内存占用得到显著优化,性能也得到了大幅提升。

PHP 的组成

  • SAPI:

    PHP 本身可以理解为一组库函数,而 SAPI 则是其接入层,应用程序通过调用 SAPI 来间接调用 PHP 的函数,类似于 Shell 与 Linux 内核的关系。严格来讲 SAPI 不算是 PHP 内核的一部分。

  • Zend 引擎:

    Zend 引擎是 PHP 和核心,是 PHP 最最基础的部分。Zend 分为两部分:

    • 编译器:将应用层的 PHP 代码编译为抽象语法树 AST,进一步编译为可执行的 opcodes 。
    • 执行器:负责执行 opcodes

示意图:

SAPI 介绍

SAPI 即 Server Application Programming Interface,是应用程序与 PHP 内核交互的一套 API 规范。常见的 SAPI 实现有:

  • Apache mod_php 模块:

    该模块实现 SAPI 规范,使得让 Apache 与 PHP 做交互。

  • FastCGI/FPM:

    一般配合 Nginx 服务器处理 web 请求。

  • cli:

    命令行中执行 PHP 。

上层应用与实现了 SAPI 的模块做交互,上下两层都遵循 SAPI 规范:

FPM(FastCGI Process Manager) 介绍

要了解 FPM,首先要了解 CGI,CGI (Common Gateway Interface)定义了 Web 服务器和应用程序交互的规范,FastCGI 是在其之上优化改进的结果,增加了worker 常驻等特性,不用每次都 fork 新的进程来处理请求。

FastCGI 采用多进程模型,与 web 服务器配合处理 web 请求。服务器负责处理解析网络请求,之后交给 FastCGI,FastCGI 将请求交给其管理的 worker pool,由具体一个 worker 来处理请求。

FastCGI 中的 master 进程通过共享内存的方式获取 worker 进程的状态,通过发送信号的方式管理 worker。

FastCGI 也是一种协议,而 FPM 则是实现了这种协议的进程管理器。

FPM 可以同时监听多个端口,一个端口对应一个 worker pool

FPM 配置,监听在 unix sock 上

; worker pool名称
[www]
user = www
group = www

; 配置worker pool接收FastCGI请求的地址
; 可以是ip:port 也可以是unix sock
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /run/php7-cgi.sock

listen.owner = www
listen.group = www
listen.mode = 0660
pm = dynamic
pm.max_children = 20
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20

Nginx 与 FPM 通过 unix sock 交互配置

server
{
    listen 80;
    server_name xxx.xxx.com;
    index index.html index.php;
    root  /home/xxx/public;

    location / {
        if (!-e $request_filename){
            rewrite ^/(.*) /index.php last;
        }
    }
    location ~ [^/]\.php(/|$)
    {
        try_files $uri =404;
				# Nginx 转发请求给 PHP
        fastcgi_pass  unix:/run/php7-cgi.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

FPM master 管理 worker 的几种方式:

  • static:初始化就固定 worker 数不变
  • dynamic:动态调整 worker 数量
  • ondemand:相当于懒加载,一开始不创建 worker,之后请求到来在创建。

本文由mdnice多平台发布

标签:PHP,架构,SAPI,FPM,worker,内核,PHP7,FastCGI,listen
From: https://www.cnblogs.com/caipi/p/17688603.html

相关文章

  • 内核升级
    一、内核升级在企业用过的内核升级#centos7.6内核升级4.19前提条件已配置好基础yum源,参考yum源配置1、获取内核的rpm包http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/从上述页面上下载4.19.12的rpm包kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm然后拷贝到主机上......
  • ATAM方法架构评估
    ATAM方法(ArchitectureTradeoffAnalysisMethod)是一种用于软件架构评估的方法。它属于场景评估法,主客观程度介于前面两种方法(调查问卷法和度量法)之间。ATAM方法通过分析软件系统的各种架构特征,对系统进行全面的评估,以便在各种可能的方案中做出最佳的决策。ATAM方法主要包括以下几......
  • RDMA-内核接口-rxe_map_mr_sg
    描述:映射mr的sg调用链:此处多处调用staticintnvme_rdma_map_sg_fr(structnvme_rdma_queue*queue,    structnvme_rdma_request*req,structnvme_command*c,    intcount){   req->mr=ib_mr_pool_get(queue->qp,&queue->qp->rdma_mrs);  /*  ......
  • Sermant类隔离架构:解决JavaAgent场景类冲突的实践
    本文分享自华为云社区《Sermant类隔离架构解析——解决JavaAgent场景类冲突的实践》,作者:华为云开源。 一、JavaAgent场景为什么要注意类冲突问题?类冲突问题并非仅存在于JavaAgent场景中,在Java场景中一直都存在,该问题通常会导致运行时触发NoClassDefFoundError、ClassNotFoundExcep......
  • 【客户案例】星融元:脊叶架构(Spine-Leaf)的云化园区网络部署实践
    前言各行业数字化转型进程加快,作为基础设施的园区网络也面临着升级压力。为此,星融元通过将先进成熟的云网络建设理念引入园区场景,推出了“云化园区网络解决方案”,帮助客户网络实现架构级的深层优化。星融元云化园区网络解决方案介绍深入底层架构的全面变革,星融元发布云化园区网络解......
  • arm架构docker安装nacos
    前言搞了个hk1box,装了armbian系统,想用这个当服务器调试微服务,需要安装nacos。尝试安装非docker版本的nacos,去github下载arm版本的并且放到linux下面,运行的时候报tomcat错误,装了tomcat后还是报错,改了很多设置老是跑不了,于是决定用docker版本。1、挂载目录mkdir-p/home/nacos/l......
  • 深入理解消息队列与事件驱动架构
    什么是消息队列?消息队列是一种通信模式,用于将消息从一个发送者传递到一个或多个接收者。它们允许应用程序之间以异步、松耦合的方式进行通信。消息队列通常包括消息代理(如RabbitMQ、ApacheKafka)和消息消费者。为什么使用消息队列?使用消息队列的好处包括:解耦应用程序:消息队列允许......
  • Tomcat架构学习
    1、Tomcat的两个核心功能:处理Socket连接,负责负责网络字节流与Request和Response对象的转化。加载和管理Servlet,以及处理具体Request请求。Tomct设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情。连接器负责对外交流,容器负责对内处理。单独的连接器或者容......
  • 有关lvs高可用架构
    我们可以用多台LVS来做高可用。这里又会有两种选择:一是主备模式/主主模式,可以利用Keepalived的VRRP功能,但是大规模生产环境中,用集群模式更好,因为其同时提高了伸缩性和可用性,而前者只解决了可用性(当然,也更简单),LVS是基于IP层的负载均衡,它通过修改数据包的目标IP或MAC地址来实现负......
  • 系统设计(架构师)指南5设计一致哈希(HASHING)
    5设计一致哈希(HASHING)要实现横向扩展,就必须在服务器之间高效、均匀地分配请求/数据。一致哈希是实现这一目标的常用技术。不过,首先让我们深入了解一下这个问题。5.1重散列(rehashing)问题如果有n台缓存服务器,平衡负载的常用方法是使用下面的散列方法:serverIndex=hash(key)%N......