PHP原理与使用知识点

title: PHP原理与使用知识点php语言特点1,多进程模型:由于PHP是多进程模型,不同请求间互不干涉,这样保证了一个请求挂掉不会对全盘服务造成影响。php也同样支持多线程,主要有hvvm2,弱类型,一个变量的类型并不是一开始就确定不变3,引擎(Zend)+组件(ext)的模式降低内部耦合。4,中间层(sapi)隔绝web server和PHP语法简单灵活,没有太多规范,PH...
摘要由CSDN通过智能技术生成

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线程进程和并发
  • php的多进程多线程模型
    php 进程并发模型php-fpm多进程模型HHVM多线程模型
    php-fpm 内存释放简单,容灾能力强
    多进程通常采用在父进程中listen(), 然后各个子进程accept()的方式来实现负载均衡。这样的模型下可能会有惊群的问题。
    多线程模型下,可以采用一个独立线程接受请求然后派发到各个worker线程的方式
  • php的多线程
    PHP 默认并不支持多线程,要使用多线程需要安装 pthread 扩展,而要安装 pthread 扩展,必须使用 --enable-maintainer-zts 参数重新编译 PHP,这个参数是指定编译 PHP 时使用线程安全方式。

线程安全:线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。

  • 如何保证线程安全?
    PHP 实现的线程安全主要是使用 TSRM 机制对 全局变量和静态变量进行了隔离,将全局变量和静态变量 给每个线程都复制了一份,各线程使用的都是主线程的一个备份,从而避免了变量冲突,也就不会出现线程安全问题。
    缺点:子线程一旦开始运行,主线程便无法再对子线程运行细节进行调整了,线程一定程度上失去了线程之间通过全局变量进行消息传递的能力。同时 PHP 开启线程安全选项后,使用 TSRM 机制分配和使用变量时也会有额外的损耗(所以,不使用php多线程时,可以使用php zts非线程安全版本)
  • 如何使用?
    PHP 将线程 封装成了 Thread 类,线程的创建通过实例化一个线程对象来实现,由于类的封装性,变量的使用只能通过构造函数传入,而线程运算结果也需要通过类变量传出
下面介绍几个常用的 Thread 类方法:
run():此方法是一个抽象方法,每个线程都要实现此方法,线程开始运行后,此方法中的代码会自动执行;start():在主线程内调用此方法以开始运行一个线程;
join():各个线程相对于主线程都是异步执行,调用此方法会等待线程执行结束;
kill():强制线程结束;
isRunning():返回线程的运行状态,线程正在执行run()方法的代码时会返回 true;

php多线程的使用

php 协程

php的协程主要是生成器 yield关键字来实现

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,判断其是否为垃圾,并进行释放处理

环状引用

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值