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. 异步编程(Async和Await)的使用

    .net4.5新特性之异步编程(Async和Await)的使用 一.简介 首先来看看.net的发展中的各个阶段的特性:NET 与C# 的每个版本发布都是有一个“主题”.即:C#1.0托管代码→C#2. ...

  2. 【百度地图API】如何制作公交线路的搜索?如331路

    原文:[百度地图API]如何制作公交线路的搜索?如331路 摘要: 从A点到B点的公交导航大家都知道怎么做了,那么单独查询331路公交车的公交路线,如何制作呢?我们一起来学习一下~ --------- ...

  3. asp.net webform easyui

    建议使用   html 页面 和 一般处理程序,一般处理程序 继承 IRequiresSessionState  ,才能用 session .

  4. 只显示年月的js时间控件 纯手写

    <style> #date { text-align: center; } .td { cursor: pointer; } </style> <script> f ...

  5. 我的MYSQL学习心得(十一)

    原文:我的MYSQL学习心得(十一) 我的MYSQL学习心得(十一) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYS ...

  6. Mongodb操作之查询(循序渐进对比SQL语句)

    工具推荐:Robomongo,可自行百度寻找下载源,个人比较推荐这个工具,相比较mongoVUE则更加灵活. 集合简单查询方法 mongodb语法:db.collection.find()  //co ...

  7. userAgent,JS这么屌的用户代理,你造吗?——判断浏览器内核、浏览器、浏览器平台、windows操作系统版本、移动设备、游戏系统

    1.识别浏览器呈现引擎 为了不在全局作用域中添加多余变量,这里使用单例模式(什么是单例模式?)来封装检测脚本.检测脚本的基本代码如下所示: var client = function() { var ...

  8. 初探Django线程发送邮件

    最近一直在纠结一个邮件发送的问题. 在本地Linux下搭建程序,不填写EMAIL设置就可以成功发送邮件,在远端的云服务器下的Linux环境就发送不了.在windows下搭建的程序也不能发送注册邮件,很 ...

  9. C# 打开网页兼容Windows8.1的方式

    方法:指定浏览器 void WebWithDefaultBrower() { string name = string.Empty; try { string mainKey = @"htt ...

  10. __declspec(novtable)keyword

    __declspec (novtable )keyword,表示这个类不生成虚函数表.可是继承类不影响(无论基类是否使用了keyword). 不使用此keyword.类在生成对象时构造函数和析构函数多 ...