Storh
Εγγραφές με προτεραιότητα στα αρχεία για PHP: έγγραφα JSONC, τμηματοποιημένα αρχεία καταγραφής μόνο προσθήκης και ουρές που βασίζονται σε αρχεία καταγραφής με αναγνωριστικά UUIDv7.
composer require storh/storhΤελευταία έκδοση v0.5.2 MIT PHP 8.2+
$pages = $docs
->query()
->where('kind')->eq('page')
->orderBy('title')
->limit(20)
->get();Στην πράξη
Η γρήγορη εκκίνηση σε δύο μέρη: ένα έγγραφο σε μια ρίζα αποθήκευσης και, δίπλα του, μια καταχώριση αρχείου καταγραφής και μια εργασία ουράς.
Μία ρίζα, τρεις μηχανές
Το 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());$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
Ένα αρχείο 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 σειριοποιεί τις μεταλλάξεις με κλείδωμα εγγραφής σε επίπεδο συλλογής, ενώ σε ταυτόχρονες εγγραφές στο ίδιο αναγνωριστικό υπερισχύει η τελευταία μετονομασία. Οι διεκδικήσεις εργασιών κλειδώνουν την ουρά, ώστε δύο εργαζόμενες διεργασίες να μην αναλάβουν την ίδια εργασία σε εκκρεμότητα.
Ναι. Οι αναγνώσεις δέχονται σχόλια και κόμματα μετά το τελευταίο στοιχείο, αλλά η επόμενη εγγραφή put() σε αυτό το αναγνωριστικό ξαναγράφει το αρχείο σε συμπαγή μορφή JSON και τα αφαιρεί. Με τη λειτουργία προσωρινής μνήμης TRUST, δεν εντοπίζονται αλλαγές σε αρχεία που γίνονται έξω από το storh.
Οι αναγνώσεις συγκεκριμένης εγγραφής βάσει αναγνωριστικού παραμένουν γρήγορες όσο το σύστημα αρχείων μπορεί να διαχειριστεί τον αριθμό αρχείων. Οι σαρώσεις πεδίων του DocStore χωρίς ευρετήριο επιβραδύνονται πέρα από περίπου 10k εγγραφές, επομένως δηλώστε ευρετήρια για τα πεδία στα οποία εφαρμόζετε φίλτρα. Οι σαρώσεις και οι αναγνώσεις εύρους στο τμηματοποιημένο αρχείο καταγραφής παραμένουν διαχειρίσιμες έως περίπου 1M εγγραφές.
Οι εγγραφές συγχρονίζονται στον δίσκο με fsync και δημοσιεύονται με ατομική μετονομασία, ενώ το εκ νέου άνοιγμα ενός αρχείου καταγραφής ή ουράς περικόπτει τα ημιτελή άκρα έως το τελευταίο επιβεβαιωμένο συμβάν. Η ανθεκτικότητα σε διακοπή ρεύματος εξακολουθεί να εξαρτάται από το αν το σύστημα αρχείων και οι επιλογές προσάρτησης τηρούν αυτούς τους συγχρονισμούς.
Όχι. Προωθήστε συλλογές στο SQLite ή στο MySQL με το SqlMirror για συνδέσεις, αναζήτηση και αναφορές. Οι ατομικές εγγραφές πολλών εγγραφών παραμένουν υπόθεση πραγματικής βάσης δεδομένων, ως συστήματος καταγραφής.
Όχι. Η ουρά δεν είναι αποθήκη εγγραφών γενικής χρήσης και το φορτίο μιας εργασίας απορρίπτεται μόλις αυτή ολοκληρωθεί.
Ξεκινήστε με τον οδηγό γρήγορης εκκίνησης και, στη συνέχεια, χρησιμοποιήστε την ενότητα Επιλογή μηχανής για να αντιστοιχίσετε τα DocStore, SegmentedLog ή Queue στον φόρτο εργασίας σας.