第三选择

刻意练习,日渐精进

0%

2020-06-12-学习笔记

PHP 垃圾回收机制

PHP 底层给变量赋值常量值时,会创建一个 zval 容器,容器有两个字段,is_ref 标识变量是否引用, refcount 标识指向 zval 容器的变量个数。
当 zval 容器的 refcount 归零并被检测到时,会从内存中删除。 PHP 会在根缓存区满了或者调用 gc_collect_cycles()函数时执行垃圾回收。

垃圾回收机制对性能的影响有以下两个方面:

  1. 节省内存空间的占用
  2. 增加脚本的执行时间

PHP 生成器的使用

生成器是 PHP 5.5 新发布的功能,提供了一种低性能开销和复杂度的方式去实现流程控制中的数据存储及输出。它不会实时返回生成的数组,而是在实际调用时逐步将得到的数据处理后输出。

举个简单的例子,range() 函数能够得到一个按指定步长递增/递减的数组,这个数组需要占用一定的内存。
如果传入 range(0,1000000),得到的数组所占用的空间将超过 100mb。然后我们通过生成器的方式来改造一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function xrange($start, $limit, $step = 1) {
if ($start < $limit) {
if ($step < 0) {
throw new Exception("Step must be +ev");
}

for ($i = start; $i <= $limit; $i += $step) {
yield $i;
}
} else {
if ($step > 0) {
throw new Exception("Step must be -ev");
}

for ($i = $start; $i >= $limit; $i += $step ) {
yield $i;
}
}
}

xrange(0, 1000000);

使用 xrange() 方法,相同的参数,占用的内存不到1000字节。这个特点,使得我们可以很方便地处理大文件(大至几个G的文件),利用 yield 关键字,不需要将整个文件的数据保存到内存中,每次只读取一行的数据来完成逻辑处理。