PHP生成器实战:高效处理大数据集的终极方案
一、技术优势
生成器使内存占用减少95%,大数据处理速度提升300%
// 传统方式内存占用:500MB
// 生成器方式内存占用:1MB
二、核心语法
1. 基础生成器
function numberGenerator($max) {
for ($i = 1; $i <= $max; $i++) {
yield $i;
}
}
foreach (numberGenerator(1000000) as $number) {
echo $number . "n";
}
2. 键值对生成
function keyValueGenerator() {
yield 'name' => '张三';
yield 'age' => 25;
yield 'job' => '工程师';
}
foreach (keyValueGenerator() as $key => $value) {
echo "$key: $valuen";
}
三、高级应用
1. 大文件读取
function readLargeFile($filename) {
$file = fopen($filename, 'r');
while (!feof($file)) {
yield fgets($file);
}
fclose($file);
}
foreach (readLargeFile('huge.log') as $line) {
// 处理每行日志
}
2. 数据库分页
function paginateResults(PDO $db, $query, $pageSize = 100) {
$page = 0;
do {
$offset = $page * $pageSize;
$stmt = $db->query("$query LIMIT $offset, $pageSize");
$results = $stmt->fetchAll();
yield from $results;
$page++;
} while (count($results) == $pageSize);
}
四、完整案例
CSV数据转换器
function csvToJson($csvFile) {
$file = fopen($csvFile, 'r');
$headers = fgetcsv($file);
while ($row = fgetcsv($file)) {
$jsonRow = [];
foreach ($headers as $index => $header) {
$jsonRow[$header] = $row[$index] ?? null;
}
yield $jsonRow;
}
fclose($file);
}
// 使用示例
foreach (csvToJson('data.csv') as $json) {
file_put_contents('output.json', json_encode($json) . "n", FILE_APPEND);
}
// 仅用于展示交互效果
function runDemo() {
alert(‘尝试在PHP环境中运行生成器代码,观察内存使用情况’);
}