Storh
Tiedostopohjaiset tietueet kohteelle PHP: JSONC-dokumentit, vain lisäystä tukevat segmentoidut lokit ja lokipohjaiset jonot, joissa on UUIDv7-tunnisteet.
composer require storh/storhUusin julkaisu v0.5.2 MIT PHP 8.2+
$pages = $docs
->query()
->where('kind')->eq('page')
->orderBy('title')
->limit(20)
->get();Käytännössä
Pika-aloitus kahdessa osassa: dokumentti tallennuksen juuressa, sitten lokimerkintä ja jonotyö sen rinnalla.
Yksi juuri, kolme moottoria
StorageRoot::resolve() normalisoi perushakemiston ja nimitilan juureksi, ja kukin moottori luo oman hakemistonsa sen alle ensimmäisellä käyttökerralla.
Jokainen moottori palauttaa StorageRecord-objekteja, joissa on id() ja data(). Jono lisää jokaisen varauksen ja valmistumisen tapahtumalokiinsa.
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-dokumenttisäilö
Yksi JSONC-tiedosto tietuetta kohden, UUIDv7-tunnisteet, ositus UUID-tunnisteen viimeisen ryhmän kahden merkin mukaan, atominen korvaus ja suoratoistettavat kenttäsuodattimet.
Segmentoitu loki
Vain lisäystä tukevat segmentit, joissa JSON-rivit on etuliitetty pituudella ja tarkistussummalla; harvat indeksit, kursorin ja aikavälin mukaiset haut, kaatumisesta palautuminen ja tiivistäminen.
Lokijono
Työt siirtyvät odottavista käsittelyssä oleviin ja valmiisiin tiloihin kompaktien, vain lisäystä tukevien jonotapahtumien avulla.
UUIDv7-tietueet
Järjestettävät ja aikaan kohdistettavat tunnisteet vakaiden kursorien, rajattujen hakujen ja ositusta tukevien tallennuspolkujen käyttöön.
Atomiset kirjoitukset
Väliaikaistiedostoon kirjoittaminen ja atominen uudelleennimeäminen pitävät tietueet ehjinä. Kirjoittajan kaaduttua seuraava avaus siivoaa sen orvot väliaikaistiedostot.
Osittaisen kirjoituksen palautus
Segmenttilukujen aikana tarkistetaan pituus- ja tarkistussummakentät; palautus katkaisee osittaiset loppurivit.
Tiedostopohjainen
Ei tietokantapalvelinta, kehysadapteria eikä Composer-ajonaikaisia paketteja; kutsuja antaa hakemiston.
Lukee JSONC
Tietuetiedostot voivat sisältää kommentteja ja loppupilkun. storh kirjoittaa kompaktin yksirivisen JSON-muodon, joten kommentit säilyvät seuraavaan kirjoitukseen asti.
Kyselyrakennin
Sujuvat kyselyt, kuten where('status')->in([...]), toimivat DocStoressa ja SegmentedLogissa; DocStore käyttää toissijaisia indeksejä, jos niitä on.
Toissijaiset indeksit
Yhtäsuuruus-, yksilöllisyys- ja alueindeksit tallennetaan tiedostoina kokoelman viereen. Ne johdetaan tietueista ja voidaan rakentaa uudelleen milloin tahansa.
Skeemat
Valinnaiset kokoelmaskeemat validoivat jokaisen kirjoituksen ja määrittävät, mitkä kentät indeksoidaan.
SQL-peilaus
Siirrä kokoelmia kohteeseen SQLite tai MySQL yhdistämistä, hakua ja raportointia varten tiedostojen pysyessä ensisijaisina. Tarvitsee ext-pdo- tai ext-mysqli-laajennuksen vain käytettäessä.
Miksi Storh
Hakemisto, ei palvelinta
Välität perushakemiston, ja storh kirjoittaa siihen. Se tarvitsee PHP 8.2:n ja ext-jsonin, mutta ei Composer-ajonaikaisia paketteja eikä kehysadapteria.
Yksi tietuerakenne, kolme tallennusmuotoa
Dokumentit, lokit ja jonot tallentavat kaikki UUIDv7-tunnisteen ja datataulukon. Valitse levyasettelu työkuorman mukaan ja pidä kaikki kolme saman juuren alla.
Suoritettavia tarkistuksia
verify() tarkistaa indeksit ja lokin tilan vertaamalla niitä tiedostojen täydelliseen läpikäyntiin. repair() asettaa vioittuneet tietueet karanteeniin ja katkaisee rikkoutuneet lokin loput, ja CLI tulostaa JSON cron-töitä ja kuntotarkistuksia varten.
Vertailutestit ja niiden asetukset
README julkaisee mediaaniarvot moottoria kohden 50,000 tietueen aineistolla, Apple M1 Prolla ja PHP 8.5:llä, esimerkiksi 5,6 µs pistelukua kohden. Jokainen näiden ajojen kirjoitus synkronoidaan levylle, joten kirjoitusnopeudet riippuvat tiedostojärjestelmästä.
Vertailu
storh on tiedostopohjainen tallennusratkaisu, ei relaatiokyselymoottori, joten nämä työkalut hoitavat joitakin tehtäviä, joita se ei kata.
| Työkalu | Sopii hyvin | Ero kohteeseen Storh |
|---|---|---|
| SQLite | Sopii hyvinItsenäinen SQL-moottori yhdessä tiedostossa, jossa on sarjoitettavat ACID-tapahtumat, jotka kestävät ohjelman kaatumisen tai sähkökatkon. Dokumentaatio esittelee sen satunnaisten datatiedostojen korvaajana. | Ero kohteeseen Storhstorh säilyttää yhden JSON-tiedoston tietuetta kohden, eikä sen ydin tarvitse PDO-ohjainta. Se ei tue usean tietueen tapahtumia, ja dokumentaatio ohjaa käyttämään siihen varsinaista tietokantaa. Se voi siirtää kokoelmia kohteeseen SQLite yhdistämistä ja raportointia varten tiedostojen pysyessä ensisijaisina. |
| MySQL | Sopii hyvinRelaatiotietokanta, jota palvelee monisäikeinen SQL-palvelin ja johon kuuluu asiakasohjelmia ja kirjastoja, hallintatyökaluja sekä laaja valikoima rajapintoja. | Ero kohteeseen Storhstorh toimii PHP-prosessin sisällä hakemistoa käyttäen, joten ylläpidettävää palvelinta ei ole. Yhdistämistä, hakua ja raportointia varten se peilaa kokoelmat kohteeseen MySQL, myös olemassa olevan mysqli-kahvan kautta, ja tiedostot pysyvät totuuden lähteenä. |
| SleekDB | Sopii hyvinTiedostopohjainen dokumenttitietokanta kohteessa PHP ilman kolmannen osapuolen riippuvuuksia, tallentaa skeemattoman datan tavallisina JSON-tiedostoina. Sen kyselykieli API sisältää yhdistämiset, tekstinhaun, ryhmittelyn ja suodatuksen ryhmiteltyjen tulosten perusteella sekä sisäkkäisten ominaisuuksien suodattimet. | Ero kohteeseen Storhstorh yhdistää dokumenttisäilöönsä vain lisäystä tukevan segmentoidun lokin ja lokipohjaisen jonon saman juuren alle sekä synkronoi jokaisen kirjoituksen levylle ennen kuin ilmoittaa sen tallentuneen. Yhdistämiset eivät kuulu storh-toimintoihin; niitä varten se siirtää kokoelmia kohteeseen SQLite tai MySQL. |
Kysymykset ja vastaukset
Lyhyet vastaukset Storh-dokumentaatiosta.
Kyllä. DocStore sarjallistaa muutokset kokoelman kirjoituslukolla, ja samanaikaisten kirjoitusten kohdalla viimeinen uudelleennimeäminen voittaa, jos ne kohdistuvat samaan tunnisteeseen. Jonotyöt pitävät jonolukon varauksen ajan, joten kaksi työntekijää ei varaa samaa odottavaa työtä.
Kyllä. Luvut hyväksyvät kommentit ja loppupilkut, mutta seuraava put() kyseiselle tunnisteelle kirjoittaa tiedoston uudelleen kompaktiksi JSON-muodoksi ja poistaa ne. TRUST-välimuistitilassa ei havaita tiedostoja, joita on muutettu storh-ohjelman ulkopuolella.
Tunnisteeseen perustuvat pisteluvut pysyvät nopeina niin kauan kuin tiedostojärjestelmä pystyy käsittelemään tiedostomäärän. Indeksoimattomat DocStore-kenttähaut hidastuvat noin 10 000 tietueen jälkeen, joten määritä indeksit suodattamillesi kentille. Segmentoidun lokin haut ja aluehaut toimivat hyvin noin miljoonaan tietueeseen asti.
Kirjoitukset synkronoidaan levylle ja julkaistaan atomisella uudelleennimeämisellä. Lokin tai jonon uudelleenavaaminen katkaisee rikkoutuneet loput viimeiseen vahvistettuun tapahtumaan. Sähkökatkon jälkeinen kestävyys riippuu silti siitä, noudattavatko tiedostojärjestelmä ja liitosasetukset näitä synkronointeja.
Ei. Siirrä kokoelmia kohteeseen SQLite tai MySQL SqlMirrorilla yhdistämistä, hakua ja raportointia varten. Usean tietueen atomiset kirjoitukset kuuluvat edelleen varsinaiselle tietokannalle, joka toimii tietojen ensisijaisena lähteenä.
Et. Jono ei ole yleiskäyttöinen tietuesäilö, ja työn sisältö poistetaan työn valmistuttua.
Aloita pika-aloituksesta ja siirry sitten Moottorin valintaan, jotta voit valita työkuormallesi DocStoren, SegmentedLogin tai Queuen.