Μετάβαση στο περιεχόμενο

Storh

Εγγραφές με προτεραιότητα στα αρχεία για PHP: έγγραφα JSONC, τμηματοποιημένα αρχεία καταγραφής μόνο προσθήκης και ουρές που βασίζονται σε αρχεία καταγραφής με αναγνωριστικά UUIDv7.

Τερματικό
composer require storh/storh

Τελευταία έκδοση v0.5.2 MIT PHP 8.2+

Στην πράξη

Η γρήγορη εκκίνηση σε δύο μέρη: ένα έγγραφο σε μια ρίζα αποθήκευσης και, δίπλα του, μια καταχώριση αρχείου καταγραφής και μια εργασία ουράς.

Μία ρίζα, τρεις μηχανές

Το StorageRoot::resolve() κανονικοποιεί έναν βασικό κατάλογο και έναν χώρο ονομάτων σε μια ρίζα, και κάθε μηχανή δημιουργεί τον δικό της κατάλογο μέσα σε αυτήν κατά την πρώτη χρήση.

Κάθε μηχανή επιστρέφει αντικείμενα StorageRecord με id() και data(). Η ουρά προσθέτει κάθε διεκδίκηση και ολοκλήρωση στο αρχείο καταγραφής συμβάντων της.

Έγγραφα
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

Ένα αρχείο JSONC ανά εγγραφή, αναγνωριστικά UUIDv7, διαμοιρασμός βάσει δύο χαρακτήρων από την τελευταία ομάδα του UUID, ατομική αντικατάσταση και φίλτρα πεδίων με ροή.

Τμηματοποιημένο αρχείο καταγραφής

Τμήματα μόνο προσθήκης με γραμμές JSON που έχουν πρόθεμα μήκους και αθροίσματος ελέγχου, αραιά ευρετήρια, αναγνώσεις με δρομέα και χρονικά διαστήματα, ανάκτηση μετά από κατάρρευση και συμπύκνωση.

Ουρά αρχείου καταγραφής

Οι εργασίες περνούν από τις καταστάσεις σε εκκρεμότητα, υπό επεξεργασία και ολοκληρωμένη, με συνοπτικά συμβάντα ουράς μόνο προσθήκης.

Εγγραφές UUIDv7

Ταξινομήσιμα, χρονικά προσβάσιμα αναγνωριστικά για σταθερούς δρομείς, περιορισμένες σαρώσεις και διαδρομές αποθήκευσης κατάλληλες για διαμοιρασμό.

Ατομικές εγγραφές

Οι εγγραφές σε προσωρινά αρχεία και οι ατομικές μετονομασίες διατηρούν ακέραιες τις εγγραφές. Μετά την κατάρρευση ενός εγγραφέα, το επόμενο άνοιγμα απομακρύνει τα ορφανά προσωρινά αρχεία του.

Ανάκτηση από ημιτελείς εγγραφές

Κατά την ανάγνωση των τμημάτων επικυρώνονται τα πεδία μήκους και αθροίσματος ελέγχου· η ανάκτηση περικόπτει τις μερικές γραμμές στο τέλος.

Πρώτα τα αρχεία

Χωρίς διακομιστή βάσης δεδομένων, προσαρμογέα πλαισίου εργασίας ή πακέτα χρόνου εκτέλεσης Composer· οι καλούντες περνούν έναν κατάλογο.

Οι αναγνώσεις JSONC

Τα αρχεία εγγραφών μπορούν να περιέχουν σχόλια και κόμματα μετά το τελευταίο στοιχείο. Το storh γράφει συμπαγές JSON μίας γραμμής, επομένως τα σχόλια διατηρούνται μέχρι την επόμενη εγγραφή.

Δημιουργός ερωτημάτων

Ρευστά ερωτήματα, όπως where('status')->in([...]), στα DocStore και SegmentedLog· το DocStore χρησιμοποιεί δευτερεύοντα ευρετήρια όπου υπάρχουν.

Δευτερεύοντα ευρετήρια

Ευρετήρια ισότητας, μοναδικότητας και εύρους που αποθηκεύονται ως αρχεία δίπλα στη συλλογή, παράγονται από τις εγγραφές και μπορούν να αναδημιουργηθούν ανά πάσα στιγμή.

Σχήματα

Προαιρετικά σχήματα συλλογών επικυρώνουν κάθε εγγραφή και καθορίζουν ποια πεδία αποκτούν ευρετήρια.

Κατοπτρισμός SQL

Προωθήστε συλλογές στο SQLite ή στο MySQL για συνδέσεις, αναζήτηση και αναφορές, διατηρώντας τα αρχεία ως κανονική πηγή. Απαιτείται ext-pdo ή ext-mysqli μόνο κατά τη χρήση.

Γιατί Storh

Ένας κατάλογος, όχι διακομιστής

Δίνετε έναν βασικό κατάλογο και το storh γράφει εκεί. Απαιτεί τα PHP 8.2 και ext-json, χωρίς πακέτα χρόνου εκτέλεσης Composer και χωρίς προσαρμογέα πλαισίου εργασίας.

Ένα σχήμα εγγραφής, τρεις διατάξεις

Τα έγγραφα, τα αρχεία καταγραφής και οι ουρές αποθηκεύουν όλα ένα αναγνωριστικό UUIDv7 συν έναν πίνακα δεδομένων. Επιλέξτε τη διάταξη στον δίσκο ανάλογα με τον φόρτο εργασίας και διατηρήστε και τις τρεις κάτω από μία ρίζα.

Έλεγχοι που μπορείτε να εκτελέσετε

Το verify() ελέγχει τα ευρετήρια και την κατάσταση του αρχείου καταγραφής συγκρίνοντάς τα με πλήρη σάρωση των αρχείων. Το repair() θέτει σε καραντίνα τις κατεστραμμένες εγγραφές και περικόπτει τα ημιτελή άκρα των αρχείων καταγραφής, ενώ το CLI εμφανίζει JSON για εργασίες cron και ελέγχους εύρυθμης λειτουργίας.

Σημεία αναφοράς απόδοσης με το περιβάλλον τους

Το README δημοσιεύει τις διάμεσες τιμές για 50,000 εγγραφές ανά μηχανή, σε Apple M1 Pro με PHP 8.5, όπως 5.6 µs ανά ανάγνωση συγκεκριμένης εγγραφής. Κάθε εγγραφή σε αυτές τις εκτελέσεις συγχρονίζεται στον δίσκο με fsync, επομένως οι ρυθμοί εγγραφής εξαρτώνται από το σύστημα αρχείων.

Σε σύγκριση με

Το storh είναι αποθήκευση με προτεραιότητα στα αρχεία και όχι σχεσιακή μηχανή ερωτημάτων, οπότε αυτά τα εργαλεία αναλαμβάνουν ορισμένες εργασίες που εκείνο δεν καλύπτει.

Το Storh σε σύγκριση με άλλα εργαλεία
SQLite Κατάλληλο γιαΜια αυτοτελής μηχανή SQL σε ένα αρχείο, με σειριοποιήσιμες συναλλαγές ACID που διατηρούνται ακόμη και μετά από κατάρρευση προγράμματος ή διακοπή ρεύματος. Η τεκμηρίωσή της την παρουσιάζει ως αντικατάσταση των πρόχειρων αρχείων δεδομένων. Διαφορά με το StorhΤο storh διατηρεί ένα αρχείο JSON ανά εγγραφή και ο πυρήνας του δεν χρειάζεται οδηγό PDO. Δεν υποστηρίζει συναλλαγές πολλών εγγραφών και η τεκμηρίωσή του παραπέμπει για αυτή την εργασία σε πραγματική βάση δεδομένων. Μπορεί να προωθεί συλλογές στο SQLite για συνδέσεις και αναφορές, διατηρώντας τα αρχεία ως κανονική πηγή.
MySQL Κατάλληλο γιαΜια σχεσιακή βάση δεδομένων που παρέχεται από πολυνηματικό διακομιστή SQL, με προγράμματα-πελάτες και βιβλιοθήκες, εργαλεία διαχείρισης και ευρύ φάσμα API. Διαφορά με το StorhΤο storh εκτελείται μέσα στη διεργασία PHP και χρησιμοποιεί έναν κατάλογο, επομένως δεν χρειάζεται να λειτουργείτε διακομιστή. Για συνδέσεις, αναζήτηση και αναφορές, κατοπτρίζει συλλογές στο MySQL, χρησιμοποιώντας και μια υπάρχουσα λαβή mysqli, ενώ τα αρχεία παραμένουν η πηγή αλήθειας.
SleekDB Κατάλληλο γιαΜια βάση δεδομένων εγγράφων επίπεδων αρχείων σε PHP, χωρίς εξαρτήσεις τρίτων, που αποθηκεύει δεδομένα χωρίς σχήμα ως απλά αρχεία JSON. Η γλώσσα ερωτημάτων API περιλαμβάνει συνδέσεις, αναζήτηση κειμένου, group by και having, καθώς και φίλτρα σε ένθετες ιδιότητες. Διαφορά με το StorhΤο storh συνδυάζει την αποθήκη εγγράφων του με ένα τμηματοποιημένο αρχείο καταγραφής μόνο προσθήκης και μια ουρά που βασίζεται σε αρχείο καταγραφής, όλα κάτω από μία ρίζα, και εκτελεί fsync σε κάθε εγγραφή προτού δηλώσει ότι αποθηκεύτηκε. Οι συνδέσεις δεν αποτελούν μέρος του storh· γι' αυτές, προωθεί συλλογές στο SQLite ή στο MySQL.

Ερωτήσεις και απαντήσεις

Σύντομες απαντήσεις από την τεκμηρίωση του Storh.

Ξεκινήστε με τον οδηγό γρήγορης εκκίνησης και, στη συνέχεια, χρησιμοποιήστε την ενότητα Επιλογή μηχανής για να αντιστοιχίσετε τα DocStore, SegmentedLog ή Queue στον φόρτο εργασίας σας.