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)。
二、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一些。。