PHP如何销毁已经过期的变量并释放内存?unset使用方法

我们先看一个例子:

 代码如下 复制代码
<?php 
$s=str_repeat('1',255);  //产生由255个1组成的字符串 
$m=memory_get_usage();  //获取当前占用内存 
unset($s); 
$mm=memory_get_usage();  //unset()后再查看当前占用内存 
echo $m-$mm; 
?> 

最后输出unset()之前占用内存减去unset()之后占用内存,如果是正数,那么说明unset($s)已经将$s从内存中销毁(或者说,unset()之后内存占用减少了),可是我在PHP5和windows平台下,得到的结果是:-48。这是否可以说明,unset($s)并没有起到销毁变量$s所占用内存的作用呢?我们再作下面的例子:

 代码如下 复制代码
<?php 
$s=str_repeat('1',256);  //产生由256个1组成的字符串 
$m=memory_get_usage();  //获取当前占用内存 
unset($s); 
$mm=memory_get_usage();  //unset()后再查看当前占用内存 
echo $m-$mm; 
?> 

这个例子,和上面的例子几乎相同,唯一的不同是,$s由256个1组成,即比第一个例子多了一个1,得到结果是:224。这是否可以说明,unset($s)已经将$s所占用的内存销毁了?

通过上面两个例子,我们可以得出以下结论:结论一、unset()函数只能在变量值占用内存空间超过256字节时才会释放内存空间。

那么是不是只要变量值超过256,使用unset就可以释放内存空间呢?我们再通过一个例子来测试一下:

 代码如下 复制代码
<?php 
$s=str_repeat('1',256);  //这和第二个例子完全相同 
$p=&$s; 
$m=memory_get_usage(); 
unset($s);  //销毁$s 
$mm=memory_get_usage(); 
echo $p.'<br />'; 
echo $m-$mm; 
?> 

刷新页面,我们看到第一行有256个1,第二行是-48,按理说我们已经销毁了$s,而$p只是引用$s的变量,应该是没有内容了,另外,unset($s)后内存占用却比unset()前增加了!现在我们再做以下的例子:

 代码如下 复制代码
<?php 
$s=str_repeat('1',256);  //这和第二个例子完全相同 
$p=&$s; 
$m=memory_get_usage(); 
$s=null;  //设置$s为null 
$mm=memory_get_usage(); 
echo $p.'<br />'; 
echo $m-$mm; 
?>

 现在刷新页面,我们看到,输出$p已经是没有内容了,unset()前后内存占用量之差是224,即已经清除了变量占用的内存。本例中的$s=null也可以换成unset(),如下:

 代码如下 复制代码
<?php 
$s=str_repeat('1',256);  //这和第二个例子完全相同 
$p=&$s; 
$m=memory_get_usage(); 
unset($s);  //销毁$s 
unset($p); 
$mm=memory_get_usage(); 
echo $p.'<br />'; 
echo $m-$mm; 
?> 

我们将$s和$p都使用unset()销毁,这时再看内存占用量之差也是224,说明这样也可以释放内存。那么,我们可以得到另外一条结论:结论二、只有当指向该变量的所有变量(如引用变量)都被销毁后,才会释放内存。

相信经过本文的例子后,大家应该对unset()有所了解了,最起码,本人用unset()也是为了在变量不起作用时,释放内存。

时间: 2024-09-21 02:50:16

PHP如何销毁已经过期的变量并释放内存?unset使用方法的相关文章

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable  成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

python中查看变量内存地址的方法

  这篇文章主要介绍了python中查看变量内存地址的方法,涉及Python中id使用技巧,需要的朋友可以参考下 本文实例讲述了python中查看变量内存地址的方法.分享给大家供大家参考.具体实现方法如下: 这里可以使用id ? 1 2 3 4 5 >>> print id.__doc__ id(object) -> integer Return the identity of an object. This is guaranteed to be unique among sim

link中发射调用函数的变量,在内存中究竟是怎么存放的?是静止不变的么?

问题描述 link中发射调用函数的变量,在内存中究竟是怎么存放的?是静止不变的么? link中发射调用函数的变量,在内存中究竟是怎么存放的?是静止不变的么? 解决方案 反射调用方法,和正常调用没有区别,只是正常调用编译器就直接将跳转到方法的指令写在程序中了,而反射多一个获取方法地址的操作. 如果是局部变量,还是在堆栈上的,并且在方法结束后回收.

局部变量-java 变量在堆栈内存的问题

问题描述 java 变量在堆栈内存的问题 public class Test1 { public int i; public String e=new String("123"); public Test2 test2=new Test2(); public void say(){ String str2=new String("abc"); int i=0; System.out.println(i); } public static void main(Stri

new生成变量不释放是否会造成内存泄露

问题描述 new生成变量不释放是否会造成内存泄露 MFC中的对话框初始化函数有以下代码, 其中用new生成的东西,不释放是否会造成内存泄露? 如果会造成内存泄露,改怎样处理? 好多书上经常这么用,也没看到在哪里释放了. HDITEM item; item.cxy=200; item.mask=HDI_WIDTH; m_propertyGrid.GetHeaderCtrl().SetItem(0, new HDITEM(item)); CMFCPropertyGridProperty *pProp

AngularJS实现根据变量改变动态加载模板的方法_AngularJS

本文实例讲述了AngularJS实现根据变量改变动态加载模板的方法.分享给大家供大家参考,具体如下: directive: return { restrict: 'E', replace: true, templateUrl: 'app/view/order.html', link: function (scope, element, attrs) { scope.Type = attrs.Type; } }; 模板: <div ng-switch on="item.Type"&

判断一个变量是数组Array类型的方法_javascript技巧

在很多时候,我们都需要对一个变量进行数组类型的判断.JavaScript中如何判断一个变量是数组Array类型呢?我最近研究了一下,并分享给大家,希望能对大家有所帮助. JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Array的对象就不起作用了. 复制代码 代码如下: alert(typeof null); // "object" alert

PHP is_array() 检测变量是否是数组的实现方法_php实例

is_array() PHP is_array() 函数用于检测变量是否是数组,这个函数尤其会用于一些安全性检查方面(如表单或 SESSION 检查等). 语法: bool is_array ( mixed var )如果 var 是 array,则返回 TRUE,否则返回 FALSE . 例子: <?php $arr_age = array(18, 20, 25); if(is_array($arr_age)){ echo '变量 $arr_age 是一个数组'; } else { echo

php 变量销毁-php文件中变量的销毁方法

问题描述 php文件中变量的销毁方法 某一次在运行php的时候,提示内存不够,因为是新手,也不太明白变量内存方面的问题,所以这里问一下,是不是每一个php文件里的变量都需要进行手动的销毁?需要销毁的变量应该用什么方法销毁? 解决方案 unset($param); $param = null; //memory_get_usage();//查看内存情况