PHP用引用计算和写时复制
php用引用计算和写时复制(copy-on-write)来管理内存。写时复制确保在变量之间复制值时不浪费内存,引用计算确保在引用不再需要时将内存返回给操作系统。
要理解PHP中的内存管理,必须首先理解符号表(symbol
table)的思想,变量有两部分–变量名(如$name)和变量值(如”Fred”)。符号表是一个数组,此数组将变量名映射到其值在内存中的位置。
当从一个变量复制值到另一个变量是,PHP没有因为复制值而得到更多的内存,而是更新符号表,以表明“这两个变量是同一块内存的名字”。所以下面的代码实际上并没有创建一个新数组:
$worker=array(“Fred”,35,”Wilma”);
$other=$worker;//数组没有被复制
如果修改任意一个拷贝,那么PHP将分配内存并产生该拷贝:
$worker[1]=36;//数组被复制,值发生变化
由于延迟分配和复制,PHP在很多情况下节省了时间和内存。这就是写时复制。
符号表指向的每个值都有一个引用计数(reference
count),它是一个数字,表示通向那片内存的途径数。在将数组的初值赋给$worker和将$worker赋给$other后,符号表中指向数组的条
目为$worker和$other,引用计数为2。换句话说,有两条途径可以到达那片内存:通过$worker或$other。但$worker[1]改
变以后,PHP为$worker创建一个新数组,并且每一个数组的引用计数都仅仅为1。
当一个变量不在作用域中(函数参数或局部变量在函数的结尾)时,引用计数值减1。当一个变量被分配的值在内存的其他区域时,旧的引用计数值减1。当引用计数值达到0时,内存被释放。这就是引用计数。
引用计数式管理内存的首选方法,保持变量的函数局部性传递函数需要用到的值,并且让引用计数负责在引用不再需要时释放内存。如果想要获得更多信息或完全控制释放变量的值,可以用函数isset()和unset()。
查看变量是否已经设置(即使是空字符串),用isset():
$s1=isset($name);//$s1为false
$name="Fred";
$s2=isset($name);//$s2为true
用unset()来删除一个变量的值:
$name="Fred";
unset($name);//$name为NULL
分享到:
相关推荐
【PHP内存管理详解】 在PHP编程中,内存管理是一个至关重要的环节,特别是对于那些长期运行的服务器程序,如Web服务器和PHP扩展模块。了解PHP如何分配和释放内存能帮助开发者编写更加高效和稳定的代码。 一、内存...
总的来说,深入理解PHP内存管理,编写出高效、无泄漏的代码,是每个PHP开发者必备的技能。这不仅涉及到内存的分配和释放,还包括错误处理策略以及如何避免因程序设计不当而产生的内存问题。只有这样,才能确保长时间...
以下是一些关于PHP内存管理的核心知识点: 1. **内存限制(memory_limit)**: PHP的`memory_limit`配置项决定了脚本可以使用的最大内存。默认情况下,这个值可能设置为128MB,如`phpstudy-php.ini`中的设置所示。...
本文将深入探讨PHP内存管理的各个方面。 首先,PHP中的内存管理与C语言有所不同。在PHP中,创建和操作字符串非常简单,如`$str = 'hello world';`,字符串可以被自由修改、拷贝和移动。相比之下,C语言中的静态字符...
深入理解PHP内存管理机制,是每个PHP开发者必备的技能之一。在PHP中,内存管理并非像C语言那样直观,而是有着一套独特的系统。本文将探讨内存分配、释放以及`unset`函数的工作原理。 首先,PHP的内存管理并不直接...
下面我们将深入探讨 `unset` 在 PHP 中的工作原理以及相关的内存管理。 首先,当我们创建一个变量并赋值时,PHP 会为这个变量分配内存空间来存储值。`unset` 函数用于解除对变量的引用,使其无法再被程序访问。然而...
三、PHP内存管理 PHP使用了自己的内存管理机制,包括ZEND内存池和垃圾回收机制。ZEND内存池提供了一种高效分配和回收内存的方式,避免了频繁的系统调用。垃圾回收机制则自动回收不再使用的内存,防止内存泄漏。 四...
通常,这可能涉及到对PHP内存管理函数如`malloc()`、`calloc()`、`realloc()`和`free()`的使用,或者通过PHP的内存管理扩展如ZEND_MM来实现。 此外,项目中包含的`os.sql`文件是数据库的SQL脚本,用于创建和初始化...
EasyTask是一款专为PHP设计的轻量级常驻内存多进程任务管理器,它使得在PHP环境中实现复杂的并发处理和任务调度变得简单易行。EasyTask的核心特性是保持任务状态在内存中,避免了传统PHP脚本每次执行时重新加载数据...
引用计数是PHP内存管理的关键,用于跟踪变量被引用的次数,当计数为零时,变量会被自动释放,以节省内存资源。zval的状态包括IS_NULL、IS_BOOL、IS_LONG等,这些状态反映了变量的类型。书中还详细介绍了zval状态的...
首先,要理解PHP的内存管理机制。PHP脚本默认有内存使用上限,可以通过调整php.ini配置文件中的`memory_limit`参数来改变这一上限。但仅仅增加内存限制并不能根本解决内存溢出的问题,有时可能需要改变程序的处理...
C 语言的内存管理通常涉及 malloc 和 free 函数,而在 PHP 中,应使用 _emalloc_ 和 _efree_ 等函数来分配和释放内存,以确保与 PHP 的内存管理策略一致。 ### Extensions 的编写 #### Hello World 创建一个简单...
引用计数是PHP内存管理的一种方式,用于跟踪变量被引用的次数。当一个变量被创建时,其引用计数初始化为1。当一个变量被赋值给另一个变量时,原始变量的引用计数增加1,表示有另一个变量在引用它。当一个变量不再被...
PHP作为一种动态类型的编程语言,其变量管理机制包括引用计数器和垃圾回收机制,这两者是PHP内存管理的核心。本文将深入探讨这两个概念,以及它们在PHP中的实现方式。 首先,让我们了解PHP变量的内部结构。PHP的...
PHP内存管理 - PHP的内存管理主要涉及自动垃圾回收机制、内存池管理和手动内存释放等。了解如何有效管理内存对于编写高性能的PHP应用程序至关重要。 ### 6. 使用foreach循环遍历数组 - **Iterator模式**:PHP5中...
尽管PHP在内存管理和性能上可能不如Java或Erlang,但在特定场景下,如快速原型开发和轻量级数据处理,PHP依然表现出色。 Python,以其简洁的语法和强大的科学计算库而备受青睐,"python_dict_turple_test.py"可能...