Hoppa till innehåll

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:

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');

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:

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

$log->appendStream($largeIterable);

Queues mass-API:er:

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));

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:

PHP
$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:

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