PHP生成器(Generator)实战:5个高效内存管理技巧
1. 基础生成器使用
创建简单的数字序列生成器:
function numberGenerator($start, $end) {
for ($i = $start; $i <= $end; $i++) {
yield $i;
}
}
// 使用生成器
foreach (numberGenerator(1, 5) as $number) {
echo $number . " ";
}
// 输出: 1 2 3 4 5
function numberGenerator($start, $end) {
for ($i = $start; $i
2. 大数据文件读取
逐行读取大文件而不耗尽内存:
function readLargeFile($filename) {
$file = fopen($filename, 'r');
while (!feof($file)) {
yield fgets($file);
}
fclose($file);
}
foreach (readLargeFile('huge_log.txt') as $line) {
// 处理每一行
}
3. 生成器委托
使用yield from实现生成器组合:
function generatorA() {
yield 1;
yield 2;
}
function generatorB() {
yield from generatorA();
yield 3;
yield 4;
}
// 输出: 1 2 3 4
foreach (generatorB() as $value) {
echo $value . " ";
}
4. 协程实现
使用生成器实现简单协程:
function loggerCoroutine() {
while (true) {
$message = yield;
echo date('[Y-m-d H:i:s] ') . $message . "n";
}
}
$logger = loggerCoroutine();
$logger->send('系统启动');
$logger->send('用户登录');
方法 | 传统数组 | 生成器 |
---|---|---|
内存使用 | 高(存储全部数据) | 低(按需生成) |
适用场景 | 小数据集 | 大数据流 |
执行控制 | 一次性处理 | 可暂停恢复 |
5. 电商实战:大数据报表生成
高效处理百万级订单数据:
function generateOrderReport($startDate, $endDate) {
// 模拟大数据查询
$query = "SELECT * FROM orders WHERE date BETWEEN ? AND ?";
$stmt = $pdo->prepare($query);
$stmt->execute([$startDate, $endDate]);
while ($order = $stmt->fetch()) {
$reportData = processOrder($order); // 处理订单数据
yield $reportData;
}
}
// 使用生成器处理报表
foreach (generateOrderReport('2023-01-01', '2023-12-31') as $row) {
// 逐行写入CSV或显示
echo implode(',', $row) . "n";
}
PHP生成器为大数据处理提供了内存友好的解决方案,特别适合文件处理、数据流操作、报表生成等需要处理大量数据的场景,能有效避免内存溢出问题。