PHP内核与生命周期

首先我们了解下php的执行流程、php生命周期。

二、php的执行流程

2.1 scanner

将PHP代码转换为Tokens,详见代码Zend/zend_language_scanner.l。

2.2 parser

将Tokens转换成表达式,详见代码Zend/zend_language_parser.y。

2.3 compile

将表达式编译成opcode。opcode存放在op_array中。

2.4 execute

Zend Engine调用zend_execute来执行op_array,输出结果。

三、php的生命周期

3.1 STARTUP

1、初始化引擎和核心组件。

2、解析php.ini。

3、初始化静态构建的模块(MINIT)。

4、初始化共享模块(MINIT)。

3.2 ACTIVATION

1、初始化环境变量、变量。

2、激活静态构建的模块(RINIT) 。

3、激活共享模块(RINIT) 。

3.3 RUNTIME

1、编译和执行php.ini中auto_prepend_file选项指定的文件。

2、编译和执行所请求的文件。

3、编译和执行php.ini中auto_append_file选项指定的文件。

3.4 DEACTIVATION

1、调用用户指定的退出函数。

2、销毁对象实例。

3、停用模块(RSHUTDOWN)。

4、清空输出。

5、清理环境。

6、释放剩余的非持久内存。

3.5 SHUTDOWN

1、关闭启动的全部模块(MSHUTDOWN)。

2、关闭引擎。

再来看一下php 三个生命周期的一些申明与注意。

全局变量的全局变量周期,在页面处理或程序关闭后则消失

局部变量生命周期,主要是函数内部声明的变量

静态变量声明周期, 在函数第一次调用,并声明了这个变量后产生,然后在程序执行前一直存在,知道程序结束。

2. 对象声明周期根据保存它实例的变量决定。

3. php程序在页面开始执行时建立所有的对象,在结束后摧毁这些变量, php没有java,ROR这样的应用程序池的概念,所以在建立对象和摧毁对象会影响一些性能,但是因为是生命期单一,所以很安全。

4.析构函数不是必须的,php在一个页面结束后会自动摧毁所有建立的资源。 如果你有特殊要求,比如对象加锁,解锁,是可以用析构函数处理的。

5.垃圾收集。。 php页面执行时间很短,最高也就30-60秒,垃圾收集效果并不明显,而且实现垃圾收集还得进行内存堆扫描,所以一般来说没有(不好意思,这块我理解错误,多亏群里的高手指引,是有引用计数来管理gc的。不过很多应用为了减少内存,手动对变量进行unset 也是常用的。。。。

6. 常用的设计模式。 单例,工厂都可实现。通过php 的标准库 SPL 也可以实现一些稍微复杂的设计模式, SPL引入了迭代器,对一些数组进行了类封装。。使用SPL会让php更OOP一些。。