PHP:执行模型和内存模型

背景

对于任何一种语言,了解其执行模型和内存模型都是有意义的,本文中的内容不见得正确,请多批评。

执行模型

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

示例

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

结果

1 //无论刷新多少次请求,结果都是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

内存变化

第一步

第二步

第三步

第四步

第五步

第六步

第二个小测试

代码

 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

内存变化

第一步

第二步

第三步

第四步

备注

真正的PHP内存不是上面那样,但是语义上和上面描述的没有区别,PHP为了优化内存做了一些额外的工作。

PHP为了提高内存利用效率,并不是在赋值给符号的时候立即按值拷贝的,每个值都维护了一个引用计数(被多少个符号引用了),在某些合适的时刻会自动拷贝,不过这些时刻对于开发人员是透明的,可以不用考虑。

有感兴趣的朋友,可以参考这篇文章:http://www.laruence.com/2008/09/19/520.html

 
分类: PHP

PHP:执行模型和内存模型的更多相关文章

  1. GPU的线程模型和内存模型

    遇见C++ AMP:在GPU上做并行计算 Written by Allen Lee I see all the young believers, your target audience. I see ...

  2. CUDA并行计算 | 线程模型与内存模型

    文章目录 前言 CUDA线程模型(如何组织线程) CUDA内存模型(了解不同内存优缺点,合理使用) 前言   CUDA(Compute Unified Device Architecture)是显卡厂 ...

  3. C++11 并发指南七(C++11 内存模型一:介绍)

    第六章主要介绍了 C++11 中的原子类型及其相关的API,原子类型的大多数 API 都需要程序员提供一个 std::memory_order(可译为内存序,访存顺序) 的枚举类型值作为参数,比如:a ...

  4. 【Todo】【转载】深入理解Java内存模型

    提纲挈领地说一下Java内存模型: 什么是Java内存模型 Java内存模型定义了一种多线程访问Java内存的规范.Java内存模型要完整讲不是这里几句话能说清楚的,我简单总结一下Java内存模型的几 ...

  5. Java 线程 — JMM Java内存模型

    JMM Java Memory Model,Java内存模型,属于语言级的内存模型 并发编程中存在的问题: 如何通信:用于线程之间交换信息.两种方式:共享内存,消息传递 如何同步:用于控制不同线程间操 ...

  6. Java内存模型的历史变迁

    转自:http://www.csdn.net/article/2015-05-20/2824722-Java 摘要:本文通过介绍Java的新/旧内存模型,来展示Java技术的历史变迁. 本文通过介绍J ...

  7. 修复 Java 内存模型,第 1 部分——Brian Goetz

    转自Java并发大师Brain Goetz:http://www.ibm.com/developerworks/cn/java/j-jtp02244/ (中文地址) http://www.ibm.co ...

  8. [转载]《C++0x漫谈》系列之:多线程内存模型

    <C++0x漫谈>系列之:多线程内存模型 By 刘未鹏(pongba) 刘言|C++的罗浮宫(http://blog.csdn.net/pongba) <C++0x漫谈>系列导 ...

  9. JVM并发机制的探讨——内存模型、内存可见性和指令重排序

    并发本来就是个有意思的问题,尤其是现在又流行这么一句话:“高帅富加机器,穷矮搓搞优化”. 从这句话可以看到,无论是高帅富还是穷矮搓都需要深入理解并发编程,高帅富加多了机器,需要协调多台机器或者多个CP ...

随机推荐

  1. ASP.NET MVC 插件化

    ASP.NET MVC 插件化机制 2015-03-14 22:25 by 杨康新, 1328 阅读, 15 评论, 收藏, 编辑 概述 nopCommerce的插件机制的核心是使用BuildMana ...

  2. 图数据库 Titan 高速入门

    尤其在互联网世界,图计算越来越受到人们的关注,而图计算相关的软件也越来越丰富.本文将高速展示 Titan这个open source 的图数据库. 注:本文的操作主要基于Titan 官方的两篇文档: - ...

  3. AppiumDriver升级到2.0.0版本引发的问题--Cannot instantiate the type AppiumDriver

    1. 问题描述和起因 在使用Appium1.7.0及其以下版本的时候,我们可以直接使用如下代码来创建一个AppiumDriver实例进行对安卓设备的操作. driver = new AndroidDr ...

  4. Android自动化测试框架新书:交流

    大家觉得编写一本描述MonkeyRunner原理分析的书籍如何?估计大概10万字左右.内容大概分布如下: Monkey实现原理: 去描述运行在目标安卓机器的monkey是如何运行并处理MonkeyRu ...

  5. jquery插件分类与编写详细讲解

    jquery插件分类与编写详细讲解 1. 插件种类 插件其实就是对现有的方法(或者叫函数)做一个封装,方便重用提高开发效率.   jQeury主要有2种类型   1)实例对象方法插件 开发能让所有的j ...

  6. php错误及异常捕捉

    原文:php错误及异常捕捉 在实际开发中,错误及异常捕捉仅仅靠try{}catch()是远远不够的. 所以引用以下几中函数. a)   set_error_handler 一般用于捕捉  E_NOTI ...

  7. PHP 生成唯一激活码

    <?php /** * 从来没有产生一个唯一的激活码 * @return string */ function create_guid($namespace = null) { static $ ...

  8. leetcode第39题--Combination Sum II

    题目: Given a collection of candidate numbers (C) and a target number (T), find all unique combination ...

  9. css3动画实例测试

    1.css3动画属性分析(2016-5-11) 1.transition: 规定属性变换规则,可以这样讲.transition(a,b,c,d); a:要变换的属性: b:过渡时间: c:运动方式: ...

  10. robin 今日南

    我很高兴,在学校体育馆看到李彦宏博士. 这是第一个真正的一次在媒体上看到,只能看到人才足够多的人,现实,我觉得非常好. 我不是一个真正罗宾的粉丝.百度是不是很热衷于这家公司.,但现在我仍然兴奋,我会被 ...