场景: php读取大文件时导致内存溢出,有哪些解决方案?
1、增加 php.ini 文件中 memory_limit 的上限(不提倡)
2、使用生成器(推荐)
function getRange ($max = 10) {
for ($i = 1; $i < $max; $i++) {
yield $i;
}
}
foreach (getRange(PHP_INT_MAX) as $range) {
echo "Dataset {$range} <br>";
}
解析 getRange 函数,这次,我们只循环遍历值和 yield 输出。 yield 与返回值类似,因为它也是从函数返回一个值,但唯一的区别是 yield 只会在需要时返回一个值,并且不会尝试将整个数据集保留在内存中。
可以参考: vendor/magento/module-catalog-search/Model/Indexer/Fulltext/Action/Full.php
注意:
生成器只能在函数中使用
在生成器中使用 return ,会跳出生成器