iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP - 语言底层运行及生命周期
  • 45
分享到

PHP - 语言底层运行及生命周期

生命周期php 2023-02-09 11:02:09 45人浏览 佚名
摘要

概述PHP在业界被调侃,是世界上最好的语言,php确实是web开发里的利器,具体点说,就是一个用C语言实现包含大量组件模块的软件框架。是一个强大的UI框架。PHP动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻

概述

PHP在业界被调侃,是世界上最好的语言,php确实是web开发里的利器,具体点说,就是一个用C语言实现包含大量组件模块的软件框架。是一个强大的UI框架。

PHP动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后ZEND虚拟机顺次执行这些指令完成操作。PHP本身是用C实现的,因此最终调用的也是C的函数,实际上,我们可以把PHP看做一个C开发的软件。

分层体系

复杂的结构需要分层,tcp/IP协议因为分层得到了很好的应用,不熟悉的同学可以去我的计算机网络专栏的文章里看一看,PHP也是主要分为四层,分层处理,提高处理效率和职能。

PHP从下倒上是一个4层体系:

1、Zend引擎:Zend整体用纯C实现,是PHP的内核部分,他将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如:hash_table、OO)、内存分配机制及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。

2、Extensions:围绕着Zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(array系列)、标准库等都是通过extension来实现CGI即通用网关接口,用户也可以根据需要实现自己的extension的典型应用)。

博主梦话:印象里在win上开发的时候,有个ext文件夹,里面装载着各种类库,就是Extensions层存放扩展文件的路径。

3、Sapi: Sapi全称 Server Application Programming Interface ,也就是服务端应用编程接口,Sapi通过一系列钩子函数,使得PHP可以和外围交互数据,这是PHP非常优雅和成功的设计,通过sapi成功的将PHP本身和上层应用解耦隔离,PHP可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。

4、上层应用:这就是我们平时编写的PHP程序,通过不同的spai方式得到各种各样的应用模式,如何通过WEBserver实现web应用、在命令行下已脚本方式运行等等。

Sapi

Sapi通过一系列的接口,使得外部应用可以和PHP交换数据并可以根据不同应用特点实现特定的处理方法,我们常见一些sapi有:

var_dump(php_sapi_name()); # 输出当前php运行模式

1、CGI/FastCGI

下文有详细解释。

2、APACHE2HANDLER

PHP作为Apache模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出 现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次Http请求之后并不立即退出,而是停留在计 算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。

3、apache模块的DLL

该运行模式是我们以前在windows环境下使用apache服务器经常使用的,而在模块化(DLL)中,PHP是与Web服务器一起启动并运行的。

博主梦话:印象里在win上开发的时候,有个ext文件夹,里面装载着各种类库,就是.dll结尾的文件。

4、Cli

在最开始设计PHP这门语言时是为了执行脚本,所以win上和linux中都有 Cli模式,Cli模式会强制使用一些配置参数,强制关闭缓冲区的数据,执行也非常高效,常用的参数:

-a 交互式运行PHPCLI程序
-c 告诉PHP,从那个路径寻找php.ini
-l 检查php文件的语法,不执行
-m 查看编译的模块

Cli模式的生命周期

模块初始化阶段->请求初始化阶段->脚本执行阶段->请求关闭阶段->模块关闭阶段

后来Swoole中为了追求性能,在启动服务的时候使用常驻内存的方式预先加载在内存里,在脚本中千万不要写配置文件中,因为在Cli模式下第一次的执行没有被释放,第二次的又来执行,会造成服务内存问题。

CGI/FastCGI

之前互联网上的Web服务都属于html,静态资源分布,随着互联网的发展,后来出现了像asp、jsp、php这种动态语言,动态语言的特点是需要Web服务器的解析Cgi就是Web服务器和动态语言通信的网关。

CGI即通用网关接口(Common Gateway Interface),它是动态语言的产物,是负责Web服务与PHP通信的接口,CGI方式在遇到连接请求(用户 请求)先要创建cgi的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。这就是 fork-and-execute 模式。所以用cgi 方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。

在这个基础上产生了FastCGI,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。

FPM的三种模式运行模式

重点要介绍的是FPM的三种模式运行模式:内存优先(ondemand)、静态池(static)、服务优先(dynamic)。

ondemand

php-fpm启动的时候不会启动worker进程,按需启动worker,有链接进来后,才会启动。

listen = 127.0.0.1:9001
pm = ondemand
pm.process_idle_timeout = 60
pm.max_children = 10

连接到来时(只有链接,不没有数据也会创建,telnet也会创建),创建新worker进程,worker进程数的创建收max_children设置限制,也受限于全局的process.max设置(三种模式都受限此,下文中有全局配置项讲解),如果空闲时间超过了process_idle_timeout的设置就会销毁worker进程。

优点:按流量需求创建,不浪费系统资源。

缺点:因为php-fpm是短连接的,如果每次请求都先建立连接,大流量场景下会使得master进程变得繁忙,浪费cpu,不适合大流量模式,不推荐使用此模式。

dynamic

会初始化创建一部分worker,在运行过程中,动态调整worker数量,最大worker数再pm.max_childrenprocess.max之间。

pm.max_children < worker进程数量 < process.max
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 6

当空闲进程数小于min_spare_servers时,创建新的子进程,总子进程数小于等于pm.max_children,小于等于process.max,当空闲进程数大于max_spare_servers,会杀死启动时间最长的子进程,如果子进程(idle状态)数大于max_children,会打印warning日志,结束处理。

process小于 max_children ,计算一个num,启动num个worker。

优点:动态扩容,不浪费系统资源。

缺点:所有worker都在工作,新的请求到来需要等待创建worker进程,最长等待1s(内部存在一个1s的定时器,去查看,创建进程),频繁启停进程消耗cpu,请求数稳定,不需要频繁销毁

static

启动固定大小数量的worker,也有1s的定时器,用于统计进程的一些状态信息,例如空闲worker个数,活动worker个数

#需要主意的是,必须配置这个参数,而且只有这个参数有效
pm.max_children = 10

Nginx与php-fpm的通信

我理解的php-fpm是PHP对FastCGi封装的模块,是PHP对CGI网关通信的优化和扩展,Web服务器都在php-fpm实现。配置文件里的listen。listen负责监听ip和端口,查看php-fpm的配置文件,查看监听端口,默认是9000,然后配置你的Nginx。

	ps aux | grep php
	listen = 127.0.0.1:9000

Nginx Server里配置:

server {
     listen      80;
     server_name  www.baidu.com;
     root /home/work/www/baidu/;
     index index.php;

     location / {
         add_header Access-Control-Allow-Origin *;
         add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
         add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReQtoken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
     }

     location ~ / {
      rewrite ^(.*)$ /index.php$1 break;
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param  ENVIROMENT 0;
      include fastcgi_params;
     }
}

--结束END--

本文标题: PHP - 语言底层运行及生命周期

本文链接: https://www.lsjlt.com/news/195285.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP - 语言底层运行及生命周期
    概述PHP在业界被调侃,是世界上最好的语言,PHP确实是Web开发里的利器,具体点说,就是一个用C语言实现包含大量组件模块的软件框架。是一个强大的UI框架。PHP动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻...
    99+
    2023-02-09
    生命周期 php
  • 深入理解php底层之php生命周期
    目录1、PHP的运行模式2、一切的开始: SAPI接口启动apache请求处理初始化执行php代码脚本结束sapi关闭3、PHP的开始和结束阶段4、单进程SAPI生命周期5、多进程S...
    99+
    2024-04-02
  • Vue生命周期钩子如何运行
    这篇文章主要讲解了“Vue生命周期钩子如何运行”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue生命周期钩子如何运行”吧!生命周期钩子Vue 在生命周期钩子方面有两种范式。一种是 Vue3...
    99+
    2023-07-02
  • Rust语言生命周期的示例分析
    本篇文章为大家展示了Rust语言生命周期的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Rust 官方博客发布了 2020 年度的 Rust 调查报告。此次...
    99+
    2024-04-02
  • React Class组件生命周期及执行顺序
    一、react组件的两种定义方式 1、函数组件,简单的函数组件像下面这样,接收Props,渲染DOM,而不关注其他逻辑 function Welcome(props) { r...
    99+
    2024-04-02
  • Go语言变量的生命周期是什么
    这篇文章主要介绍了Go语言变量的生命周期是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言变量的生命周期是什么文章都会有所收获,下面我们一起来看看吧。在Go语言中,变量的生命周期指的是在程序运行期间变...
    99+
    2023-07-04
  • Servlet方法生命周期及执行原理详解
    目录快速入门创建JavaEE项目实现接口中的抽象方法执行执行原理Servlet中的生命周期方法1.被创建:执行init方法,只执行一次2.提供服务:执行service方法,执行多次3...
    99+
    2024-04-02
  • C语言:变量的作用域和生命周期详解
    目录1.全局变量和局部变量2.变量的作用域2-1.声明外部变量的方法3.变量的生命周期4. 局部变量&自动变量总结1.全局变量和局部变量 定义在代码块外部的是全局变量 定义在...
    99+
    2024-04-02
  • C语言入门篇--局部全局变量的作用域及生命周期
    目录1.变量的分类1.1 局部变量1.2 全局变量1.3 知识点1.3.1 就近原则1.3.2 访问规则1.3.3 有效范围2.变量的使用3.变量的作用域和生命周期3.1 作用域3....
    99+
    2024-04-02
  • C语言中变量的作用域和生命周期是什么
    这篇文章给大家分享的是有关C语言中变量的作用域和生命周期是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。变量的作用域和生命周期作用域作用域(scope),程序设计概念,通常来说,一段程序代码中所用到的名字并不...
    99+
    2023-06-29
  • Vue父子组件生命周期的执行顺序及钩子函数
    这篇文章主要介绍“Vue父子组件生命周期的执行顺序及钩子函数”,在日常操作中,相信很多人在Vue父子组件生命周期的执行顺序及钩子函数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • 一文聊聊Vue组件生命周期的三个阶段(创建、运行和销毁)
    总结生命周期:1)又称:生命周期回调函数、生命周期函数、生命周期钩子。2)含义:vue在关键时刻帮助我们调用一些特殊名称的函数。3)生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。4)生命周期函数中的this指向是 vm...
    99+
    2023-05-14
    Vue 组件 生命周期
  • 【微信小程序】6天精准入门(第2天:小程序的视图层、逻辑层、事件系统及页面生命周期)
    一、视图层 View 1、什么是视图层 框架的视图层由 WXML 与 WXSS 编写,由组件来进行展示。将逻辑层的数据反映成视图,同时将视图层的事件发送给逻辑层。WXML(WeiXin Markup language) 用于描述页...
    99+
    2023-10-20
    小程序 微信小程序
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作