当前位置:首页 > PHP教程 > 正文内容

PHP是如何做垃圾回收的(图文)_php教程,php,垃圾回收

搜教程4年前 (2020-02-01)PHP教程139

PHP通过设置系统环境变量来区分测试与正式环境_php教程

1.PHP中可以通过getenv()函数和$_ENV来获取环境变量;2.环境变量存在系统中,不随代码的提交改变而改变;3.如果公司有测试服务器和正式服务器两台,通过环境变量的方式来区分测试环境和正式环境是一个不错的办法,,,,

PHP是如何做垃圾回收的?

包含 php 5 与 php7 的变量实现和垃圾回收的对比

变量的实现

PHP 的变量是弱类型的,可以表示整数、浮点数、字符串等类型。PHP 的变量是使用结构体 zval 表示的

PHP 5.* zval 和 zend_value 结构

struct _zval_struct { // 结构体
    zvalue_value value;
    zend_uint refcount__gc;
    zend_uchar type;
    zend_uchar is_ref__gc;
}

typedef union _zvalue_value { // 联合体
    long lval;
    double dval;
    struct {
        char *val;
        int len;
    } str; // 字符串
    HashTable *ht; // 数组
    zend_object_value obj; // 对象
    zend_ast *ast;
} zvalue_value;

PHP 7.0 zval 和 zend_value 结构

struct _zval_struct {
    union {
        zend_long         lval;             /* long value */
        double            dval;             /* double value */
        zend_refcounted  *counted;
        zend_string      *str;
        zend_array       *arr;
        zend_object      *obj;
        zend_resource    *res;
        zend_reference   *ref;
        zend_ast_ref     *ast;
        zval             *zv;
        void             *ptr;
        zend_class_entry *ce;
        zend_function    *func;
        struct {
            uint32_t w1;
            uint32_t w2;
        } ww;
    } value;
    union {
        struct {
            ZEND_ENDIAN_LOHI_4(
                zend_uchar    type,         /* active type */
                zend_uchar    type_flags,
                zend_uchar    const_flags,
                zend_uchar    reserved)     /* call info for EX(This) */
        } v;
        uint32_t type_info;
    } u1;
    union {
        uint32_t     var_flags;
        uint32_t     next;                 /* hash collision chain */
        uint32_t     cache_slot;           /* literal cache slot */
        uint32_t     lineno;               /* line number (for ast nodes) */
        uint32_t     num_args;             /* arguments number for EX(This) */
        uint32_t     fe_pos;               /* foreach position */
        uint32_t     fe_iter_idx;          /* foreach iterator index */
    } u2;
};

PHP5 与 PHP7 引用计数的对比

php 5.* 变量赋值等操作引用计数如图所示,在倒数第二步,会形成一个循环引用,并且在 unset 操作之后,会产生垃圾。

PHP 7 的计数放到了具体的 value 中,zval 不存在写时复制(写时分离)。

并且 PHP 7 的有一个专门的 zend_reference 用来表示引用。

有了以上关于 PHP 变量存储的知识,我们可以理解一下 PHP 是如何做垃圾回收的了。

什么是垃圾

首先,我们需要定义什么是垃圾。

1. refcount 增加的不是

用PHP写一个计算器(附完整代码)_php教程

本篇文章介绍了使用PHP+HTML+Javascript技术编写一个计算器的方法,希望对各位学习PHP开发的同学有帮助!

2. refcount 等于0的不是,这个会被直接清除

3. refcount 减少,并且不等于0的才是垃圾

垃圾收集

1. php7 要求数据类型是数组和对象,并且 type_flag 是 IS_TYPE_COLLECTABLE

2. 没有在缓冲区中存在过

3. 没有被标记过

4. 标记为紫色,并且放到缓冲区中

回收算法

论文:https://researcher.watson.ibm.com/researcher/files/us-bacon/Bacon01Concurrent.pdf

PHP 5.3 版本以及之后的版本

1. 将垃圾放到一个 root 池中

2. 当满 10000 个节点的时候进行垃圾回收

3. 遍历双向链表中的节点 refcount-1

4. 遍历双向链表将 refcount=0 的节点删除,到free队列中

5. 对 refcount!=0 的 refcount+1

以上就是PHP是如何做垃圾回收的(图文)的详细内容,更多请关注ki4网其它相关文章!

PHP作用域和文件夹操作示例_php教程

php中的作用域有:变量作用域、静态变量、匿名函数use,函数内部不能访问函数外部的变量,但在匿名函数中,可以通过use将外部变量引入匿名函数中。

扫描二维码推送至手机访问。

版权声明:本文由搜教程网发布,如需转载请注明出处。

本文链接:https://www.sojiaocheng.cn/17086.html

标签: php垃圾回收
分享给朋友:

“PHP是如何做垃圾回收的(图文)_php教程,php,垃圾回收” 的相关文章

Redis主从复制的道理引见(图文)【php教程】,php,redis

Redis主从复制的道理引见(图文)【php教程】,php,redis

本篇文章给人人带来的内容是关于Redis主从复制的道理引见(图文),有肯定的参考价值,有须要的朋侪可以参考一下,愿望对你有所协助。 面对题目 机械毛病。我们布置到一台 Redis 效劳器,当发作机械毛病时,须要迁移到别的一台效劳器而且要保证数据是同步的。而数据是最重要的,假如你不在乎,...

php中毛病及非常处置惩罚的引见(代码示例)【php教程】,php

本篇文章给人人带来的内容是关于php中毛病及非常处置惩罚的引见(代码示例),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。 一.php毛病处置惩罚的三种体式格局 A:简朴的die()语句 等价于exit(); B:自定义毛病和毛病触发器 1.毛病处置惩罚器(自定义毛病,...

B/S架构与C/S架构有什么区别【php教程】,B/S架构、C/S架构

B/S架构与C/S架构有什么区别【php教程】,B/S架构、C/S架构

B/S架构与C/S架构的区分有:B/S架构对计算机的设置请求低而C/S请求高,B/S不须要装置及保护而C/S须要,B/S平安机能低C/S高,B/S具有比较好的软件重用而C/S没有 B/S架构与C/S架构都是经常运用的两大客户端服务器构造,接下来在文章中将为人人细致引见这两个架构之间的区分,具有...

guzzlehttp通报自定义cookie的要领引见(附代码)【php教程】,guzzle,php

本篇文章给人人带来的内容是关于guzzlehttp通报自定义cookie的要领引见(附代码),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。 guzzlehttp是一个异常壮大的php言语的http client包,支撑保留前面要求服务端返回的cookie信息用于后续的要求。...

php操纵Memcache的一个类库的要领(代码)【php教程】,php

本篇文章给人人带来的内容是关于php操纵Memcache的一个类库的要领(代码),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。 代码以下: <?php /** * Created by PhpStorm. * User: alisleepy * Date: 20...

在PHP中挪用MySQL数据库的基础操纵代码详解【php教程】,PHP,mysql,基本操作

本文的重要报告的是在PHP中挪用MySQL数据库的基础操纵代码以及诠释,具有肯定的参考价值,有须要的朋侪肯定要好好看看! PHP-MySQL基础操纵 <?php // 1.防备页面中文乱码 header("content-type:text/html;charset=utf-8")...