Vai al contenuto

Dati in blocco

I metodi *Many accettano array e restituiscono i record o gli ID creati; i metodi *Stream accettano qualsiasi iterabile, non conservano dati in memoria e restituiscono un conteggio. Usate gli stream per i processi di acquisizione quando l'input è più grande di un array PHP che volete gestire. I metodi in blocco acquisiscono una sola volta il lock della raccolta e, per il log e la coda, memorizzano temporaneamente molti record per ogni fsync: così le scritture in blocco sono diverse volte più veloci per record rispetto alle chiamate singole. Le scritture in blocco di DocStore sincronizzano comunque ogni file di record; riducono le acquisizioni del lock, non gli fsync.

API in blocco di 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');

Le righe JSONL sono un oggetto per riga, in formato {"id": "...", "data": {...}} oppure come oggetto di dati semplice (durante l'importazione viene generato un ID). Le righe possono contenere ID espliciti, quindi esportazione e importazione consentono di riprodurre esattamente una raccolta.

API in blocco di SegmentedLog:

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

$log->appendStream($largeIterable);

API in blocco di 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));

Le partizioni opzionali collocano i segmenti di un log in una directory per giorno o per mese (events/partitions/2026-07-05/), consentendo di archiviare o eliminare interi periodi come directory:

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

La conservazione elimina i record del log precedenti a una data limite e compatta lo spazio recuperato; purgeDone rimuove dalla memoria i job completati della coda:

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