Liigu sisu juurde

Storh

Failikesksed kirjed PHP jaoks: JSONC dokumendid, ainult lisatavad segmenteeritud logid ja logipõhised järjekorrad UUIDv7 ID-dega.

Terminal
composer require storh/storh

Viimane väljalase v0.5.2 MIT PHP 8.2+

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.

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

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.

Storh võrrelduna teiste tööriistadega
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.

Alusta kiirjuhendist ja vaata seejärel juhendist „Mootori valimine”, kuidas sobitada DocStore, SegmentedLog või Queue oma töökoormusega.