Přejít k obsahu

Hromadná data

Metody *Many přijímají pole a vracejí vytvořené záznamy nebo ID; metody *Stream přijímají libovolný iterovatelný objekt, nic neukládají do paměti a vracejí počet. Streamy použijte pro úlohy příjmu dat, jejichž vstup je větší, než chcete načíst do pole PHP. Hromadné metody zamknou kolekci pouze jednou a v logu a frontě ukládají mnoho záznamů na jedno fsync, takže jejich zápisy jsou v přepočtu na záznam několikanásobně rychlejší než jednotlivá volání. Hromadné zápisy DocStore stále synchronizují každý soubor záznamu; šetří zbytečná zamykání, nikoli volání fsync.

Hromadná API DocStore:

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

Řádky JSONL představují jeden objekt na řádek, buď {"id": "...", "data": {...}}, nebo prostý datový objekt (při importu se vygeneruje ID). Řádky mohou obsahovat explicitní ID, takže export a import přesně zachovají kolekci.

Hromadná API SegmentedLog:

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

$log->appendStream($largeIterable);

Hromadná API Queue:

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

Volitelné oddíly ukládají segmenty logu do adresáře pro každý den nebo měsíc (events/partitions/2026-07-05/), takže stará období lze archivovat nebo odstranit jako celé adresáře:

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

Retence maže záznamy logu starší než stanovený čas a uvolněné místo komprimuje; purgeDone odstraňuje dokončené úlohy fronty z paměti:

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