跳转到正文

批量数据

*Many 方法接受数组,并返回创建的记录或 ID;*Stream 方法接受任意可迭代对象,不会将数据保留在内存中,并返回数量。对于输入数据量超出你愿意存入内存的 PHP 数组大小的导入任务,请使用流。批量方法只获取一次集合锁,并且在日志和队列中会在每次 fsync 前缓冲多条记录,因此与逐条调用相比,批量写入的单条记录处理速度快数倍。DocStore 批量写入仍会对每个记录文件执行同步;它们减少的是锁争用,而非 fsync 次数。

DocStore 批量 API:

PHP
$records = $docs->putMany([
    ['slug' => 'home', 'kind' => 'page'],
    ['slug' => 'about', 'kind' => 'page'],
]);

$count = $docs->putStream($largeIterable);

$docs->exportJsonl(__DIR__ . '/pages.jsonl');
$docs->importJsonl(__DIR__ . '/pages.jsonl');

JSONL 行每行一个对象,格式可以是 {"id": "...", "data": {...}},也可以是裸数据对象(导入时会生成 ID)。行中可以包含显式 ID,因此导出再导入后,集合内容会完全一致。

SegmentedLog 批量 API:

PHP
$log->appendMany([
    ['type' => 'page.saved'],
    ['type' => 'page.rendered'],
]);

$log->appendStream($largeIterable);

Queue 批量 API:

PHP
$queue->enqueueMany([
    ['task' => 'render', 'pageId' => $home->id()],
    ['task' => 'notify', 'pageId' => $home->id()],
]);

$jobs = $queue->claimMany(100);
$queue->completeMany(array_map(fn ($job) => $job->id(), $jobs));

可选分区会将日志的分段存放在按天或按月划分的目录下(events/partitions/2026-07-05/),因此可以将较早的时间段归档,或按整个目录删除:

PHP
$daily = new Storh\SegmentedLog($root, 'events', partition: 'daily');
$monthly = new Storh\SegmentedLog($root, 'events', partition: 'monthly');

保留策略会删除早于截止时间的日志记录,并压缩回收的空间;purgeDone 会从内存中移除已完成的队列任务:

PHP
$deleted = $log->retain()->olderThanDays(90)->compact();
$queue->purgeDone(olderThanSeconds: 86400);