SafeStream: Ασφάλεια για Αρχεία
Το Nette SafeStream εγγυάται ότι κάθε ανάγνωση και εγγραφή σε ένα αρχείο είναι απομονωμένη. Αυτό σημαίνει ότι κανένα νήμα δεν θα αρχίσει να διαβάζει ένα αρχείο που δεν έχει ακόμα γραφτεί πλήρως, ή ότι πολλαπλά νήματα δεν θα αντικαταστήσουν το ίδιο αρχείο.
Εγκατάσταση:
composer require nette/safe-stream
Για τι είναι καλή;
Σε τι χρησιμεύουν στην πραγματικότητα οι απομονωμένες λειτουργίες; Ας ξεκινήσουμε με ένα απλό παράδειγμα που γράφει επανειλημμένα σε ένα αρχείο και στη συνέχεια διαβάζει την ίδια συμβολοσειρά από αυτό:
$s = str_repeat('Long String', 10000);
$counter = 1000;
while ($counter--) {
file_put_contents('file', $s); // γράψτε το
$readed = file_get_contents('file'); // να το διαβάσω
if ($s !== $readed) { // να το ελέγχεις
echo 'strings are different!';
}
}
Μπορεί να φαίνεται ότι το echo 'strings differ!'
δεν μπορεί να συμβεί
ποτέ. Το αντίθετο είναι αλήθεια. Δοκιμάστε να εκτελέσετε αυτό το
σενάριο σε δύο καρτέλες του προγράμματος περιήγησης ταυτόχρονα. Το
σφάλμα θα εμφανιστεί σχεδόν αμέσως.
Η μία από τις καρτέλες θα διαβάσει το αρχείο τη στιγμή που η άλλη δεν έχει προλάβει να το γράψει όλο, οπότε το περιεχόμενο δεν θα είναι πλήρες.
Επομένως, ο κώδικας δεν είναι ασφαλής αν εκτελεστεί πολλές φορές ταυτόχρονα (δηλαδή σε πολλαπλά νήματα). Κάτι που δεν είναι ασυνήθιστο στο διαδίκτυο, συχνά ένας διακομιστής ανταποκρίνεται σε μεγάλο αριθμό χρηστών ταυτόχρονα. Επομένως, η διασφάλιση ότι η εφαρμογή σας λειτουργεί αξιόπιστα ακόμη και όταν εκτελείται σε πολλαπλά νήματα (thread-safe) είναι πολύ σημαντική. Διαφορετικά, θα χαθούν δεδομένα και θα εμφανιστούν σφάλματα που είναι δύσκολο να εντοπιστούν.
Αλλά όπως μπορείτε να δείτε, οι εγγενείς λειτουργίες ανάγνωσης και εγγραφής αρχείων της PHP δεν είναι απομονωμένες και ατομικές.
Πώς να χρησιμοποιήσετε το SafeStream;
Το SafeStream δημιουργεί ένα ασφαλές πρωτόκολλο για την ανάγνωση και
εγγραφή αρχείων σε απομόνωση χρησιμοποιώντας τυπικές συναρτήσεις PHP.
Το μόνο που χρειάζεται να κάνετε είναι να καθορίσετε το nette.safe://
πριν από το όνομα του αρχείου:
file_put_contents('nette.safe://file', $s);
$s = file_get_contents('nette.safe://file');
Το SafeStream διασφαλίζει ότι το πολύ ένα νήμα μπορεί να γράψει στο αρχείο κάθε φορά. Τα άλλα νήματα περιμένουν στην ουρά. Εάν κανένα νήμα δεν γράφει, οποιοσδήποτε αριθμός νημάτων μπορεί να διαβάσει το αρχείο παράλληλα.
Όλες οι κοινές συναρτήσεις της PHP μπορούν να χρησιμοποιηθούν με το πρωτόκολλο, για παράδειγμα:
// 'r' σημαίνει ανοιχτό μόνο για ανάγνωση
$handle = fopen('nette.safe://file.txt', 'r');
$ini = parse_ini_file('nette.safe://translations.neon');