Massdata
Metoderna *Many tar arrayer och returnerar de skapade posterna eller id:na; metoderna
*Stream tar valfri itererbar samling, håller inget i minnet och returnerar ett
antal. Använd strömmar för inläsningsjobb där indata är större än den array av typen
PHP du vill ha. Massmetoderna låser samlingen en gång och buffrar, för loggen
och kön, många poster per fsync, vilket gör deras masskrivningar flera gånger snabbare
per post än anrop ett i taget. Masskrivningar för DocStore synkroniserar fortfarande
varje postfil; de minskar låsbyten, inte fsync-anrop.
DocStores mass-API:er:
$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');
Raderna JSONL är ett objekt per rad, antingen {"id": "...", "data": {...}} eller
ett fristående dataobjekt (ett id genereras vid import). Rader kan ha uttryckliga
id:n, så export och import återskapar en samling exakt.
SegmentedLogs mass-API:er:
$log->appendMany([
['type' => 'page.saved'],
['type' => 'page.rendered'],
]);
$log->appendStream($largeIterable);
Queues mass-API:er:
$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));
Valfria partitioner placerar en logs segment under en katalog per dag eller månad
(events/partitions/2026-07-05/), så att äldre perioder kan arkiveras
eller raderas som hela kataloger:
$daily = new Storh\SegmentedLog($root, 'events', partition: 'daily');
$monthly = new Storh\SegmentedLog($root, 'events', partition: 'monthly');
Kvarhållning raderar loggposter som är äldre än en gränstidpunkt och kompakterar det
återvunna utrymmet; purgeDone tar bort slutförda köjobb från minnet:
$deleted = $log->retain()->olderThanDays(90)->compact();
$queue->purgeDone(olderThanSeconds: 86400);