Перейти к содержимому

Массовая обработка данных

Методы *Many принимают массивы и возвращают созданные записи или идентификаторы; методы *Stream принимают любой итерируемый объект, ничего не хранят в памяти и возвращают количество элементов. Используйте потоки для заданий загрузки, если объём входных данных больше желаемого размера массива PHP. Массовые методы блокируют коллекцию один раз; в журнале и очереди они буферизуют несколько записей перед каждым fsync, поэтому их скорость записи на запись в несколько раз выше, чем при вызове по одной записи. Массовые записи DocStore по-прежнему синхронизируют каждый файл записи; они сокращают число блокировок, но не fsync.

Массовые 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');

Строки JSONL содержат по одному объекту в каждой строке: {"id": "...", "data": {...}} или просто объект данных (при импорте ему присваивается идентификатор). В строках могут быть указаны идентификаторы, поэтому экспорт и импорт точно воспроизводят коллекцию.

Массовые API SegmentedLog:

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

$log->appendStream($largeIterable);

Массовые 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));

При включении разделов сегменты журнала размещаются в каталогах по дням или месяцам (events/partitions/2026-07-05/), поэтому целые старые периоды можно архивировать или удалять как каталоги:

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

Политика хранения удаляет записи журнала старше заданной даты и уплотняет освобождённое пространство; purgeDone удаляет завершённые задачи очереди из памяти:

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