본문으로 건너뛰기

대량 데이터

*Many 메서드는 배열을 받아 생성된 레코드나 ID를 반환하고, *Stream 메서드는 모든 반복 가능 객체를 받아 메모리에 내용을 보관하지 않고 개수를 반환합니다. 입력이 원하는 PHP 배열 크기보다 큰 수집 작업에는 스트림을 사용하세요. 대량 메서드는 컬렉션 잠금을 한 번만 획득하며, 로그와 큐에서는 fsync 한 번당 여러 레코드를 버퍼링하므로 레코드별 대량 쓰기가 한 번에 하나씩 호출하는 것보다 몇 배 빠릅니다. DocStore 대량 쓰기는 각 레코드 파일을 계속 동기화합니다. 잠금 횟수는 줄이지만 fsync 횟수는 줄이지 않습니다.

DocStore 대량 API:

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": {...}} 형식이거나 일반 데이터 객체입니다(가져올 때 ID가 생성됩니다). 행에 명시적 ID를 포함할 수 있으므로 컬렉션을 정확히 내보내고 다시 가져올 수 있습니다.

SegmentedLog 대량 API:

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

$log->appendStream($largeIterable);

Queue 대량 API:

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