[FIX] OpenCart Session Garbage Collection 3.0.x
Δημοσιεύτηκε: 09 Ιαν 2021, 18:23
Σε εκδόσεις OpenCart 3.0.x έως και την 3.0.3.6 υπάρχει bug στο garbage collection των sessions που καταχωρούνται στη βάση και δεν διαγράφονται.
Για την ενεργοποίηση του garbage collection ακολουθήστε τις οδηγίες:
(Οι οδηγίες βασίστηκαν σε κώδικα της v3.0.3.6, αν υπάρχει κάποια διαφορά σε παλαιότερες εκδόσεις στείλτε μηνυμα να το δω)
Στο system/library/session.php
κάτω από το:
το:
Για την ενεργοποίηση του garbage collection ακολουθήστε τις οδηγίες:
(Οι οδηγίες βασίστηκαν σε κώδικα της v3.0.3.6, αν υπάρχει κάποια διαφορά σε παλαιότερες εκδόσεις στείλτε μηνυμα να το δω)
Στο system/library/session.php
κάτω από το:
Κώδικας: Επιλογή όλων
προσθέτουμε:
register_shutdown_function(array($this, 'close'));
Κώδικας: Επιλογή όλων
Πριν το:
register_shutdown_function(array($this, 'gc'));
Κώδικας: Επιλογή όλων
προσθέτουμε:
public function __destroy() {
Κώδικας: Επιλογή όλων
Στο system/library/session/db.php
public function gc() {
$this->adaptor->gc();
}
το:
Κώδικας: Επιλογή όλων
Το κάνουμε έτσι (θα τρέχει μόνο κάποιες φορές που θα προκύπτει βάσει τυχαιότητας ο αριθμός 1 για να μην επιβαρύνεται ο sql server με συνεχή queries σε καταστήματα που έχουν πολλές επισκέψεις): public function gc($expire) {
$this->db->query("DELETE FROM `" . DB_PREFIX . "session` WHERE expire < " . ((int)time() + $expire));
return true;
}
Κώδικας: Επιλογή όλων
public function gc() {
if (round(rand(1, 5)) == 1) {
$this->db->query("DELETE FROM `" . DB_PREFIX . "session` WHERE `expire` < '" . $this->db->escape(date('Y-m-d H:i:s', time()-$this->expire)) . "'");
}
return true;
}