7 php 内存泄漏_如何使用PHP 引用,写出BUG

558dad17b2812751eabf4901967c6560.png

BUG

什么是PHP引用

角色: 姓名:王笨笨 爱称:狗蛋儿

自我介绍:大家好,我是王笨笨,很高兴认识大家,大家可以叫我狗蛋儿。我就是我,不一样的烟火。

生涩的概念:引用就是别名,多个名字指向同一个变量内容,没有重复冗余的内存开销。

$a = 'runBaby';$b = &$a;var_dump($a,$b);/* * string(7) "runBaby" * string(7) "runBaby" */

如何完美演绎BUG

bug:因为我们错误使用,导致错误。我们的工作是什么:写bug,找bug,改bug

无限循环···

背景:

PHP一般是web服务,在请求结束后会释放所有的资源,所以PHPer一般不用关心内存的释放。但是必须要重视,鸟哥说过:请手动释放你的资源(Please release resources manually)

鸟哥语录:如果你买了一本PHP的书, 它告诉你: “不用在PHP主动释放资源, 因为PHP会帮你释放”的话, 我建议你, 烧了它.

e1faf34874a67b93821af49246f306a1.png

鸟哥语录:版权归鸟哥所有

虽然,在请求结束之后资源就自动释放了,我们不用太担心内存泄漏。但是在请求中,如果没有即时释放引用,那么引用将一直存在

复现:

<?php $array = array( array( 'id'=>'A', ), array( 'id'=>'B', ), array( 'id'=>'C', ), array( 'id'=>'D', ));foreach ($array as &$value){ if($value['id'] == 'D'){ $value = 'DD'; }}$new_array = array();foreach ($array as $key =>$value){ $new_array[$key] = $value;}var_dump($new_array);die;

预期数据:

0d5af712305058826b4e3deb359f6b62.png

预期数据

打印信息:

d87ffadd7ffd9f06789a2749bc2392dc.png

bugInfo

实际数据和预期的有些差别啊 ,为什么最后一个重复了,不符合牛顿力学啊

1abd517df83e3c443e5c9c526aa51b19.png

郁闷小仔

前面实际已经埋下了伏笔,问题出现在:引用没有释放。

第一个遍历:使用变量 $value

第二个遍历:使用变量 $value (同一个变量)

详解:(心路历程)

5aeee442a644b931d723cd77e1992128.png

心路历程

伪代码:

$array = array( array( 'id'=>'A', ), array( 'id'=>'B', ), array( 'id'=>'C', ), array( 'id'=>'D', ),);foreach ($array as &$value){ if($value['id'] == 'D'){ $value['id'] = 'DD'; }}$new_array = array();foreach ($array as $key =>$value){ $new_array[$key] = $value; //数据 var_dump($array);}

仔细观察打印数据,发现$array[3],一直在变化,A -> B -> C -> C

变、变、变···看我七十二变

分拆步骤

//流程://第一遍 $value = $new_array[0] ,但引用未释放,$value 实际还是 $array[3] , 此时 $array[3] = $new_array[0] 结果:A 、B、C、A//第二遍 $value = $new_array[1] ,但引用未释放,$value 实际还是 $array[3] , 此时 $array[3] = $new_array[1] 结果:A 、B、C、B//第三遍 $value = $new_array[2] ,但引用未释放,$value 实际还是 $array[3] , 此时 $array[3] = $new_array[2] 结果:A 、B、C、C//第四遍 $value = $new_array[3] ,但引用未释放,$value 实际还是 $array[3] , 此时 $array[3] = $new_array[3] 结果:A 、B、C、C

一首小曲总结:

想得却不可得 你奈人生何

该舍的舍不得 只顾著跟往事瞎扯

等你发现程序是错了 它早已偷光你的选择

~~~~

该来的我不推 该还的还 该给的我给

bug 你别催 调完就OK

及时unset,解除引用操作,避免问题出现,让我们远离bug,

让bug都随风,都随风,我心随你动~~~

unset($value); //舍得
233a0c58f0051b90d134795ddb3cf7ea.png

左手代码,右手诗,趣味学习新知识

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值