Συνεδρίες σε php 5. Πώς λειτουργούν οι συνεδρίες

Όπως είναι ήδη γνωστό, Πρωτόκολλο HTTPεπιτρέπει στις εφαρμογές Ιστού να δημιουργούν "συνεδρίες" - έναν διάλογο μεταξύ ενός πελάτη και ενός διακομιστή, και η κατάσταση αυτού του διαλόγου διατηρείται από αίτημα σε αίτημα.

Η γλώσσα PHP, που είναι κυρίως γλώσσα προγραμματισμού Ιστού, παρέχει τη δυνατότητα χρήσης του μηχανισμού συνεδρίας HTTP, αναλαμβάνοντας τις περισσότερες ανησυχίες κατά την οργάνωση και αποθήκευση δεδομένων συνεδρίας. Επιτρέψτε μου να σας υπενθυμίσω τι είναι απαραίτητο για να λειτουργήσει ο μηχανισμός συνεδρίας HTTP:

  • Ο διακομιστής πρέπει να δημιουργήσει έναν μοναδικό αριθμό συνεδρίας.
  • Ο αριθμός συνεδρίας πρέπει να μεταβιβαστεί στον πελάτη (συνήθως μέσω Cookies).
  • Ο διακομιστής πρέπει να μπορεί να αποθηκεύει δεδομένα περιόδου σύνδεσης σε αρχεία ή σε μια βάση δεδομένων, ώστε να είναι δυνατή η επαναφορά τους, γνωρίζοντας τον αριθμό συνεδρίας που στέλνει ο πελάτης στον διακομιστή σε επόμενα αιτήματα (επίσης μέσω Cookies).

Στην πραγματικότητα, η μόνη ενέργεια που χρειάζεται να γίνει σε ένα πρόγραμμα PHP για να αρχίσουν να περιστρέφονται τα γρανάζια του μηχανισμού συνεδρίας είναι να καλέσετε μια μεμονωμένη συνάρτηση: session_start(). Αυτή η λειτουργία κάνει όλα τα απαραίτητα πράγματα:

  • Ελέγχει εάν ο πελάτης έχει στείλει έναν ήδη υπάρχοντα αριθμό συνεδρίας στο Cookie ή στις παραμέτρους αιτήματος. Εάν ο πελάτης έστειλε έναν αριθμό συνεδρίας, τότε τα δεδομένα για αυτήν τη συνεδρία φορτώνονται από μια μόνιμη θέση αποθήκευσης (για παράδειγμα, ένα αρχείο) στη μνήμη και γίνονται διαθέσιμα στο πρόγραμμα μέσω του πίνακα $_SESSION. Εάν ο υπολογιστής-πελάτης δεν έστειλε έναν αριθμό συνεδρίας ή μια τέτοια περίοδος σύνδεσης δεν υπάρχει στον διακομιστή, δημιουργείται μια νέα περίοδος σύνδεσης με νέο αριθμό και τα δεδομένα της είναι επίσης διαθέσιμα μέσω του πίνακα $_SESSION, ο οποίος σε περίπτωση νέας συνεδρίας θα είναι άδεια. Ο αριθμός συνεδρίας που δημιουργήθηκε πρόσφατα τοποθετείται στο πεδίο κεφαλίδας της απόκρισης διακομιστή Set-Cookie.
  • Παρέχει αποθήκευση δεδομένων συνεδρίας. Αφού το πρόγραμμα PHP επεξεργαστεί το αίτημα, η τρέχουσα κατάσταση του πίνακα $_SESSION αποθηκεύεται σε μια μόνιμη θέση αποθήκευσης, έτσι ώστε να είναι ξανά διαθέσιμη την επόμενη φορά που θα το ζητήσει ο πελάτης.

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

Όταν επισκέπτεστε για πρώτη φορά αυτήν τη σελίδα, ο διακομιστής θα στείλει στο πρόγραμμα περιήγησης ένα cookie με τον αριθμό συνεδρίας:

Set-Cookie: PHPSESSID=4ftvca7jmmnm04q95r3sdsk6r6; μονοπάτι=/

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

Πιο ρεαλιστικό παράδειγμα: σύνδεση χρήστη

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

array("password" => "123", "title" => "Administrator",), "user" => array("password" => "qwe", "title" => "User",)) ; επιστροφή isset($users[$login]); $users[$login]: null; ) συνάρτηση getCurrentUser() ( $user = isset($_SESSION["user"]); $_SESSION["user"]: null; return $user; ) συνάρτηση setCurrentUser($user) ($_SESSION["user"] = $user ?>

Γειά σου,!
Σύνδεσμος1 Σύνδεσμος2

Πήγαινε έξωΔεν έχετε επισκεφτεί ακόμα τον ιστότοπο. Εισαγάγετε τη σύνδεση και τον κωδικό πρόσβασης:
Σύνδεση: Κωδικός πρόσβασης:

Αυτό το πρόγραμμα ζητά ένα login και έναν κωδικό πρόσβασης και μπορείτε να συνδεθείτε με τη σύνδεσή σας χρήστης, qweή διαχειριστής, 123 . Στον συνδεδεμένο χρήστη εμφανίζεται ένας χαιρετισμός. Κατά τη σύνδεση, εμφανίζεται ένα μήνυμα εάν το όνομα χρήστη ή ο κωδικός πρόσβασης δεν είναι σωστά.

Αφού καταφέρετε να αποκτήσετε πρόσβαση σε αυτόν τον «ιστότοπο», μπορείτε να κάνετε κλικ στους συνδέσμους (Σύνδεσμος1, Σύνδεσμος2), παραμένοντας συνδεδεμένος χρήστης.

Ποια δεδομένα μπορούν να αποθηκευτούν σε μια συνεδρία;

Από προεπιλογή, η PHP αποθηκεύει δεδομένα συνεδρίας σε ένα προσωρινό αρχείο ως κείμενο. Μπορείτε να το επαληθεύσετε κοιτάζοντας στον κατάλογο με το προσωρινό Αρχεία PHP. Αυτός ο κατάλογος καθορίζεται στο phpinfo() στην ενότητα Environment, TEMP. Σε αυτόν τον κατάλογο θα βρείτε αρχεία όπως το sess_ 4ftvca7jmmnm04q95r3sdsk6r6, όπου 4ftvca7jmmnm04q95r3sdsk6r6 είναι ο αριθμός περιόδου λειτουργίας που μεταβιβάστηκε στο Cookie. Ρίξτε μια ματιά σε αυτό το αρχείο: εάν εκτελέσατε το πρώτο παράδειγμα παραπάνω, τότε το αρχείο θα περιέχει κάτι σαν αυτό: "value|i:2;". Αυτό το κείμενο είναι μια σειριακή αναπαράσταση των περιεχομένων της συνεδρίας, η οποία αποθηκεύει μόνο μία μεταβλητή με έναν αριθμό.

Όλες οι τιμές που το πρόγραμμα PHP βάζει στη συνεδρία μέσω του πίνακα $_SESSION μετατρέπονται σε προβολή κειμένου, και στη συνέχεια εγγράφεται σε ένα αρχείο. Η διαδικασία μετατροπής μεταβλητών τιμών σε κείμενο ονομάζεται "σειριοποίηση". Έτσι, μπορείτε να βάλετε οποιαδήποτε δεδομένα που η PHP μπορεί να σειριοποιήσει σε μια περίοδο λειτουργίας.

Ευτυχώς, στην PHP μπορείτε να κάνετε σειριοποίηση όχι μόνο απλές τιμέςόπως αριθμοί και συμβολοσειρές, αλλά και πολύπλοκες δομές όπως πίνακες και αντικείμενα:

"; print_r($_SESSION); echo ""; $_SESSION["testArray"] = πίνακας(1, 2, 3, "ένα", "δύο", "τρία", "παιδί" => πίνακας(5, 6, 7),); $obj = νέο stdClass();

Αυτό το παράδειγμα θα γράψει τα ακόλουθα δεδομένα στο αρχείο συνεδρίας:

TestArray|a:7:(i:0;i:1;i:1;i:2;i:2;i:3;i:3;s:3:"ένα";i:4;s:3 :"δύο";i:5;s:5:"τρεις";s:5:"παιδί";a:3:(i:0;i:5;i:1;i:6;i:2; i:7;))testObject|O:8:"stdClass":2:(s:1:"x";i:1234;s:1:"y";i:4567;)

Αποθήκευση αντικειμένων σε μια συνεδρία

Όπως μπορείτε να δείτε, τα αντικείμενα μπορούν να αποθηκευτούν σε μια περίοδο λειτουργίας. Αλλά ταυτόχρονα, θα πρέπει να θυμάστε ότι όταν αποθηκεύετε αντικείμενα σε μια συνεδρία που παραπέμπουν με κάποιο τρόπο στις "σπιτικές" κλάσεις σας ή αντικείμενα που είναι παρουσίες των κλάσεων σας, είναι απαραίτητο να γίνει η δήλωση αυτών των κλάσεων πριν καλέσετε session_start( ). Δηλαδή, η PHP πρέπει να γνωρίζει την κλάση προτού συναντήσει αναφορά της κατά την αποσειροποίηση δεδομένων συνεδρίας.

Κατά την αποθήκευση αντικειμένων, υπάρχουν περιπτώσεις όπου η τυπική σειριοποίηση ενός αντικειμένου είναι, για κάποιο λόγο, απαράδεκτη ή εντελώς αδύνατη. Σε τέτοιες περιπτώσεις, μπορείτε να εφαρμόσετε τη σειριοποίηση με μη αυτόματο τρόπο δηλώνοντας τις μαγικές μεθόδους __sleep() και __wakeup() στην τάξη.

Παρεμπιπτόντως, η σειριοποίηση μπορεί επίσης να γίνει "χειροκίνητα" και δεν είναι απαραίτητη η αποθήκευση/φόρτωση δεδομένων συνεδρίας. Αυτό μπορεί να χρειαστεί όταν ορισμένα δεδομένα στην εφαρμογή πρέπει να αποθηκευτούν για χρήση αργότερα ή να μεταφερθούν μέσω του δικτύου. Οι συναρτήσεις που μπορούν να είναι χρήσιμες για σειριοποίηση/αποσειριοποίηση είναι οι serialize(), unserialize(), json_encode(), json_decode().

Τι δεν μπορεί να αποθηκευτεί σε μια περίοδο λειτουργίας;

Μια περίοδος λειτουργίας δεν μπορεί να αποθηκεύσει οτιδήποτε δεν μπορεί να σειριοποιηθεί. Ένα παράδειγμα μιας τέτοιας οντότητας θα ήταν οποιοσδήποτε πόρος PHP. Οι πόροι είναι συνδέσεις δικτύου, ανοιχτοί χειρισμοί αρχείων, συνδέσεις βάσης δεδομένων και ορισμένα άλλα αντικείμενα. Ένας πόρος στην PHP είναι μια αναφορά σε ένα εσωτερικό αντικείμενο στα έγκατα της PHP που δεν είναι άμεσα προσβάσιμο από το πρόγραμμα, αλλά το οποίο μπορεί να χειριστεί καλώντας διάφορες συναρτήσεις PHP. Ένα είδος «μαύρου κουτιού» του οποίου τα περιεχόμενα δεν μπορούν και δεν πρέπει να είναι σειριακά.

Επιπρόσθετα χαρακτηριστικά

Η PHP δίνει στον προγραμματιστή την ευκαιρία να εφαρμόσει τον δικό του τρόπο αποθήκευσης δεδομένων συνεδρίας, για παράδειγμα, σε μια βάση δεδομένων. Για να γίνει αυτό, είναι απαραίτητο να εφαρμόσετε λειτουργίες που θα αποθηκεύουν και θα φορτώνουν τα δεδομένα περιόδου λειτουργίας από μια μόνιμη θέση αποθήκευσης. Στη συνέχεια, πρέπει να ενημερώσετε την PHP για αυτές τις λειτουργίες καλώντας τη συνάρτηση session_set_save_handler.

Για να επιταχυνθεί η διαδικασία αποθήκευσης και φόρτωσης δεδομένων περιόδου λειτουργίας σε τοποθεσίες με υψηλή φόρτωση, μπορεί να χρησιμοποιηθεί ο διακομιστής Memcached, ο οποίος αποθηκεύει δεδομένα στη μνήμη. Η υποστήριξη για αυτήν τη μέθοδο αποθήκευσης περιόδων σύνδεσης είναι ενσωματωμένη στην PHP και διαμορφώνεται μέσω του αρχείου διαμόρφωσης php.ini.

Μπορείτε να ορίσετε το όνομα της παραμέτρου Cookie μέσω της οποίας μεταδίδεται ο αριθμός συνεδρίας, προσδιορίζοντας το όνομα, τη διάρκεια ζωής, τον τομέα και άλλες παραμέτρους.

Αυτές και πολλές άλλες επιλογές για τη ρύθμιση περιόδων σύνδεσης HTTP σε PHP είναι διαθέσιμες μέσω των συναρτήσεων session_*.

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

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

Κατ 'αρχήν, είναι πολύ εύκολο να φτιάξετε το δικό σας ανάλογο των συνεδριών, όχι τόσο λειτουργικό όσο αυτό που είναι ενσωματωμένο στην PHP, αλλά παρόμοια στην ουσία. Σε cookies και βάση δεδομένων.
Όταν ζητάμε ένα σενάριο, κοιτάμε αν ελήφθη ένα cookie με συγκεκριμένο όνομα. Εάν δεν υπάρχει cookie, τότε ορίστε το και γράψτε μια νέα γραμμή με δεδομένα χρήστη στη βάση δεδομένων. Εάν υπάρχει cookie, τότε διαβάζουμε τα δεδομένα από τη βάση δεδομένων. Με άλλο αίτημα διαγράφουμε παλιές εγγραφές από τη βάση δεδομένων και τώρα έχουμε έτοιμο μηχανισμό συνεδρίας. Δεν είναι καθόλου δύσκολο. Ωστόσο, υπάρχουν ορισμένες αποχρώσεις που καθιστούν προτιμότερη τη χρήση του ενσωματωμένου μηχανισμού συνεδρίας.

Εάν είναι ενεργοποιημένη μόνο η πρώτη, τότε κατά την έναρξη της συνεδρίας (κάθε κλήση session_start()) έχει οριστεί ένα cookie για τον πελάτη. Το πρόγραμμα περιήγησης επιστρέφει σωστά αυτό το cookie με κάθε επόμενο αίτημα και η PHP έχει ένα αναγνωριστικό περιόδου λειτουργίας. Τα προβλήματα ξεκινούν εάν το πρόγραμμα περιήγησης δεν επιστρέψει τα cookies. Σε αυτήν την περίπτωση, χωρίς να λαμβάνει ένα cookie με αναγνωριστικό, η PHP θα ξεκινά πάντα μια νέα περίοδο λειτουργίας και ο μηχανισμός δεν θα λειτουργεί.

Εάν είναι ενεργοποιημένο μόνο το δεύτερο, τότε το cookie δεν έχει οριστεί. Και αυτό συμβαίνει, για χάρη του οποίου, στην πραγματικότητα, αξίζει να χρησιμοποιήσετε τον ενσωματωμένο μηχανισμό συνεδρίας. Αφού το σενάριο κάνει τη δουλειά του και διαμορφωθεί πλήρως η σελίδα, η PHP σαρώνει ολόκληρη τη σελίδα και προσθέτει ένα αναγνωριστικό περιόδου λειτουργίας σε κάθε σύνδεσμο και σε κάθε φόρμα. Μοιάζει κάπως έτσι:
Δείκτηςμετατρέπεται σε
Δείκτης
και ένα κρυφό πεδίο προστίθεται στις φόρμες

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

Θεωρητικά, στις σπιτικές συνεδρίες μας για τα cookies και τη βάση δεδομένων, μπορούμε να εκχωρήσουμε με μη αυτόματο τρόπο τη μεταφορά αναγνωριστικού σε όλους τους συνδέσμους - και στη συνέχεια οι δικές μας συνεδρίες θα λειτουργούν ανεξάρτητα από τα cookies. Αλλά θα συμφωνήσετε - είναι πιο ευχάριστο όταν κάποιος άλλος κάνει αυτή τη δουλειά; ;-)

Από προεπιλογή, και οι δύο επιλογές είναι ενεργοποιημένες στις πρόσφατες εκδόσεις της PHP. Πώς το χειρίζεται αυτό η PHP; Ο μάγειρας εκτίθεται πάντα. Και οι σύνδεσμοι συμπληρώνονται αυτόματα μόνο εάν η PHP δεν εντόπισε ένα cookie με αναγνωριστικό περιόδου λειτουργίας. Όταν ένας χρήστης επισκέπτεται τον ιστότοπο για πρώτη φορά κατά τη διάρκεια αυτής της συνεδρίας, τοποθετείται ένα cookie και ολοκληρώνονται οι σύνδεσμοι. Στο επόμενο αίτημα, εάν υποστηρίζονται cookies, η PHP βλέπει το cookie και σταματά να συμπληρώνει συνδέσμους. Εάν τα cookies δεν λειτουργούν, τότε η PHP συνεχίζει να προσθέτει σωστά αναγνωριστικό σε συνδέσμους και η περίοδος λειτουργίας δεν χάνεται.
Οι χρήστες με ενεργοποιημένα cookie θα δουν τον μακρύ σύνδεσμο με το αναγνωριστικό μόνο μία φορά.

Φτου. Η μεταφορά ταυτότητας ολοκληρώθηκε.
Τώρα το μόνο που μένει είναι να συνδέσετε το αρχείο δεδομένων σε αυτό από την πλευρά του διακομιστή.
Η PHP θα το κάνει αυτό για εμάς. Φτάνει μόνο να γράφεις
session_start();
$_SESSION [ "test" ]= "Γεια σου κόσμο!" ;

Και η PHP θα γράψει τη μεταβλητή δοκιμής στο αρχείο που σχετίζεται με αυτήν την περίοδο λειτουργίας.
Εδώ υπάρχει μια πολύ σημαντική σημείωση.
Πίνακας $_SESSION- ειδικό.
Στην πραγματικότητα, περιέχει τις μεταβλητές που θέλουμε να κάνουμε διαθέσιμες σε διάφορα σενάρια.
Για να τοποθετήσετε μια μεταβλητή σε μια περίοδο λειτουργίας, απλώς αντιστοιχίστε την στο στοιχείο του πίνακα $_SESSION.
Για να λάβετε την τιμή του, απλώς αποκτήστε πρόσβαση στο ίδιο στοιχείο. Ένα παράδειγμα θα είναι παρακάτω.

Η PHP χειρίζεται επίσης τη συλλογή σκουπιδιών - αφαιρώντας παλιά αρχεία. Καθώς και κωδικοποίηση δεδομένων και ένα σωρό άλλα απαραίτητα πράγματα. Ως αποτέλεσμα αυτής της φροντίδας, η εργασία με συνεδρίες είναι πολύ απλή.
Εδώ φτάνουμε πραγματικά στο παράδειγμα του πώς λειτουργούν οι συνεδρίες.
Ένα πολύ μικρό παράδειγμα:
session_start();

ηχώ "Έχετε ενημερώσει αυτήν τη σελίδα". $_SESSION["counter"]++. " μια φορά. " ;
ηχώ "
ενημέρωση" ;
?>

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

Για να έχετε πρόσβαση σε μεταβλητές περιόδου λειτουργίας σε οποιεσδήποτε σελίδες του ιστότοπου, πρέπει να γράψετε ΜΟΝΟ ΜΙΑ (!) γραμμή στην αρχή ΚΑΘΕ αρχείου στο οποίο χρειαζόμαστε συνεδρίες:
session_start();
Στη συνέχεια, αποκτήστε πρόσβαση στα στοιχεία του πίνακα $_SESSION. Για παράδειγμα, ένας έλεγχος εξουσιοδότησης θα μοιάζει με αυτό:
session_start();
if ($_SESSION [ "εξουσιοδοτημένο" ]<> 1 ) {
header("Τοποθεσία: /auth.php");
έξοδος;
}

Αφαίρεση μεταβλητών από μια συνεδρία.
Εάν έχετε register_globals=off, τότε απλώς γράψτε
unset($_SESSION [ "var" ]);
Αν όχι, τότε κοντάΠρέπει να γράψω μαζί της
session_unregister("var");

Τα πιο συνηθισμένα σφάλματα που παράγει η PHP όταν προσπαθεί να εργαστεί με περιόδους λειτουργίας είναι τα ακόλουθα:
Δύο από αυτούς
Προειδοποίηση: Δεν είναι δυνατή η αποστολή cookie συνεδρίας - οι κεφαλίδες έχουν ήδη σταλεί
Προειδοποίηση: Δεν είναι δυνατή η αποστολή του περιοριστή προσωρινής μνήμης περιόδου λειτουργίας - οι κεφαλίδες έχουν ήδη σταλεί

που προκαλείται από τον ίδιο λόγο, η λύση περιγράφεται σε αυτό το νήμα
Τρίτος,
Προειδοποίηση: open(/tmp\sess_SID, O_RDWR) απέτυχε: Δεν υπάρχει τέτοιο αρχείο ή κατάλογος (2) στον αριθμό γραμμής full_script_path(προηγουμένως έμοιαζε Προειδοποίηση: Απέτυχε η εγγραφή δεδομένων περιόδου σύνδεσης (αρχεία). Επαληθεύστε ότι η τρέχουσα ρύθμιση του session.save_path είναι σωστή (/tmp)),
Εάν μεταφραστεί από τα αγγλικά, εξηγεί το πρόβλημα λεπτομερώς: η διαδρομή προς τον κατάλογο που καθορίζεται στο php.ini όπου είναι γραμμένα τα αρχεία συνεδρίας δεν είναι διαθέσιμη. Αυτό το σφάλμα είναι το πιο εύκολο να διορθωθεί. Απλώς καταχωρήστε έναν κατάλογο που υπάρχει και είναι εγγράψιμος, για παράδειγμα,
session.save_path = c:\windows\temp
Και μην ξεχάσετε να κάνετε επανεκκίνηση του Apache μετά από αυτό.

Όπως αποδεικνύεται, η ανθρώπινη νοημοσύνη δεν έχει όρια, και ως εκ τούτου αναγκάζομαι να εξηγήσω:
ένα μήνυμα σχετικά με το τρίτο σφάλμα (δεν μπορεί να βρεθεί ο κατάλογος) αναπόφευκτα θα οδηγήσει στην εμφάνιση των πρώτων δύο, καθώς το μήνυμα σφάλματος εξάγεται στο πρόγραμμα περιήγησης και στις κεφαλίδες αφού δεν μπορεί να χρησιμοποιηθεί. Επομένως, μην βιαστείτε να αναζητήσετε ένα πρόωρο συμπέρασμα, αλλά πρώτα σημειώστε το σωστό μονοπάτι!

Το επόμενο πιο κοινό πρόβλημα κατά την εργασία με συνεδρίες είναι η μεγάλη κληρονομιά του register_globals. ΜΗΝ δίνετε ονόματα μεταβλητών σεναρίων που ταιριάζουν με τους δείκτες του πίνακα $_SESSION!
Με register_globals=on οι τιμές θα αντικατασταθούν και θα μπερδευτείτε.
Και αν register_globals=off, θα εμφανιστεί ένα άλλο σφάλμα: "Το σενάριο σας βασίζεται πιθανώς σε μια παρενέργεια περιόδου λειτουργίας που υπήρχε μέχρι την PHP 4.2.3.", εάν το σενάριο έχει μια μεταβλητή περιόδου λειτουργίας που δεν έχει τιμή και μια καθολική μεταβλητή με ίδιο όνομα . Για να απαλλαγείτε από αυτό, πρέπει πάντα να αρχικοποιείτε τις μεταβλητές πριν από τη χρήση (ή τουλάχιστον να ελέγχετε την ύπαρξη) και να μην δίνετε ονόματα καθολικών μεταβλητών που συμπίπτουν με τα ευρετήρια του πίνακα $_SESSION.

Εάν δεν λειτουργεί, αλλά δεν εμφανίζονται μηνύματα, προσθέστε δύο γραμμές στην αρχή του σεναρίου που είναι υπεύθυνες για την εμφάνιση ΟΛΩΝ των σφαλμάτων στην οθόνη - είναι πολύ πιθανό να υπάρχουν σφάλματα, αλλά απλά να μην τα βλέπετε.
ini_set("display_errors" , 1 );
error_reporting(E_ALL);

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

Εάν είστε βέβαιοι ότι δεν υπάρχουν σφάλματα, αλλά το παράδειγμα που δίνεται δεν λειτουργεί ούτως ή άλλως, τότε ίσως η PHP να μην επιτρέπει τη διέλευση του αναγνωριστικού μέσω URL, και τα cookies για κάποιο λόγο δεν λειτουργούν.
Δείτε τι συμβαίνει με τα cookies σας.
Γενικά, εάν οι συνεδρίες σας δεν λειτουργούν, τότε δοκιμάστε πρώτα να μεταβιβάσετε το αναγνωριστικό περιόδου λειτουργίας με μη αυτόματο τρόπο, δηλαδή δημιουργήστε έναν σύνδεσμο και εκχωρήστε ένα αναγνωριστικό σε αυτό:
session_start();
if (!isset($_SESSION [ "counter" ])) $_SESSION [ "counter" ]= 0 ;
ηχώ "Έχετε ενημερώσει αυτήν τη σελίδα". $_SESSION["counter"]++. " μια φορά.

ενημέρωση" ;
?>

Ωστόσο, θα πρέπει να βεβαιωθείτε ότι η οδηγία session.use_only_cookies δεν είναι ενεργοποιημένη, γεγονός που εμποδίζει την PHP να αποδεχτεί το αναγνωριστικό περιόδου σύνδεσης εάν μεταβιβάστηκε μέσω διεύθυνσης URL

Εάν αυτό το παράδειγμα δεν λειτουργεί, τότε το πρόβλημα είναι είτε ασήμαντο τυπογραφικά λάθη(τα μισά από τα "προβλήματα" με τις περιόδους λειτουργίας προέρχονται από ένα ανορθόγραφο όνομα μεταβλητής) ή σε μια πολύ παλιά έκδοση της PHP: η υποστήριξη για περιόδους λειτουργίας εμφανίστηκε στην έκδοση 4.0 και ο πίνακας $_SESSION- σε 4.1 (Πριν από αυτό χρησιμοποιήθηκε $HTTP_SESSION_VARS).
Εάν λειτουργεί, τότε το πρόβλημα είναι στα cookies. Παρακολουθήστε τι είδους cookie ορίζει ο διακομιστής στο πρόγραμμα περιήγησης και εάν το πρόγραμμα περιήγησης το επιστρέφει. Είναι πολύ χρήσιμο να κάνετε αναζήτηση κοιτάζοντας την ανταλλαγή κεφαλίδων HTTP μεταξύ του προγράμματος περιήγησης και του διακομιστή.
Μια εξήγηση του τρόπου λειτουργίας των cookie ξεφεύγει από το πεδίο αυτού του ήδη υπερβολικά μεγάλου κειμένου, αλλά τουλάχιστον βεβαιωθείτε ότι ο διακομιστής στέλνει ένα cookie με ένα αναγνωριστικό και το πρόγραμμα περιήγησης το επιστρέφει. Και ταυτόχρονα τα αναγνωριστικά συμπίπτουν μεταξύ τους =)
Η ρύθμιση του cookie θα πρέπει να μοιάζει
Set-Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6;
ή πώς
Set-Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6; μονοπάτι=/
(αν ζητάτε το σενάριο όχι από τον ριζικό κατάλογο)
Η απόκριση του διακομιστή θα πρέπει να μοιάζει
Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6
ή
Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6; b=b
εάν το πρόγραμμα περιήγησης επιστρέφει cookie εκτός από το αναγνωριστικό περιόδου σύνδεσης.

Εάν το πρόγραμμα περιήγησης δεν επιστρέφει cookies, ελέγξτε εάν τα cookies λειτουργούν καθόλου.
Βεβαιωθείτε ότι ο τομέας στον οποίο αποκτάτε πρόσβαση έχει ένα κανονικό όνομα (με τουλάχιστον μία τελεία και χωρίς παράνομους χαρακτήρες όπως υπογράμμιση) και διαγράψτε την προσωρινή μνήμη του προγράμματος περιήγησής σας - αυτοί είναι δύο κύριοι λόγοι για τους οποίους τα cookie ενδέχεται να μην λειτουργούν.

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

Ένα άλλο πρόβλημα μπορεί να προκύψει εάν χρησιμοποιείτε ανακατεύθυνση κεφαλίδας ή πλοήγηση JavaScript.
Το γεγονός είναι ότι η PHP προσθέτει αυτόματα το αναγνωριστικό περιόδου λειτουργίας μόνο σε συνδέσμους όπως
, αλλά δεν το κάνει αυτό για κεφαλίδες, JavaScript, μετα-ετικέτες.
Επομένως, πρέπει να προσθέσετε το αναγνωριστικό με μη αυτόματο τρόπο, για παράδειγμα, ως εξής:
header("Τοποθεσία: /script.php?" . session_name(). "=" . session_id());

Επίσης, ένα πολύ σπάνιο πρόβλημα, και είναι εντελώς ασαφές από πού προέρχεται, είναι ότι η ρύθμιση session.save_handler έχει μια τιμή διαφορετική από τα αρχεία. Αν δεν είναι έτσι, διορθώστε το.

Ασφάλεια
Η ασφάλεια της συνεδρίας είναι ένα ευρύ θέμα. Ως εκ τούτου, θα επικεντρωθώ σε μερικά βασικά σημεία.
Το πιο διδακτικό βιβλίο είναι να μην περάσει το αναγνωριστικό από τη γραμμή διευθύνσεων. Αυτό είναι γραμμένο ακόμη και στο php.ini, αλλά αυτό περιορίζει τη λειτουργικότητα των συνεδριών. Εάν αποφασίσετε να ακολουθήσετε αυτήν τη συμβουλή, τότε εκτός από session.use_trans_sid = 0, μην ξεχάσετε session.use_only_cookies = 1
Συνιστάται να συνδέσετε τη συνεδρία σε μια διεύθυνση IP: με αυτόν τον τρόπο, εάν το αναγνωριστικό κλαπεί, ο κακός δεν θα μπορεί να το χρησιμοποιήσει στις περισσότερες περιπτώσεις.
Συνιστάται να χρησιμοποιήσετε την οδηγία session.save_path, η οποία σας επιτρέπει να ορίσετε τον δικό σας κατάλογο για την αποθήκευση αρχείων συνεδρίας. Αυτό είναι πιο ασφαλές από την αποθήκευσή τους στον προεπιλεγμένο κοινόχρηστο προσωρινό κατάλογο του διακομιστή.

Επιπλέον πληροφορίες:

  • Εκτός από τα cookies, ο μηχανισμός περιόδου λειτουργίας στέλνει επίσης κεφαλίδες που απαγορεύουν την προσωρινή αποθήκευση σελίδων (ο ίδιος περιοριστής προσωρινής μνήμης). Για html αυτό είναι σωστό και απαραίτητο. Αλλά όταν προσπαθείτε να στείλετε ένα αρχείο χρησιμοποιώντας μια δέσμη ενεργειών που ελέγχει την εξουσιοδότηση, ο Internet Explorer αρνείται να το κατεβάσει. Είναι λόγω αυτού του τίτλου. Κλήση
    session_cache_limiter("ιδιωτικό");
    πρέπει να λύσει το πρόβλημα πριν ξεκινήσει η συνεδρία.
  • Όσο περίεργο κι αν φαίνεται, αλλά στη συστοιχία $_SESSIONΔεν μπορείτε να χρησιμοποιήσετε αριθμητικά ευρετήρια - $_SESSION [ 1 ], $_SESSION [ "10" ]- οι συνεδρίες δεν θα λειτουργήσουν.
  • Κάπου μεταξύ των εκδόσεων 4.2 και 5.0 δεν ήταν δυνατό να οριστεί το session.use_trans_sid χρησιμοποιώντας ini_set(). Ξεκινώντας από το 5.0 είναι ήδη δυνατό ξανά.
  • Πριν από την έκδοση 4.3.3 του cookie, η PHP έστελνε ένα cookie μόνο εάν δεν υπήρχε αναγνωριστικό στο αίτημα κατά την έναρξη της περιόδου λειτουργίας. Τώρα αποστέλλεται ένα cookie σε κάθε κλήση session_start()

    Παράδειγμα εξουσιοδότησης με χρήση συνεδριών
    Ας επεξηγήσουμε όλα τα παραπάνω με ένα μικρό παράδειγμα:
    Ας δημιουργήσουμε το αρχείο auth.php:
    if (isset($_POST [ "auth_name" ]))
    {
    $sql = "SELECT * FROM users WHERE name=?s";
    $row = $db -> getRow($sql, $_POST["auth_name"]);
    if ($row && password_verify ($_POST [ "auth_pass" ], $row [ "pass" ])) (
    $_SESSION [ "user_id" ] = $σειρά [ "id" ];
    }
    header("Τοποθεσία: http://" . $_SERVER [ "HTTP_HOST" ]. $_SERVER [ "REQUEST_URI" ]);
    έξοδος;
    }

    if (isset($_GET [ "action" ]) AND $_GET [ "action" ]== "logout" ) (
    session_start();
    session_destroy();
    header("Τοποθεσία: http://" . $_SERVER [ "HTTP_HOST" ]. "/" );
    έξοδος;
    }

    if (!isset($_SESSION [ "user_id" ])) (
    ?>








    έξοδος;
    }

    Τώρα το μόνο που χρειάζεται να κάνετε είναι να γράψετε τη γραμμή σε όλα τα προστατευμένα σενάρια
    απαιτούν "auth.php" ;
    Αυτό το παράδειγμα προϋποθέτει ότι η περίοδος λειτουργίας έχει ήδη ξεκινήσει και έχει δημιουργηθεί μια σύνδεση με τη βάση δεδομένων χρησιμοποιώντας την Κλάση για ασφαλή και άνετη εργασία με τη MySQL. Υποθέτει επίσης ότι ο κωδικός πρόσβασης έχει κατακερματιστεί χρησιμοποιώντας τη συνιστώμενη συνάρτηση password_hash.
    Παράδειγμα προστατευμένου αρχείου:

    session_start();
    συμπεριλάβετε το "safemysql.class.php" ;
    $db = new safemysql ([ "db" => "δοκιμή" ]);
    συμπεριλάβετε "auth.php" ;
    ?>
    μυστικό

    Αποσύνδεση

    OPS! Πολύ χρήσιμοι σύνδεσμοι:
    http://www.php.net/manual/ru/ref.session.php - οι πιο πρόσφατες και πιο πρόσφατες πληροφορίες σχετικά με την υποστήριξη περιόδου λειτουργίας στην PHP στην επίσημη τεκμηρίωση, καθώς και πολλά σχόλια χρηστών. Συνιστάται ιδιαίτερα ανάγνωση.
    http://phpclub.ru/manrus/f/ref.session.html - Μια ΠΟΛΥ ξεπερασμένη μετάφραση αυτού του κεφαλαίου στα ρωσικά, από την τεκμηρίωση που μεταφράστηκε από τον Alexander Pyramidin.
    http://phpclub.ru/detail/article/sessions
    Ένα άρθρο με τον αξιοθρήνητο τίτλο «The Truth about Sessions». Αφήνει αμφίθυμη εντύπωση. Στην αρχή, ο συγγραφέας μιλάει ΠΟΛΥ καθαρά για τον μηχανισμό συνεδρίας, αλλά οι μέθοδοι που προσφέρει μέχρι το τέλος του άρθρου είναι εντελώς ασαφείς.

    Ένα άρθρο σχολικού βιβλίου από τον Ντμίτρι Μποροντίν από τον ιστότοπο
    Το http://php.spb.ru/ ΔΕΝ συνιστάται ανεπιφύλακτα.
    Παιδιά, είναι τρομερά ξεπερασμένο. Όχι μόνο περιέχει πραγματικές ανακρίβειες, αλλά οι περίοδοι λειτουργίας στην PHP απλά δεν έχουν λειτουργήσει για μεγάλο χρονικό διάστημα.
    Ευχαριστώ πολύ τον Dima για αυτό, αυτό ήταν το πρώτο άρθρο σχετικά με τις συνεδρίες στα ρωσικά, το μελέτησα ο ίδιος, αλλά τώρα πρέπει να το στείλω σε μια άξια ανάπαυσης.
    Επίσης, δυστυχώς, πολλά άλλα άρθρα που υπάρχουν στο Διαδίκτυο και δεν έχουν ενημερωθεί εδώ και χρόνια είναι επίσης ξεπερασμένα.

  • Δημιουργία συνεδρίας

    Το πρώτο πράγμα που πρέπει να κάνετε για να εργαστείτε με συνεδρίες (εάν έχουν ήδη ρυθμιστεί από τον διαχειριστή του διακομιστή) είναι να εκκινήσετε τον μηχανισμό συνεδρίας. Εάν στις ρυθμίσεις διακομιστή η μεταβλητή session.auto_start έχει οριστεί σε "0" (εάν session.auto_start=1, τότε οι συνεδρίες ξεκινούν αυτόματα), τότε οποιοδήποτε σενάριο στο οποίο πρέπει να χρησιμοποιήσετε δεδομένα περιόδου σύνδεσης πρέπει να ξεκινά με την εντολή

    Session_start();

    Με τη λήψη μιας τέτοιας εντολής, ο διακομιστής δημιουργεί μια νέα συνεδρία ή επαναφέρει την τρέχουσα, με βάση το αναγνωριστικό περιόδου λειτουργίας που μεταβιβάστηκε στο αίτημα. Πώς γίνεται; Ο διερμηνέας PHP αναζητά τη μεταβλητή που αποθηκεύει το αναγνωριστικό περιόδου σύνδεσης (PHPSESSID από προεπιλογή) πρώτα στα cookie και μετά σε μεταβλητές που μεταβιβάζονται χρησιμοποιώντας αιτήματα POST και GET. Εάν βρεθεί το αναγνωριστικό, ο χρήστης θεωρείται αναγνωρισμένος, αντικαθίστανται όλες οι διευθύνσεις URL και ορίζονται cookies. Διαφορετικά, ο χρήστης θεωρείται νέος, δημιουργείται ένα νέο μοναδικό αναγνωριστικό για αυτόν, στη συνέχεια αντικαθίσταται η διεύθυνση URL και ορίζονται cookies.

    Η εντολή session_start() πρέπει να καλείται σε όλα τα σενάρια στα οποία πρόκειται να χρησιμοποιηθούν μεταβλητές περιόδου λειτουργίας και πριν εξάγονται δεδομένα στο πρόγραμμα περιήγησης. Αυτό οφείλεται στο γεγονός ότι τα cookies ρυθμίζονται μόνο πριν από την εμφάνιση πληροφοριών στην οθόνη.

    Μπορείτε να λάβετε το τρέχον αναγνωριστικό συνεδρίας χρησιμοποιώντας τη συνάρτηση session_id().

    Για λόγους σαφήνειας, μπορείτε να ορίσετε το όνομα της συνεδρίας χρησιμοποιώντας τη συνάρτηση session_name([session_name]).

    Αυτό πρέπει να γίνει πριν από την προετοιμασία της συνεδρίας. Μπορείτε να πάρετε το όνομα της τρέχουσας συνεδρίας χρησιμοποιώντας την ίδια συνάρτηση, που καλείται χωρίς παραμέτρους: session_name();

    Παράδειγμα. Δημιουργία συνεδρίας

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

    session_start();
    // δημιουργία νέας συνεδρίας ή
    // επαναφορά της τρέχουσας echo session_id();
    ?>

    Η αρχική μου σελίδα
    ... // αρχική σελίδα

    echo session_name();
    // εμφάνιση του ονόματος της τρέχουσας συνεδρίας.
    // Σε αυτή την περίπτωση είναι PHPSESSID
    ?>

    Εάν κάνετε το ίδιο με το αρχείο autorize.php, τότε οι τιμές των μεταβλητών εξόδου (αναγνωριστικό περιόδου λειτουργίας και το όνομά του) θα είναι οι ίδιες αν μεταβείτε σε αυτό από το index.php και δεν κλείσετε πρώτα το παράθυρο του προγράμματος περιήγησης ( τότε το αναγνωριστικό περιόδου λειτουργίας θα αλλάξει).

    Καταχώρηση μεταβλητών συνεδρίας

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

    Για να το πετύχετε αυτό, χρειάζεται απλώς να καταχωρήσετε τις μεταβλητές σας:

    Session_register(variable_name1,
    variable_name2, ...);

    Σημειώστε ότι δεν είναι οι τιμές που καταγράφονται, αλλά τα ονόματα των μεταβλητών. Αρκεί να καταχωρήσετε μια μεταβλητή μία φορά σε οποιαδήποτε σελίδα όπου χρησιμοποιούνται περίοδοι λειτουργίας. Τα ονόματα των μεταβλητών περνούν στη session_register() χωρίς το σύμβολο $.

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

    Μπορείτε επίσης να καταχωρήσετε μια μεταβλητή γράφοντας απλώς την τιμή της στον συσχετιστικό πίνακα $_SESSION, δηλ. έχοντας γράψει

    $_SESSION["variable_name"] =
    "variable_value";

    Αυτός ο πίνακας αποθηκεύει όλες τις καταχωρημένες (δηλαδή καθολικές) μεταβλητές περιόδου λειτουργίας.

    Η πρόσβαση σε αυτές τις μεταβλητές γίνεται χρησιμοποιώντας τον πίνακα $_SESSION["variable_name"] (ή $HTTP_SESSION_VARS["variable_name"] για PHP 4.0.6 και παλαιότερες εκδόσεις).

    Εάν η επιλογή register_globals είναι ενεργοποιημένη στις ρυθμίσεις PHP, τότε οι μεταβλητές περιόδου λειτουργίας μπορούν επίσης να προσπελαστούν ως κανονικές μεταβλητές, για παράδειγμα: $variable_name.

    Εάν register_globals=off (απενεργοποιημένο), τότε δεν μπορείτε να χρησιμοποιήσετε τη session_register() για να καταχωρήσετε μεταβλητές που περνούν από τις μεθόδους POST ή GET, π.χ. απλά δεν λειτουργεί. Γενικά, δεν συνιστάται η ταυτόχρονη χρήση και των δύο μεθόδων εγγραφής μεταβλητών, $_SESSION και session_register().

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

    session_start();
    // δημιουργία νέας συνεδρίας ή
    // επαναφέρετε το τρέχον if (!isset($_GET["go"]))(
    ηχώ "


    Σύνδεση:
    Κωδικός πρόσβασης: name=passwd>

    ";
    )άλλο (
    $_SESSION["login"]=$_GET["login"];
    // καταχωρήστε τη μεταβλητή σύνδεσης
    $_SESSION["passwd"]=$_GET["passwd"];
    // καταχωρήστε τη μεταβλητή passwd
    // τώρα η σύνδεση και ο κωδικός πρόσβασης είναι καθολικοί
    // μεταβλητές για αυτήν την περίοδο λειτουργίας
    εάν ($_GET["login"]=="pit" &&
    $_GET["passwd"]=="123") (
    Header("Τοποθεσία: secret_info.php");
    // ανακατεύθυνση στη σελίδα
    // secret_info.php
    )else echo "Μη έγκυρη εισαγωγή,
    προσπάθησε ξανά
    ";
    }
    print_r($_SESSION);
    ?>

    Τώρα, έχοντας φτάσει στη σελίδα secret_info.php και σε οποιαδήποτε άλλη σελίδα του ιστότοπου, θα μπορούμε να εργαστούμε με το όνομα χρήστη και τον κωδικό πρόσβασης που έχει εισαγάγει ο χρήστης, τα οποία θα αποθηκευτούν στον πίνακα $_SESSION. Έτσι, εάν αλλάξετε τον κωδικό της μυστικής σελίδας (σημειώστε ότι τη μετονομάσαμε secret_info.php) ως εξής:

    session_start();
    // δημιουργία νέας συνεδρίας ή
    // εμφάνιση όλων των μεταβλητών συνεδρίας
    ?>

    Μυστικές πληροφορίες

    Εδώ θέλω να μοιραστώ μυστικά με τη φίλη μου την Petya.



    Στη συνέχεια, θα λάβουμε τα ακόλουθα στο πρόγραμμα περιήγησης στη μυστική σελίδα:

    Πίνακας ( => pit => 123)
    Εδώ θέλω να μοιραστώ μυστικά με τη φίλη μου την Petya.

    Ως αποτέλεσμα, λαμβάνουμε μια λίστα με μεταβλητές που είναι καταχωρημένες στο authorize.php και, στην πραγματικότητα, την ίδια τη μυστική σελίδα.

    Τι μας δίνει αυτό; Ας πούμε ότι ένας χάκερ θέλει να διαβάσει τα μυστικά της Βάσια και της Πέτυα. Και με κάποιο τρόπο ανακάλυψε το όνομα της μυστικής σελίδας (ή σελίδων).

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

    session_start();
    // δημιουργία νέας συνεδρίας ή
    // επαναφορά του τρέχοντος print_r($_SESSION);
    // εμφάνιση όλων των μεταβλητών συνεδρίας αν (!($_SESSION["login"]=="pit" &&
    $_SESSION["passwd"]==123))
    // έλεγχος για ορθότητα
    // κωδικός σύνδεσης
    Header("Τοποθεσία: authorize.php");
    // εάν υπάρχει σφάλμα, τότε ανακατεύθυνση σε
    // σελίδα σύνδεσης
    ?>

    Μυστικές πληροφορίες
    ... // βρίσκεται εδώ
    //μυστικές πληροφορίες :)

    Κατάργηση μεταβλητών περιόδου λειτουργίας

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

    Η συνάρτηση session_unregister(variable_name) αφαιρεί μια καθολική μεταβλητή από την τρέχουσα περίοδο λειτουργίας (δηλαδή, την καταργεί από τη λίστα των καταχωρημένων μεταβλητών).

    Εάν η εγγραφή πραγματοποιήθηκε χρησιμοποιώντας $_SESSION ($HTTP_SESSION_VARS για PHP 4.0.6 και παλαιότερη), τότε χρησιμοποιείται η κατασκευή γλώσσας unset(). Δεν επιστρέφει καμία τιμή, αλλά απλώς καταστρέφει τις καθορισμένες μεταβλητές.

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

    Παράδειγμα 1. Καταστροφή μεταβλητών συνεδρίας

    Προσθέστε μια γραμμή στο αρχείο secret_info.php για πρόσβαση στην κύρια σελίδα:

    // ... κώδικας php
    ?>

    Μυστικές πληροφορίες
    ... // βρίσκεται εδώ
    // μυστικές πληροφορίες :)
    Προς κύρια

    Στο Index.php θα διαγράψουμε τη σύνδεση και τον κωδικό πρόσβασης που εισαγάγατε νωρίτερα:

    session_start();
    session_unregister("passwd");
    // καταστροφή του κωδικού πρόσβασης που δεν έχει οριστεί($_SESSION["login"]);
    // καταστροφή loginprint_r($_SESSION);
    // εμφάνιση μεταβλητών καθολικής περιόδου λειτουργίας
    ?>

    Η αρχική μου σελίδα
    ... // αρχική σελίδα

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

    Για να επαναφέρετε τις τιμές όλων των μεταβλητών συνεδρίας, μπορείτε να χρησιμοποιήσετε τη συνάρτηση session_unset().

    Μπορείτε να καταστρέψετε ολόκληρη την τρέχουσα συνεδρία χρησιμοποιώντας την εντολή session_destroy().

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

    session_start(); // αρχικοποίηση της συνεδρίας $test = "Μεταβλητή περιόδου λειτουργίας";
    $_SESSION["test"]= $test;
    // καταχωρήστε τη μεταβλητή $test.
    // if register_globals=on,
    // τότε μπορούμε να χρησιμοποιήσουμε
    // session_register("test");

    print_r($_SESSION);
    // εμφάνιση όλων των καθολικών μεταβλητών
    echo session_id();
    // εμφάνιση του αναγνωριστικού περιόδου λειτουργίας
    ηχώ "


    ";
    session_unset();
    // καταστρέψει όλες τις παγκόσμιες
    // μεταβλητές περιόδου λειτουργίαςsprint_r($_SESSION);
    echo session_id();
    ηχώ "
    ";
    session_destroy(); // καταστροφή της συνεδρίας print_r($_SESSION);
    echo session_id();
    ?>

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

    Οι περίοδοι σύνδεσης στην PHP ή ως δεδομένα σχετικά με έναν χρήστη ή πελάτη που επισκέπτεται έναν ιστότοπο αποθηκεύονται όταν μετακινούνται μεταξύ σελίδων ενός ιστότοπου χωρίς μεγάλη δυσκολία. Το μάθημα είναι πολύ σημαντικό. Σχετικό για τη δημιουργία του 95% των ιστότοπων.

    Τι είναι μια συνεδρία σε php

    Οι περίοδοι λειτουργίας χρησιμοποιούνται για την αποθήκευση προσωρινών δεδομένων (για παράδειγμα, ότι ένας χρήστης έχει επισκεφτεί έναν ιστότοπο) κατά την πλοήγηση μεταξύ σελίδων του ίδιου ιστότοπου. Όταν χρησιμοποιείτε περιόδους λειτουργίας, τα δεδομένα αποθηκεύονται σε προσωρινά αρχεία στο διακομιστή.
    Τις περισσότερες φορές, οι περίοδοι σύνδεσης (και τα cookies επίσης) χρησιμοποιούνται κατά τη δημιουργία ηλεκτρονικών καταστημάτων, φόρουμ, πινάκων μηνυμάτων, κοινωνικών δικτύων, ιστολογίων και άλλων πόρων. Η ευκολία του συστήματος συνεδρίας είναι να αποθηκεύει προσωρινές πληροφορίες του συνδεδεμένου χρήστη/πελάτη, τα δεδομένα για τα οποία είναι γρήγορα προσβάσιμα για ορισμένο χρονικό διάστημα. Η συνεδρία έχει μια φυσική ημερομηνία λήξης - μέχρι να κλείσει το πρόγραμμα περιήγησης. Εάν κλείσετε μόνο τη σελίδα, τότε όταν ανοίξετε τον ιστότοπο, τα δεδομένα σχετικά με τον χρήστη/πελάτη θα εξακολουθούν να είναι διαθέσιμα.

    Λογική συνεδρίας

    Το Session (ή session) είναι ένα είδος προσωρινής αποθήκευσης δεδομένων. Σας προειδοποιώ αμέσως ότι αξίζει τον κόπο να αποθηκεύσετε μια μικρή ποσότητα δεδομένων. Για παράδειγμα, η σύνδεση και ο κωδικός πρόσβασης του επισκέπτη χρήστη ή ο σειριακός αριθμός του στη βάση δεδομένων.

    Παράδειγμα εργασίας
    1. Ο χρήστης εισάγει το login και τον κωδικό πρόσβασής του και μπαίνει στον ιστότοπο
    2. Τα δεδομένα με σύνδεση και κωδικό πρόσβασης αποθηκεύονται σε μια περίοδο λειτουργίας μιας από τις σελίδες του ιστότοπου:

    Αρχείο index.php

    Session_start(); // Κάθε αρχείο στο οποίο θέλετε να χρησιμοποιήσετε δεδομένα συνεδρίας πρέπει να περιέχει μια εντολή "start session" στην αρχή του κώδικα

    $login = "admin";
    $password = "pass";
    $_SESSION["login"] = $login; // αποθήκευση μεταβλητής που περιέχει login
    $_SESSION ["password"] = $password; // αποθηκεύστε μια μεταβλητή που περιέχει τον κωδικό πρόσβασης

    3. Όταν μεταβείτε σε άλλη σελίδα του ιστότοπου, αυτά τα δεδομένα θα είναι επίσης διαθέσιμα:

    Αρχείο παράδειγμα.php(ή οποιαδήποτε άλλη σελίδα)

    Echo "Η σύνδεσή σας ".$_SESSION["login"]; // θα εμφανίσει "Η σύνδεσή σας είναι διαχειριστής", αν και δεν καταγράψαμε δεδομένα σε αυτήν τη σελίδα!
    Δείτε, είναι απλό!

    4. Εάν θέλετε να διαγράψετε τα δεδομένα περιόδου σύνδεσης, τότε το μόνο που χρειάζεται να κάνετε είναι:

    Αρχείο παράδειγμα.php

    Session_start(); // "Έναρξη της συνεδρίας" ξανά

    Unset($_SESSION["login"]); // έτσι η μεταβλητή δεν καταχωρήθηκε ή "καταστράφηκε"
    echo "Η σύνδεσή σας ".$_SESSION["login"]; // θα εμφανίσει "Η σύνδεσή σας". Αφού το καταστρέψαμε στην τελευταία γραμμή, δεν υπάρχουν στοιχεία

    Session_destroy(); // καταστροφή της συνεδρίας. Όλα τα δεδομένα, συμπεριλαμβανομένου του $_SESSION["password"] δεν υπάρχουν πλέον. Όταν τα ζητήσετε, θα εμφανιστεί ένα σφάλμα
    Γενικά, μια τέτοια μεταφορά είναι παρόμοια με τη μέθοδο POST, αλλά δεν χρειάζεται πλέον να γράφετε πολύ περιττό κώδικα και όλα τα δεδομένα που μεταφέρονται από σελίδα σε σελίδα αποθηκεύονται σε προσωρινά αρχεία στο διακομιστή. Επαναλαμβάνω, οι συνεδρίες πρέπει να περιέχουν μικρές ποσότητες δεδομένων, επομένως είναι κατάλληλες για αποθήκευση στοιχείων σύνδεσης/κωδικού πρόσβασης, καλαθιού αγορών και άλλων μικρών τόμων.

    Μεταβίβαση τιμής ή πίνακα χρησιμοποιώντας μια περίοδο λειτουργίας PHP

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

    Χρησιμοποιούμε ξανά μια συγκεκριμένη αρχική σελίδα index.php

    Session_start();

    $r = πίνακας("ένα", "δύο", "τρία");

    $_SESSION["arr"] = $r;

    Στη σελίδα όπου θα εμφανίζονται τα πάντα
    Αποθηκεύσαμε τα δεδομένα στη συνεδρία και ακολουθούμε τον σύνδεσμο σε άλλη σελίδα, όπου θα εμφανίσουμε όλα τα δεδομένα.

    Αρχείο προορισμού, σελίδα test.phpόπου ανοίγουμε τον πίνακα

    Session_start();
    print_r($_SESSION["arr"]);
    // θα εκτυπώσει
    /*
    Πίνακας
    => ένα
    => δύο
    => τρία
    */
    ?>
    Ίσως θέλετε να ανανεώσετε το μάθημα στις . Γενικά, όλα πρέπει να είναι ξεκάθαρα.

    Άλλες λειτουργίες για εργασία με συνεδρίες

    session_unregister(string)- η συνεδρία ξεχνά την τιμή της καθορισμένης καθολικής μεταβλητής.
    session_destroy()- η συνεδρία καταστρέφεται (για παράδειγμα, εάν ο χρήστης έφυγε από το σύστημα κάνοντας κλικ στο κουμπί εξόδου).
    session_set_cookie_params(διάρκεια ζωής int [, διαδρομή συμβολοσειράς [, τομέας συμβολοσειράς]])- χρησιμοποιώντας αυτήν τη συνάρτηση, μπορείτε να ορίσετε πόσο θα διαρκεί μια περίοδος λειτουργίας, ορίζοντας ένα unix_timestamp που καθορίζει το χρόνο θανάτου της συνεδρίας.

    Λίστα συναρτήσεων για εργασία με συνεδρίες σε php
    session_cache_expire - επιστρέφει τη λήξη της τρέχουσας προσωρινής μνήμης
    session_cache_limiter - Λαμβάνει και/ή ορίζει τον τρέχοντα περιοριστή προσωρινής μνήμης
    Το session_commit είναι ένα ψευδώνυμο για session_write_close()
    session_decode - αποκωδικοποιεί δεδομένα συνεδρίας από μια συμβολοσειρά
    session_destroy - καταστρέφει όλα τα δεδομένα που έχουν καταχωρηθεί για τη συνεδρία
    session_encode - κρυπτογραφεί τα δεδομένα της τρέχουσας περιόδου λειτουργίας ως συμβολοσειρά
    session_get_cookie_params - λαμβάνει παραμέτρους cookie συνεδρίας
    session_id - παίρνει και/ή ορίζει το τρέχον αναγνωριστικό συνεδρίας
    session_is_registered - καθορίζει εάν η μεταβλητή είναι καταχωρημένη στη συνεδρία
    session_module_name - παίρνει και/ή ορίζει την τρέχουσα ενότητα συνεδρίας
    session_name - παίρνει και/ή ορίζει το όνομα της τρέχουσας συνεδρίας
    session_regenerate_id - τροποποιεί το τρέχον αναγνωριστικό συνεδρίας με ένα νέο που δημιουργήθηκε
    session_register - καταχωρεί μία ή περισσότερες μεταβλητές για την τρέχουσα περίοδο λειτουργίας
    session_save_path - παίρνει και/ή ορίζει τη διαδρομή για την αποθήκευση της τρέχουσας συνεδρίας
    session_set_cookie_params - ορίζει παραμέτρους cookie συνεδρίας
    session_set_save_handler - ορίζει τις λειτουργίες αποθήκευσης περιόδου σύνδεσης σε επίπεδο χρήστη
    session_start - αρχικοποιεί τα δεδομένα συνεδρίας
    session_unregister - καταργεί την εγγραφή μιας μεταβλητής από την τρέχουσα περίοδο λειτουργίας
    session_unset - απελευθερώνει όλες τις μεταβλητές περιόδου λειτουργίας
    session_write_close - γράφει τα δεδομένα συνεδρίας και το τέλος της συνεδρίας

    Παραδείγματα εργασιών συνεδρίας

    Μετρητής προβολών σελίδας κατά τη διάρκεια μιας συνεδρίας. Ένα ξεκάθαρο παράδειγμα δουλειάς. Ωστόσο, μετά το κλείσιμο του προγράμματος περιήγησης, η αντίστροφη μέτρηση θα ξεκινήσει ξανά.

    Μετρητής επισκέψεων σε μία σελίδα σε μία συνεδρία

    // Ένα απλό παράδειγμα χρήσης συνεδριών χωρίς Cookies.
    session_name("test");
    session_start();
    $_SESSION["count"] = @$_SESSION["count"] + 1;
    ?>

    Μετρητής


    Έχετε ανοίξει αυτήν τη σελίδα στην τρέχουσα περίοδο λειτουργίας του προγράμματος περιήγησής σας
    φορές).
    Κλείστε το πρόγραμμα περιήγησής σας για να επαναφέρετε αυτόν τον μετρητή.
    Κάντε κλικ εδώ για να ενημερώσετε τη σελίδα!
    Με κάθε μετάβαση ο μετρητής θα αυξάνεται κατά 1)

    Σας ευχαριστώ για την προσοχή σας! Καλή επιτυχία στις προσπάθειές σας!