设为首页 收藏本站
查看: 1200|回复: 0

[经验分享] PHP:执行模型和内存模型

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2015-8-24 09:15:01 | 显示全部楼层 |阅读模式
背景
  对于任何一种语言,了解其执行模型和内存模型都是有意义的,本文中的内容不见得正确,请多批评。

执行模型
  每个请求都是一个独立的PHP进程,两个请求之间会完全隔离,会话和Cookie是通过其他机制在多个请求之间实现数据共享,像静态变量和全局属性这些会在每个请求中重新初始化。
  示例



1 <?php
2 static $StaticVar = 1;
3 $StaticVar++;
4
5 echo $StaticVar.'<br/>';
6 ?>
  结果



2 //无论刷新多少次请求,结果都是2。
内存模型

基本规则
  以下是PHP的内存管理规则:


  • 默认按值传递。
  • 必须显式的声明按引用传递。
  • 对象类型的值是对象的地址。



1 $symbol = value;
  其中:symbo是符号,存放在符号表中(全局符号表或活动符号表),value是符号引用的值。



1 $symbol_ref = &$symbol;
  其中:symbo_ref和symbo会l引用同一个值。

第一个小测试
  代码



1 <?php
2 $var_a = 1;
3 $var_b = $var_a;
4 $var_c = &$var_a;
5 $var_d = $var_c;
6 $var_e = &$var_c;
7 $var_e = 2;
8
9 echo "var_a:$var_a, var_b:$var_b, var_c:$var_c, var_d:$var_d, var_e:$var_e<br/>"
10
11 ?>
  结果



1 var_a:2, var_b:1, var_c:2, var_d:1, var_e:2
  内存变化
  第一步
DSC0000.png
  第二步
DSC0001.png
  第三步
DSC0002.png
  第四步
DSC0003.png
  第五步
DSC0004.png
  第六步
DSC0005.png

第二个小测试
  代码



1 <?php
2 class TestClass {
3     private $value = 1;
4     
5     function setValue($value) {
6         $this->value = $value;
7     }
8     
9     function getValue() {
10         return $this->value;   
11     }
12 }
13
14 $var_obj = new TestClass();
15 $var_obj_copy = $var_obj;
16 $var_obj_ref = &$var_obj;
17
18 $var_obj_ref->setValue(2);
19
20 echo $var_obj->getValue().'<br/>';
21 echo $var_obj_copy->getValue().'<br/>';
22 echo $var_obj_ref->getValue().'<br/>';
23 ?>
  结果



1 //输出结果
2
3 2
4 2
5 2
  内存变化
  第一步
DSC0006.png
  第二步
DSC0007.png
  第三步
DSC0008.png
  第四步
DSC0009.png

备注
  真正的PHP内存不是上面那样,但是语义上和上面描述的没有区别,PHP为了优化内存做了一些额外的工作。
  PHP为了提高内存利用效率,并不是在赋值给符号的时候立即按值拷贝的,每个值都维护了一个引用计数(被多少个符号引用了),在某些合适的时刻会自动拷贝,不过这些时刻对于开发人员是透明的,可以不用考虑。
  有感兴趣的朋友,可以参考这篇文章:http://www.laruence.com/2008/09/19/520.html。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103254-1-1.html 上篇帖子: 50条规则提高PHP开发提高效率技巧 下篇帖子: PHP中array数组教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表