面试准备

一、系统设计

  1. 设计个红包活动

二、mysql相关

三、redis相关

四、数据结构

  1. 堆问题
  2. 反转链表
  3. 动态规划类题目

五、php问题

1、PHP 内核方面,内存管理

2、php是如何处理一个请求的

首先Nginx接收到HTTP请求,然后通过fastcgi协议把请求交给PHP FPM, PHP-FPM启动PHP脚本,执行PHP脚本,把执行结果返回。 fastcgi是一种协议,用于web服务器和处理程序之间的通信。PHP脚本理解成函数,它并不接受HTTP请求,web服务器来处理请求,将解析的结果通过fastcgi转发给PHP处理,处理完成之后再返回web服务器,web服务器再返回给用户。 那FPM是什么呢?是PHP的fastcgi管理器,她是一个多进程模型,由一个master和多个worker进程组成,master进程不处理具体的请求,只负责管理worker进程,worker进程accept具体的请求,执行脚本并返回。一个worker进程一次只能处理一个请求。

3、php的结构是什么

SAPI是PHP的接口层,给各种PHP环境提供相应的API,zendVM 是zend虚拟机,负责解析PHP脚本,变成操作系统可以执行的代码,extention是丰富的PHP扩展。

4、php的生命周期

整个PHP的生命周期分为模块初始化阶段、请求初始化阶段、执行脚本阶段、请求关闭阶段、模块关闭阶段。 1、模块初始化阶段,激活sapi,初始化垃圾回收器,启动zend引擎,读取配置文件,引入扩展等。2、请求初始化阶段是每个请求处理之前都会经历的阶段,对于Fpm而言,是在worker进程accept一个请求且读取、解析完数据后的一个阶段。3、执行脚本阶段,是zend引擎最核心的步骤。4、请求关闭阶段,是在PHP脚本执行完毕之后将返回结果输出、发送HTTP应答header头阶段。5、模块关闭阶段是模块初始化阶段的相反阶段,清理资源,关闭模块。

5、php的弱类型是如何实现的

PHP中是通过zval这个数据结构来实现弱类型的。 在PHP7中一个zval包含了一个zend_vlaue 联合体,占8个字节,一个表示变量类型的结构,占4个字节。因为内存是自动对齐的,所有又设置了一个union结构,存放一些特殊场景下需要使用的结构。 zend_value中定义了指向众多类型的指针。其中 整型、浮点型是直接把值存放在里面的。还有是zend_value中存放着内存的引用计数。

6、php的内存管理是如何实现的

引用计数+写时复制。 当定义一个变量时,不是去主动分配一块内存,当变量改变时才去分配一个内存,这叫做写时复制。而在变量赋值、传递时多个变量共用同一个value,引用计数用来记录value有多少个变量在使用。引用计数记录由多个zval指向同一个zend_value。当有新的zval指向这个value,计数器加1,反之减1。当计数器为0的时候,释放value。

7、php是如何做垃圾回收的

如果一个zend_value的refcount增加,那么此zend_value还在使用,不属于垃圾;如果一个zend_value的refcount减少到0,那么zend_value可以被释放掉,不属于垃圾;如果一个zend_value的refcount减少之后大于0,那么此zend_value还不能被释放,此value可能成为一个垃圾。因此,垃圾是由于循环引用造成的,现在只出现在array和object两种类型中。垃圾是由于成员引用自身导致的,对value的所有成员减1,如果发现value本身的refcount变成了0,就释放。

8、引用和值的区别

注意:d变量的值改变,而a的值改变,因为引用unset时只是清除了is_ref的标识

参考:https://www.cnblogs.com/ohmygirl/p/internal-variable-1.html

9、php val数据结构

struct _zval_struct {
    zvalue_value value;       /* value */
    zend_uint refcount__gc;   /* variable ref count */
    zend_uchar type;         /* active type */
    zend_uchar is_ref__gc;    /* if it is a ref variable */
};

typedef struct _zval_struct zval;
typedef union _zvalue_value {
    long lval;                  /* long value */
    double dval;                /* double value */
    struct {                    /* string */
        char *val;
        int len;
    } str;
    HashTable *ht;              /* hash table value,used for array */
    zend_object_value obj;      /* object */
} zvalue_value;

is_ref__gc: 这个字段用于标记变量是否是引用变量。对于普通的变量,该值为0,而对于引用型的变量,该值为1

refcount__gc:该值实际上是一个计数器,用来保存有多少变量(或者符号,symbols,所有的符号都存在符号表(symble table)中, 不同的作用域使用不同的符号表,关于这一点,我们之后会论述)指向该zval。在变量生成时,其refcount=1,典型的赋值操作如$a = $b会令zval的refcount加1,而unset操作会相应的减1。在PHP5.3之前,使用引用计数的机制来实现GC,如果一个zval的refcount较少到0,那么Zend引擎会认为没有任何变量指向该zval,因此会释放该zval所占的内存空间。但,事情有时并不会那么简单。后面我们会看到,单纯的引用计数机制无法GC掉循环引用的zval,即使指向该zval的变量已经被unset,从而导致了内存泄露(Memory Leak)。

type:该字段用于表明变量的实际类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值