PHP源码学习中的收获与总结
2013-12-28 18:51
309 查看
从PHP运行原理开始吧
1、PHP他的基本特点
1)多进程(现在可以多线程)
2)弱类型语言,简单的看作一个C语言的低级版,不用定义类型,由机器去判定吧
3)Zend + ext,有一个专门的Zend引擎然后加上各种模块(ext),如:phpredis;在windows种是*.dll,在linux种是*.so
4) 中间层sapi, 它的作用就是将web server和PHP分割
5)另外我们需要了解到PHP从头到脚都是使用同步阻塞的方式运行,它的优势非常明显,它不是用来处理异步非阻塞编程的语言,面向过程才是PHP的王道(我的理解)
看一张图
zend引擎,我理解它就像java种的jdk; zend使用c实现的,是php的内核,它将php代码翻译称opcode并由zend_excute执行。
extension: 以zend为中心;extensions通过组件模块的方式提供各种服务,如mysql;memcache,redis等等
Sapi: 翻阅手册,发现是Server Application Programming Interface,服务应用程式接口;外面的程序要访问PHP,就通过它了。
最后就是上层应用了:我们平常编写的PHP程式啦
其它:
一、学习数组
看两个例子
上面的两端代码都不会报错,而且结果是一样的。
但是,如果我们在程序中看看两个代码话费的时间
PHP是弱类型语言,PHP会把没有引号引起来的键名当作是常量去获取,当找不到的时候,抛出一个NOTICE,然后将其作为一个常量生成一个字符串,然后再用这个字符串做为键名继续。
所以在我们编程的时候,如果键名不是一个数字那么就必须加单引号(双引号首先会去找是否是变量)。
二、内存机制
PHP作为脚本语言是页面结束即释放变量所占内存的。 当一个 PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中所有对象同时被销毁
那PHP是如何判断的呢
先看一张图(下面的图就是引用计数机制,当OBJ的引用为0时就自动释放内存)
PHP自动释放内存机制是计数的方式,当计数器为0,就可以释放了,这就是是PHP的GC了;但是不要相当然的认为,PHP可以做到及时释放内存、真正的释放内存。
先看一个函数 unset; 在PHP的定义中:用来清除销毁变量,并释放内存。
别去怀疑上面定义的正确性,PHP的unset确实会释放内存(结合计数和引用),但这个释放并不是Java或者c语言中将内存还给系统。看PHP的步骤:
1、打开一个PHP页面,会向系统申请内存,PHP不会向c用malloc简简单单的申请内存,而是会像系统一样申请一个大的内存BOOS
2、在大的BOOS中再分配一块小的给实际的申请者,这样当再有逻辑来申请时,这样在有申请时就不会去向系统要内存,而是向BOOS要,避免了重复调用
3、unset只是将内存归还给了BOOS,并没有给系统。
4、不要想着我们可以通过PHP程式去解决真正释放内存
5、只有当页面关闭、程式关闭、php停止运行的时候才会将BOOS归还给系统。
三、函数的实现
首先我们要知道,在PHP中,函数分为两种
1、zend_internal_function
2、zend_user_function
它们的区别
1、zend_internal_function,从字面上将内部的函数,就是php自带的函数或者我们自己使用c扩展的函数,它们使用'c/c++'编写,可以直接运行
2、zend_user_function,我们自己的函数,就是我们自己在页面上编写的函数,这种函数最终需要经过zend编译opcode array来执行,这里的opcode array我理解就像JavaScript中打记号的意思。让后将一组op_array交给zend_execute执行。
关于打记号,我是这样理解的,就像是javascript中的词法分析一样:如:a+b=c; 记录:符号a 加号 符号b 等号 符号c 结束
还有很多东西,需要继续努力学习总结!
1、PHP他的基本特点
1)多进程(现在可以多线程)
2)弱类型语言,简单的看作一个C语言的低级版,不用定义类型,由机器去判定吧
3)Zend + ext,有一个专门的Zend引擎然后加上各种模块(ext),如:phpredis;在windows种是*.dll,在linux种是*.so
4) 中间层sapi, 它的作用就是将web server和PHP分割
5)另外我们需要了解到PHP从头到脚都是使用同步阻塞的方式运行,它的优势非常明显,它不是用来处理异步非阻塞编程的语言,面向过程才是PHP的王道(我的理解)
看一张图
zend引擎,我理解它就像java种的jdk; zend使用c实现的,是php的内核,它将php代码翻译称opcode并由zend_excute执行。
extension: 以zend为中心;extensions通过组件模块的方式提供各种服务,如mysql;memcache,redis等等
Sapi: 翻阅手册,发现是Server Application Programming Interface,服务应用程式接口;外面的程序要访问PHP,就通过它了。
最后就是上层应用了:我们平常编写的PHP程式啦
其它:
一、学习数组
看两个例子
<?php // 例1 $array = array(); for ($i = 0; $i < 1000; $i++) { $array['okhqb'] = $i; }
<?php //例2 $array = array(); for ($i = 0; $i < 1000; $i++) { $array[okhqb] = $i; }有人可能喜欢“整洁”的代码,他的php.ini 中 error_reporting = ~E_NOTICE(错误级别,只要不是严重的不可运行的都不报错)
上面的两端代码都不会报错,而且结果是一样的。
但是,如果我们在程序中看看两个代码话费的时间
$time php -f t1.php // 有单引号 real 0m0.033s user 0m0.015s sys 0m0.009s $time php -f t2.php // err_reporting = ~E_NOTICE 没有单引号 real 0m0.133s user 0m0.053s sys 0m0.037s $time php -f t3.php // err_reporting = E_ALL & ~E_NOTICE没有单引号 real 0m0.163s // 前面会提示999行的PHP Notice:提示 user 0m0.052s sys 0m0.041shttp://write.blog.csdn.net/postedit/17632135我们从上面的数据可以看出,加引号与不加引号的区别是,不加引号我们损失了4倍左右的性能;
PHP是弱类型语言,PHP会把没有引号引起来的键名当作是常量去获取,当找不到的时候,抛出一个NOTICE,然后将其作为一个常量生成一个字符串,然后再用这个字符串做为键名继续。
所以在我们编程的时候,如果键名不是一个数字那么就必须加单引号(双引号首先会去找是否是变量)。
二、内存机制
PHP作为脚本语言是页面结束即释放变量所占内存的。 当一个 PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中所有对象同时被销毁
那PHP是如何判断的呢
先看一张图(下面的图就是引用计数机制,当OBJ的引用为0时就自动释放内存)
PHP自动释放内存机制是计数的方式,当计数器为0,就可以释放了,这就是是PHP的GC了;但是不要相当然的认为,PHP可以做到及时释放内存、真正的释放内存。
先看一个函数 unset; 在PHP的定义中:用来清除销毁变量,并释放内存。
别去怀疑上面定义的正确性,PHP的unset确实会释放内存(结合计数和引用),但这个释放并不是Java或者c语言中将内存还给系统。看PHP的步骤:
1、打开一个PHP页面,会向系统申请内存,PHP不会向c用malloc简简单单的申请内存,而是会像系统一样申请一个大的内存BOOS
2、在大的BOOS中再分配一块小的给实际的申请者,这样当再有逻辑来申请时,这样在有申请时就不会去向系统要内存,而是向BOOS要,避免了重复调用
3、unset只是将内存归还给了BOOS,并没有给系统。
4、不要想着我们可以通过PHP程式去解决真正释放内存
5、只有当页面关闭、程式关闭、php停止运行的时候才会将BOOS归还给系统。
三、函数的实现
首先我们要知道,在PHP中,函数分为两种
1、zend_internal_function
2、zend_user_function
它们的区别
1、zend_internal_function,从字面上将内部的函数,就是php自带的函数或者我们自己使用c扩展的函数,它们使用'c/c++'编写,可以直接运行
2、zend_user_function,我们自己的函数,就是我们自己在页面上编写的函数,这种函数最终需要经过zend编译opcode array来执行,这里的opcode array我理解就像JavaScript中打记号的意思。让后将一组op_array交给zend_execute执行。
关于打记号,我是这样理解的,就像是javascript中的词法分析一样:如:a+b=c; 记录:符号a 加号 符号b 等号 符号c 结束
还有很多东西,需要继续努力学习总结!
相关文章推荐
- Spring IOC源码学习总结
- 【PHP】MVC 思想之 CI 框架的学习总结(一)
- PHP学习总结(4)——PHP入门篇之PHP计算表达式
- PHP学习总结(9)——PHP入门篇之WAMPServer服务控制面板介绍
- NLP大赛冠军总结:300万知乎多标签文本分类任务(附深度学习源码)
- 【PHP入门篇】 7.PHP开发工具之Zend Studio快捷键--慕课网【学习总结】
- PHP常用的三种设计模式学习总结
- PHP 开发 APP 接口 学习笔记与总结 - XML 方式封装通信接口
- PHP学习使用资源简单总结
- PHP 源码学习之线程安全
- 双十一了,总结一下前端学习收获及感触
- 【学习总结】UNIX网络编程使用源码配置
- 【PHP入门篇】 6.PHP开发工具之Zend Studio安装与创建--慕课网【学习总结】
- php源码学习笔记之一
- [学习总结]7、Android AsyncTask完全解析,带你从源码的角度彻底理解
- 初次学习PHP总结
- php学习总结(1)
- SPMF源码学习与总结——Apriori算法
- 今天总结了一下最近学习alsa驱动的收获,
- PHP网页游戏学习之Xnova(ogame)源码解读(五)