Dados em lote
Os métodos *Many recebem arrays e retornam os registros ou IDs criados; os métodos
*Stream recebem qualquer iterável, não mantêm nada na memória e retornam uma
contagem. Use fluxos para trabalhos de ingestão cuja entrada seja maior do que o array PHP que você deseja manter. Os métodos em lote bloqueiam a coleção uma vez e, no log
e na fila, armazenam muitos registros em buffer por fsync, tornando as gravações em lote
várias vezes mais rápidas por registro do que as chamadas individuais. As gravações em lote DocStore
ainda sincronizam cada arquivo de registro; elas reduzem a contenção do bloqueio, não os fsyncs.
APIs em lote do DocStore:
$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');
As linhas JSONL são um objeto por linha, seja {"id": "...", "data": {...}} ou
um objeto de dados simples (um ID é gerado durante a importação). As linhas podem conter
IDs explícitos, permitindo que a exportação e a importação façam uma ida e volta exata da coleção.
APIs em lote do SegmentedLog:
$log->appendMany([
['type' => 'page.saved'],
['type' => 'page.rendered'],
]);
$log->appendStream($largeIterable);
APIs em lote da fila:
$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));
Partições opcionais armazenam os segmentos de um log em um diretório por dia ou por mês
(events/partitions/2026-07-05/), para que períodos antigos possam ser arquivados
ou excluídos como diretórios inteiros:
$daily = new Storh\SegmentedLog($root, 'events', partition: 'daily');
$monthly = new Storh\SegmentedLog($root, 'events', partition: 'monthly');
A retenção exclui registros do log anteriores a uma data limite e compacta o espaço recuperado; purgeDone remove da memória as tarefas concluídas da fila:
$deleted = $log->retain()->olderThanDays(90)->compact();
$queue->purgeDone(olderThanSeconds: 86400);