PHP源码学习中的收获与总结

从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 // 例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 结束


还有很多东西,需要继续努力学习总结!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值