PHP原理知识点


title: PHP原理知识点

php语言特点

1,多进程模型:由于PHP是多进程模型,不同请求间互不干涉,这样保证了一个请求挂掉不会对全盘服务造成影响。php也同样支持多线程,主要有hvvm
2,弱类型,一个变量的类型并不是一开始就确定不变
3,引擎(Zend)+组件(ext)的模式降低内部耦合。
4,中间层(sapi)隔绝web server和PHP

语法简单灵活,没有太多规范,PHP 程序往往受限于 I/O 而不是 CPU,使 PHP 代码运行速度变慢的因素往往是它们正在执行的 I/O 操作,包括连接、读取和写入数据库、高速缓存、文件与套接字等。

一,PHP内核
php工作原理

PHP总共有三个模块:内核Zend引擎、以及扩展层上层应用

SAPI:服务端应用编程接口,通过钩子函数使得PHP可以和外围交互数据
Zend引擎 对代码进行语法分析,然后将php代码翻译为opcode,完成后zend引擎会执行这行opcode
PHP内核用来处理请求、文件流、错误处理等相关操作;

php线程进程和并发

进程是系统进行资源分配和调度的一个独立单位,进程由一下元素组成:进程描述符,进程状态,优先级,程序计数器,内存指针,上下文数据,io状态信息,记账信息;以上的这些元素都会放在一个叫做进程控制块的数据结构中。

线程是cpu处理的基本单位,每个线程包括线程状态,一个执行栈,私有的数据区,寄存器集。
每个进程都有一个进程控制块和用户地址空间,每个线程都有一个独立的栈和独立的控制块,都有自己一个独立执行上下文

并发和并行的区别就是一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务。 前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生。
php 进程并发模型php-fpm多进程模型HHVM多线程模型
php-fpm 内存释放简单,容灾能力强
多进程通常采用在父进程中listen(), 然后各个子进程accept()的方式来实现负载均衡。这样的模型下可能会有惊群的问题。
多线程模型下,可以采用一个独立线程接受请求然后派发到各个worker线程的方式

php变量结构 与 垃圾回收

php的变量存在一个zval的变量容器中。这个容器由四部分组成:类型is_ref ( bool ) : 用来区分变量是否属于引用集合,refcount:计数器,表示指向这个zval变量器的变量个数。

赋值
所以当变量赋值给另一个变量时,不会立即为新变量分配内存空间,refcount计数器 + 1;只有当原变量发生改变时,才会为新变量分配内存空间,同时原变量的refcount减 1;如果删除原变量,新变量直接就使用原变量的zval。
引用赋值
&引用赋值时,原变量的is_ref 变为1,refcount 加1.
如果给另一个变量&赋值,之前 使用等号赋值的变量会分配空间
数组
数组名分配一个容器,每个数组元素分配一个容器
对象

垃圾回收器GC(Garbage Collection)
原因:实现垃圾回收机制的整个原因是为了,一旦先决条件满足,通过清理循环引用的变量来节省内存占用。
执行:一旦根缓冲区满了或者调用gc_collect_cycles() 函数时,就会执行垃圾回收。
1,++引用计数算法++
引擎在判断一个变量空间是否能够被释放的时候是依据这个变量的zval的refcount的值,如果refcount为0,那么变量的空间可以被释放,否则就不释放。
脚本运行完毕后,会销毁所有变量
2,++同步回收算法++
当一个zval可能为垃圾时,回收算法会把这个zval放入一个内存缓冲区。
当缓冲区达到最大临界值时(最大值可以设置),回收算法会循环遍历所有缓冲区中的zval,判断其是否为垃圾,并进行释放处理

环状引用

<?php
$a = array( 'one' );
$a[] =& $a;
xdebug_debug_zval( 'a' );

由于数组元素“1”仍然指向数组本身,而且这个zval的计数器为1,所以这个容器不能被清除。
解决:采用同步回收算法

垃圾
在php5.3的GC中

1:如果一个zval的refcount增加,那么此zval还在使用,肯定不是垃圾,不会进入缓冲区

2:如果一个zval的refcount减少到0, 那么zval会被立即释放掉,不属于GC要处理的垃圾对象,不会进入缓冲区。

3:如果一个zval的refcount减少之后大于0,那么此zval还不能被释放,此zval可能成为一个垃圾,将其放入缓冲区。PHP5.3中的GC针对的就是这种zval进行的处理。

可以通过修改php.ini中的zend.enable_gc来打开或关闭PHP的垃圾回收机制,也可以通过调用gc_enable()或gc_disable()打开或关闭PHP的垃圾回收机制。在PHP5.3中即使关闭了垃圾回收机制,PHP仍然会记录可能根到根缓冲区,只是当根缓冲区满额时,PHP不会自动运行垃圾回收,当然,任何时候您都可以通过手工调用gc_collect_cycles()函数强制执行内存回收。

二,PHP交互

2,php如何与nginx交互(CGI,FASTCGI,PHP-FPM)

CGI:因为服务器并不直接运行php文件,而是通过其他部分完成,这个定义其他部分接受和返回值的协议就叫CGI。

CGI的工作原理是。每当客户请求CGI,WEB服务器就请求操作系统生成一个新的CGI解释器进程(php-cgi.exe),CGI 的一个进程则处理完一个请求后退出,下一个请求来时再创建新进程。

FastCGI:FastCGI是Web服务器(如:Nginx、Apache)和处理程序之间的一种通信协议,FastCGI是一个常驻(long-live)型的CGI,只要激活可以一直执行,不会每次都要花费时间去fork一次。

工作流程:
1.Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module) 。
  2.FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
  3.当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。 Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。

PHP-FPM:php-fpm是 FastCGI 的实现,并提供了进程管理的功能。进程包含 master 进程和 worker 进程两种进程。

master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

完整流程
访问网址---
nginx处理----
路由到具体文件地址-----
加载nginx的fast-cgi模块-----
fast-cgi监听127.0.0.1:900地址--------
请求达到127.0.0.1:9000--------
php-fpm 监听127.0.0.1:9000--------
php-fpm接受到请求,启动worker进程处理请求--------
php-fpm请求处理完成,返回数据给nginx---------
nginx通过http返回数据给浏览器
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值