PHP 知识

nginx如何配置负载均衡:

在nginx里面配置一个upstream,然后把相关的服务器ip都配置进去。然后采用轮询的方案,然后在nginx里面的配置项里,proxy-pass指向这个upstream,这样就能实现负载均衡。

什么是CGI?

CGI是一种通用网关协议。为了解决不同的语言解释器(如 php 、 python 解释器)与WebServer的通信而产生的一种协议。只要遵守这种协议就能实现语言与WebServer通讯。CGI是规定了要传什么数据/以什么格式传输给 php 解析器的协议。

什么是FastCGI?

是一种对CGI协议升华的一种协议。FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站 服务器 来的请求。。

什么是PHP-FPM?

(PHP FastCGI Process Manager),PHP-FPM是一个实现了Fastcgi协议的程序,用来管理Fastcgi起的进程的,即能够调度php-cgi进程的程序。并提供了进程管理的功能。进程包含 master 进程和 worker 进程两种进程。master进程只有一个,负责监听端口(默认9000),接收来自 WebServer的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是PHP代码真正执行的地方。

FastCGI好在哪里?

Fastcgi则会先fork一个master,解析配置文件,初始化执行环境,然后再fork多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是Fastcgi的对进程的管理。大多数Fastcgi实现都会维护一个进程池。注:swoole作为httpserver,实际上也是类似这样的工作方式。

我们以用户访问index.php为,服务器环境为LNMP:

1、用户请求index.php时,首先到Nginx
2、Nginx流程步骤:
(1)根据配置查找路由
(2)加载 nginx 的fast-cgi模块(FastCGI的Client),将根据fastcgi.conf文件中fastcgi_*配置参数值也一并加入转发任务中
(3)根据nginx.conf文件fastcgi_pass配置将请求转发到127.0.0.1:9000。
3、PHP-FPM操作:
(1)PHP-FPM的master进程监听9000端口。
(2)收到请求后调用子进程来处理逻辑,PHP解释器解释PHP语法并返回给Nginx。
4、Nginx操作:
将响应返回给用户

php 代码解释过程

Php总共三个模块:
a.PHP内核:用来处理请求、文件流、错误处理等相关操作
b.zend引擎:用以将源文件转换成机器语言,然后在虚拟机上运行它
c.扩展层:是一组函数、类库和流。PHP使用它们来执行一些特定的操作

比如:我们需要mysqli扩展来连接mysql数据库;当zend执行程序可能会需要连接若干扩展,这是zend引擎将控制器交给扩展,等处理完特定任务后再返还,最后 zend引擎将运行结果返回给PHP内核,它再将结果传送给SAPI层,最后输出到浏览器上。
PHP的核心架构如下图:

PHP 只是

a.zend引擎:zend引擎整体用纯C实现,是PHP的内核部分,它将PHP代码翻译(词法,语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法,实现了基本的数据结构(如hashtable、oo),内存分配及管理,提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均是围绕zend实现
b.Extensions:围绕zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extensions来实现。用户也可以根据自己的需要实现自己的extensions以达到功能扩展、性能优化等目的。
c.sapi:sapi全称是server application programming interface。也就是服务端应用编程接口,sapi通过一系列钩子函数,使得PHP可以和外围交互数据,这是PHP非常优雅和成功的设计,通过sapi成功的将PHP本身和上层应用解耦隔离,PHP可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式
d.上层应用:这就是我们平时编写的PHP程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。
如果PHP是一辆车,那么车的框架就是PHP本身,Zend是车的引擎(发动机),Ext下面的各种组件就是车的轮子,Sapi可以看做是公路,车可以跑在不同类型的公路上,而一次PHP程序的执行就是汽车跑在公路上。因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道。

如前所述,Sapi通过通过一系列的接口,使得外部应用可以和PHP交换数据并可以根据不同应用特点实现特定的处理方法,我们常见的一些sapi有:
apache2handler:这是以apache作为webserver,采用mod_PHP模式运行时候的处理方式,也是现在应用最广泛的一种。
cgi:这是webserver和PHP直接的另一种交互方式,也就是大名鼎鼎的fastcgi协议,在最近今年fastcgi+PHP得到越来越多的应用,也是异步webserver所唯一支持的方式。
cli:命令行调用的应用模式

PHP执行这段代码会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend)
Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)
Parsing, 将Tokens转换成简单而有意义的表达式
Compilation, 将表达式编译成Opocdes
Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。

PHP的抽象类、接口类的区别和选择

1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以通过关键字extends继承。
2、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。(另Java接口中的成员变量都要声明为public static final类型)
3、接口没有构造函数,抽象类可以有构造函数。
4、接口中的方法默认都是public类型的,而抽象类中的方法可以使用private,protected,public来修饰。
5、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。
如果要创建一个模型,这个模型将由一些紧密相关的对象采用,就可以使用抽象类。如果要创建将由一些不相关对象采用的功能,就使用接口。
如果必须从多个来源继承行为,就使用接口。
如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。
抽象类中不一定都是抽象的方法,也可以有具体实现的方法,这样就可以把大家公用的方法提升到抽象类中,然后具体的方法可以留给子类自己实现(此处经典的应用,模板方法设计模式)。所以抽象类可以更好的实现代码的复用
接口和抽象类的概念不一样。这个可以理解为接口是对动作的抽象,抽象类是对根源的抽象(即对本质的抽象与其他类的本质不同)。

PHP的垃圾收集机制是怎样的

PHP可以自动进行内存管理,清除不再需要的对象。
PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为 NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!