Storh
Failikesksed kirjed PHP jaoks: JSONC dokumendid, ainult lisatavad segmenteeritud logid ja logipõhised järjekorrad UUIDv7 ID-dega.
composer require storh/storhViimane väljalase v0.5.2 MIT PHP 8.2+
$pages = $docs
->query()
->where('kind')->eq('page')
->orderBy('title')
->limit(20)
->get();Praktikas
Kiirjuhend kahes osas: dokument salvestusjuurkaustas, seejärel logikirje ja järjekorra töö selle kõrval.
Üks juurkaust, kolm mootorit
StorageRoot::resolve() normaliseerib baaskataloogi ja nimeruumi üheks juurkaustaks ning iga mootor loob esimesel kasutamisel selle alla oma kataloogi.
Iga mootor tagastab StorageRecord objekte, millel on id() ja data(). Järjekord lisab iga hõivamise ja lõpetamise oma sündmuste logisse.
use Storh\DocStore;
use Storh\Queue;
use Storh\RecordQuery;
use Storh\SegmentedLog;
use Storh\StorageRoot;
$root = StorageRoot::resolve(__DIR__ . '/var/storh', 'demo');
$docs = new DocStore($root, 'pages');
$home = $docs->put([
'kind' => 'page',
'title' => 'Home',
]);
$loaded = $docs->get($home->id());$log = new SegmentedLog($root, 'events');
$log->put([
'type' => 'page.saved',
'pageId' => $home->id(),
]);
foreach ($log->stream(RecordQuery::all()->after($home->id())->limit(50)) as $record) {
// Process records lazily.
}
$queue = new Queue($root, 'jobs');
$jobId = $queue->enqueue(['task' => 'render', 'pageId' => $home->id()]);
$job = $queue->claim();
if (null !== $job) {
$queue->complete($job->id());
}JSONC dokumendihoidla
Üks JSONC fail iga kirje kohta, UUIDv7 ID-d, jaotamine kahe tähemärgi järgi UUID viimases rühmas, aatomne asendamine ja voogedastusega väljade filtrid.
Segmenteeritud logi
Ainult lisatavad segmendid, milles JSON read on pikkuse ja kontrollsummaga varustatud; hõredad indeksid, kursori- ja ajavahemiku lugemine, krahhist taastamine ning tihendamine.
Logijärjekord
Tööd liiguvad olekute ootel, töötlemisel ja tehtud vahel, kasutades kompaktseid, ainult lisatavaid järjekorra sündmusi.
UUIDv7 kirjed
Sorditavad ja ajaliselt adresseeritavad ID-d stabiilsete kursorite, piiratud skannimiste ja osadeks jagamist toetavate salvestusteede jaoks.
Aatomkirjutused
Ajutistesse failidesse kirjutamine ja aatomne ümbernimetamine hoiavad kirjed terviklikuna. Pärast kirjutaja krahhi puhastab järgmine avamine selle orvuks jäänud ajutised failid.
Pooliku kirjutuse taastamine
Segmendi lugemisel kontrollitakse pikkuse- ja kontrollsummavälju; taastamisel kärbitakse osalised lõpuread.
Failipõhine
Andmebaasiserverit ega raamistikuadapterit pole vaja, samuti pole vaja Composer käitusaja pakette; helistaja annab ette kataloogi.
Lugemisel JSONC
Kirjefailides võivad olla kommentaarid ja lõpus olevad komad. storh kirjutab kompaktset üherealist JSON-i, seega säilivad kommentaarid järgmise kirjutamiseni.
Päringukoostaja
Sujuvad päringud, näiteks where('status')->in([...]), DocStore'is ja SegmentedLog'is; DocStore kasutab olemasolevaid teiseseid indekseid.
Teisesed indeksid
Võrdsus-, unikaalsus- ja vahemikuindeksid salvestatakse koguga samas kataloogis asuvate failidena, tuletatakse kirjetest ja neid saab igal ajal uuesti luua.
Skeemid
Valikulised kogu skeemid valideerivad iga kirjutuse ja määravad, millised väljad indekseeritakse.
SQL peegel
Saada kogud SQLite-i või MySQL-i liitmiste, otsingu ja aruandluse jaoks, hoides failid kanoonilisena. Vajab ext-pdo või ext-mysqli laiendust ainult kasutamise korral.
Miks Storh
Kataloog, mitte server
Anna ette baaskataloog ja storh kirjutab sinna. See vajab PHP 8.2 ja ext-json laiendust, kuid ei vaja Composer käitusaja pakette ega raamistikuadapterit.
Üks kirjete kuju, kolm paigutust
Dokumendid, logid ja järjekorrad salvestavad kõik UUIDv7 ID koos andmemassiiviga. Vali töökoormusele sobiv kettapaigutus ja hoia kõiki kolme ühe juurkausta all.
Kontrollid, mida saad käivitada
verify() võrdleb indekseid ja logi olekut failide täieliku skannimise tulemustega. repair() paigutab rikutud kirjed karantiini ja kärbib katkised logilõpud ning CLI väljastab JSON cron tööde ja seisundikontrollide jaoks.
Võrdlustestid koos seadistusega
README avaldab iga mootori puhul 50,000 kirje mediaanajad arvutis Apple M1 Pro, milles töötab PHP 8.5, näiteks 5.6 µs ühe punktotsingu kohta. Kõik nende käituste kirjutused sünkroonitakse kettale, seega sõltub kirjutuskiirus failisüsteemist.
Võrdlus
storh on failipõhine salvestus, mitte relatsiooniliste päringute mootor, seega teevad need tööriistad osa ülesannetest, mida see ei kata.
| Tööriist | Sobib hästi | Erinevus võrreldes Storh-ga |
|---|---|---|
| SQLite | Sobib hästiIseseisev SQL-i mootor ühes failis, mille serialiseeritavad ACID-tehingud peavad vastu programmi krahhile või elektrikatkestusele. Selle dokumentatsioon esitleb seda ajutiste andmefailide asendusena. | Erinevus võrreldes Storh-gastorh hoiab iga kirjet eraldi JSON failis ja selle tuum ei vaja PDO draiverit. Mitme kirje tehinguid pole; dokumentatsioon soovitab selle töö jaoks päris andmebaasi. Liitmiste ja aruandluse jaoks saab kogud saata SQLite-i, samal ajal kui failid jäävad kanooniliseks allikaks. |
| MySQL | Sobib hästiRelatsiooniline andmebaas, mida teenindab mitmelõimeline SQL server ning millel on kliendiprogrammid ja teegid, haldustööriistad ja lai valik API-sid. | Erinevus võrreldes Storh-gastorh töötab PHP protsessis kataloogi vastu, seega pole serverit vaja hallata. Liitmiste, otsingu ja aruandluse jaoks peegeldab see kogud MySQL-i, ka olemasoleva mysqli käepideme kaudu, ning failid jäävad tõeallikaks. |
| SleekDB | Sobib hästiLamefailidel põhinev dokumendiandmebaas PHP-is, millel pole kolmanda poole sõltuvusi ja mis salvestab skeemita andmeid lihttekstina JSON failides. Selle päringute API sisaldab liitmisi, tekstiotsingut, rühmitamist ja tingimuste seadmist rühmadele ning pesastatud omaduste filtreid. | Erinevus võrreldes Storh-gastorh ühendab dokumendihoidla ainult lisatava segmenteeritud logi ja logipõhise järjekorraga ühe juurkausta all ning sünkroonib iga kirjutuse kettale enne selle salvestatuks kuulutamist. Liitmised ei kuulu storh juurde; nende jaoks saadab see kogud SQLite-i või MySQL-i. |
Küsimused ja vastused
Lühikesed vastused Storh dokumentatsioonist.
Jah. DocStore järjestab muudatused kogu tasemel kirjutuslukuga ning samale ID-le konkureerivate kirjutuste puhul jääb kehtima viimati ümbernimetatud fail. Järjekorra töö hõivamisel hoitakse järjekorra lukku, nii et kaks töötajat ei hõiva sama ootel tööd.
Jah. Lugemisel aktsepteeritakse kommentaare ja lõpus olevaid komasid, kuid järgmine put() sellele ID-le kirjutab faili kompaktse JSON-ina ümber ja eemaldab need. TRUST vahemälurežiimis ei tuvastata faile, mida on muudetud väljaspool storh-i.
ID järgi tehtavad punktotsingud püsivad kiired seni, kuni failisüsteem failide arvuga toime tuleb. Indekseerimata DocStore'i väljaskannimised aeglustuvad pärast ligikaudu 10k kirjet, seega deklareeri filtrites kasutatavate väljade indeksid. Segmenteeritud logi skannimised ja vahemikulugemised toimivad hästi ligikaudu 1M kirjeni.
Kirjutused sünkroonitakse kettale ja avaldatakse aatomse ümbernimetamisega; logi või järjekorra uuesti avamisel kärbitakse katkised lõpud viimase kinnitatud sündmuseni. Elektrikatkestuse korral sõltub andmete püsivus endiselt sellest, kas failisüsteem ja ühendamisvalikud neid sünkroonimisi järgivad.
Ei. Saada kogud SqlMirrori abil SQLite-i või MySQL-i liitmiste, otsingu ja aruandluse jaoks. Mitme kirje aatomkirjutused tuleb endiselt teha päris andmebaasis, mis on süsteemi tõeallikas.
Ei. Queue pole üldotstarbeline kirjete hoidla ja töö andmekoormus eemaldatakse pärast töö lõpetamist.
Alusta kiirjuhendist ja vaata seejärel juhendist „Mootori valimine”, kuidas sobitada DocStore, SegmentedLog või Queue oma töökoormusega.