Home  >  Article  >  Backend Development  >  从PHP代码分析PHP 的GC(垃圾回收) 机制_PHP

从PHP代码分析PHP 的GC(垃圾回收) 机制_PHP

WBOY
WBOYOriginal
2016-06-01 12:20:40943browse

众所周知, PHP 引擎本身是用 C 写的,提到 C 不能不提的就是 GC(垃圾回收).通过 PHP 手册 我们了解到, PHP 引擎会自动进行 GC 动作.那么我们不禁要问,到底它是怎么回收的, & 引用操作是不是指针, unset() 了一个变量时它是不是真的被回收了呢?这些看似手册有提及的问题,如果仔细分析会发现,远没有那么简单泛泛.也许有人会跳出来说:看 PHP 源码不就知道了.是的,等你通读了 PHP 源码后这个问题肯定不在话下了,然本篇要仅从 PHP 本身来分析这些看似平常却被忽视的小细节,当然了,其中难免水平所限,有所疏漏,热烈欢迎广大 phper 来共同讨论.

首先咱先看到例子,最简单不过的执行流程了:

error_reporting(E_ALL);
$a = 'I am test.';
$b = & $a;

echo $b ."\n";
?>

不用说 % php -f gc.php 输出结果非常明了:

hy0kl% php -f gc.php
I am test.

好,下一个:

error_reporting(E_ALL);
$a = 'I am test.';
$b = & $a;

$b = 'I will change?';

echo $a ."\n";
echo $b ."\n";
?>

执行结果依然很明显:

hy0kl% php -f gc.php
I will change?
I will change?

君请看:

error_reporting(E_ALL);
$a = 'I am test.';
$b = & $a;

unset($a);

echo $a ."\n";
echo $b ."\n";
?>

是不是得想一下下呢?

hy0kl% php -f gc.php
Notice: Undefined variable: a in /usr/local/www/apache22/data/test/gc.php on line 8
I am test.

有点犯迷糊了吗?

君再看:

error_reporting(E_ALL);
$a = 'I am test.';
$b = & $a;

unset($b);

echo $a ."\n";
echo $b ."\n";
?>

其实如果 Example 3 理解了,这个与之异曲同工.

hy0kl% php -f gc.php
I am test.
Notice: Undefined variable: b in /usr/local/www/apache22/data/test/gc.php on line 9

君且看:

error_reporting(E_ALL);
$a = 'I am test.';
$b = & $a;

$a = null;

echo '$a = '. $a ."\n";
echo '$b = '. $b ."\n";
?>

猛的第一感觉是什么样的?

hy0kl% php -f gc.php
$a =
$b =

没错,这就是输出结果,对 PHP GC 已有深入理解的 phper 不会觉得有什么奇怪,说实话,当我第一次运行这段代码时很意外,却让我对 PHP GC 有更深刻的理解了.那么下面与之同工的例子自然好理解了.

error_reporting(E_ALL);
$a = 'I am test.';
$b = & $a;

$b = null;

echo '$a = '. $a ."\n";
echo '$b = '. $b ."\n";
?>

OK,如果上面的例子的结果对看官来说无任何细节可言,那您可关闭本窗口了,欢迎有空再来!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn