Forum und email

Χειρισμός Συνδέσεων

Note: Τα ακόλουθα ισχύουν από την 3.0.7 και μετά.

Εσωτερικά στην PHP ένα status σύνδεσης (connection status) διατηρείται. Υπάρχουν 3 δυνατές καταστάσεις:

  • 0 - NORMAL
  • 1 - ABORTED
  • 2 - TIMEOUT

Όταν ένα PHP script εκτελείται, κανονικά η κατάσταση NORMAL είναι ενεργή. Αν ένας remote (απομακρυσμένος) client αποσυνδεθεί, η ABORTED σημαία κατάστασης ενεργοποιείται. Μια αποσύνδεση ενός remote client συνήθως προκαλείται όταν ο χρήστης πατήσει το κουμπί STOP. Αν το όριο χρόνου της PHP (δείτε την set_time_limit()) περαστεί, η TIMEOUT σημαία κατάστασης ενεργοποιείται.

Μπορείτε να αποφασίσετε αν θέλετε μια αποσύνδεση ενός client να προκαλεί το script σας να σταματά. Κάποτε είναι βολικό να έχετε πάντα τα scripts σας να τρέχουν μέχρι τέλους ακόμη και αν δεν υπάρχει κάποιος remote browser να λαμβάνει την έξοδο. Η προκαθορισμένη συμπεριφορά όμως είναι το script σας να τερματίζει όταν ο remote client αποσυνδέεται. Αυτή η συμπεριφορά μπορεί να οριστεί μέσω του ignore_user_abort directive στο php.ini όπως και μέσω του αντίστοιχου "php_value ignore_user_abort" Apache .conf directive ή με την ignore_user_abort() συνάρτηση. Αν δεν πείτε της PHP να αγνοήσει μια αποσύνδεση ενός χρήστη και ο χρήστης αποσυνδεθεί, το script σας θα τερματίσει. Η μόνη εξαίρεση είναι αν έχετε κάνει register μια shutdown συνάρτηση χρησιμοποιώντας την register_shutdown_function(). Με μια shutdown συνάρτηση, όταν ο remote χρήστης πατήσει το STOP κουμπί, την επόμενη φορά που το script θα προσπαθήσει να έχει κάτι στην έξοδο, η PHP θα ανιχνεύσει πως η σύνδεση έχει τερματιστεί και η shutdown συνάρτηση θα καλεστεί. Αυτή η shutdown συνάρτηση θα καλεστεί στο τέλος της κανονικής εκτέλεσης του script σας, έτσι για να κάνετε κάτι διαφορετικό στην περίπτωση που ένας client αποσυνδέεται μπορείτε να χρησιμοποιήσετε την connection_aborted() συμνάρτηση. Αυτή η συνάρτηση θα επιτστρέψει TRUE αν η σύνδεση έχει τερματιστεί (aborted).

Το script σας μπορεί επίσης να τερματιστεί από τον ενσωματωμένο timer (χρονομετρητή) των script. Ο προκαθορισμένος timeout χρόνος είναι 30 δευτερόλεπτα. Μπορεί να αλλαχτεί χρησιμοποιώντας το max_execution_time directive στο php.ini ή το αντίστοιχο "php_value max_execution_time" directive στα Apache .conf όπως επίσης και με την συνάρτηση set_time_limit(). Όταν ο timer λήξει, το script θα τερματιστεί και, όπως και στην παραπάνω περίπτωση αποσύνδεσης του client, αν μια shutdown συνάρτηση έχει καταχωρηθεί (registered) θα καλεστεί. Μέσα σε αυτή την shutdown συνάρτηση μπορείτε να ελέγξετε αν ένα timeout ήταν το αίτιο της κλήσης της shutdown συνάρτησης, καλώντας την συνάρτηση connection_timeout(). Αυτή η συνάρτηση επιστρέφει TRUE αν ένα timeout δημιούργησε την κλήση της shutdown συνάρτησης.

Κάτι που αξίζει να σημειωθεί είναι ότι τόσο η ABORTED όσο και η TIMEOUT κατάσταση μπορούν να είναι ενεργές την ίδια στιγμή. Αυτό είναι πιθανόν αν πείτε στην PHP να αγνοεί τα abort των χρηστών. Η PHP ακόμη θα σημειώνει το γεγονός ότι κάποιος χρήστης μπορεί να έχει διακόψει τη σύνδεση, αλλά το script θα συνεχίσει να τρέχει. Αν τότε φτάσει το όριο χρόνου θα τερματιστεί και η shutdown συνάρτηση σας, αν υπάρχει, θα καλεστεί. Σε αυτό το σημείο θα βρείτε ότι η connection_timeout() και η connection_aborted() επιστρέφουν TRUE. Μπορείτε επίσης να ελέγξετε και τις δύο καταστάσεις σε μία κλήση χρησιμοποιώντας την connection_status(). Αυτή η συνάρτηση επιστρέφει ένα πεδίο με bits (bitfield) των ενεργών καταστάσεων. Έτσι, αν και οι δύο καταστάσεις είναι ενεργές για παράδειγμα, θα επιστρέψει 3.