生成器妙用

2017-12-30 • PHPNo Comments

假设我们想要迭代一个大小为4GB的CSV文件,而虚拟私有服务器(VPS)只允许PHP使用1GB内存,因此不能把整个文件都加载到内存中,下面的代码展示了如何使用生成器完成这种操作:

function getRows($file) {
    $handle = fopen($file, 'rb');
    if ($handle == FALSE) {
        throw new Exception();
    }
    while (feof($handle) === FALSE) {
        yield fgetcsv($handle);
    }
    fclose($handle);
}

foreach ($getRows($file) as $row) {
    print_r($row);
}

上述示例一次只会为CSV文件中的一行分配内存,而不会把整个4GB的CSV文件都读取到内存中。

而定义一个生成器相当简单,跟定义一个函数一样,只是里面的元素都用yeild声明:

function getName() {
    yield 'illya';
    yield 'miyu';
    yield 'kuluo';
}

粤公网安备 44011102000950号