OpenCart-Hellas 

Η Ελληνική κοινότητα υποστήριξης του Opencart

Αναφορές νέων & επίλυση γνωστών bugs.
#6939
Σε εκδόσεις OpenCart 3.0.x έως και την 3.0.3.6 υπάρχει bug στο garbage collection των sessions που καταχωρούνται στη βάση και δεν διαγράφονται.

Για την ενεργοποίηση του 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() {
προσθέτουμε:
Κώδικας: Επιλογή όλων
	
public function gc() {
  $this->adaptor->gc();
}
Στο system/library/session/db.php
το:
Κώδικας: Επιλογή όλων
	public function gc($expire) {
		$this->db->query("DELETE FROM `" . DB_PREFIX . "session` WHERE expire < " . ((int)time() + $expire));
		
		return true;
	}
Το κάνουμε έτσι (θα τρέχει μόνο κάποιες φορές που θα προκύπτει βάσει τυχαιότητας ο αριθμός 1 για να μην επιβαρύνεται ο sql server με συνεχή queries σε καταστήματα που έχουν πολλές επισκέψεις):
Κώδικας: Επιλογή όλων
	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;
	}
#7574
Καλησπέρα,

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

Σχετικά με το ερώτημα σου, είναι επιβεβαιωμένο από εμένα ότι λειτουργεί σε έκδοση 3.0.2.0 και επίσης η έκδοση 3.0.3.1 που ανέφερες δεν έχει διαφορές στα αρχεία που γίνονται οι μεταβολές, άρα και εκεί θα λειτουργεί.

Η τροποποίηση δεν επιβαρύνει την ταχύτητα του site και δεν προσθέτει καταχωρήσεις, αντίθετα διαγράφει τα περιττά sessions που προηγουμένως δεν διαγράφονταν από bug. Η διαγραφή των sessions, ακριβώς για να μην επιβαρύνεται το site, δεν γίνεται κάθε φορά που τρέχει άλλα με μία τυχαιοποίηση πχ ανά 3-4 φορές που θα τρέξει.

Γνωρίζεις PHP, κατανοείς πως λειτουργεί ο κώδικας; Αν δεν γνωρίζεις PHP, είσαι βέβαιος ότι έχεις ακολουθήσει πιστά τις οδηγίες; Νομίζω είναι straightforward, το μόνο που θα μπορούσε γίνει παρανόηση ήταν η οδηγία στη σελίδα του session πριν το τελικό " }". Το έκανα πριν το "public function __destroy() {" για να είναι πιο κατανοητό. Δες το πάλι βήμα βήμα και αν εξακολουθείς να έχεις πρόβλημα εδώ είμαστε.
Από adsa
#8003
Καλησπέρα, διάβασα το θέμα και θα κάνω τις διορθώσεις μιας και στο oc_session βλέπω 1.5 εκ. εγγραφές που ξεκινάνε από παλιά.
Θα ήθελα να σας ρωτήσω, αν θα χρειαστεί, μετά τις διορθώσεις να περιμένω κάποιο χρονικό διάστημα ή θα δω άμεσα μείωση εγγραφών και του μεγέθους του oc_session.
(oc 3.0.3.2)
#8004
Καλησπέρα, κάνε μερικά refresh, επειδή χρησιμοποιείται μία υποτυπώδης τυχαιοποίηση για να μην τρέχει σε κάθε pageload.
Από adsa
#8011
Λοιπόν, οι τροποποιήσεις φαίνεται ότι δουλεύουν καλά.
Η βάση δεδομένων έχει λιγότερο μέγεθος, οι άχρηστες εγγραφές από επίπεδο εκατομμυρίου, είναι μερικές χιλιάδες.
Η μοναδική παραφωνία που κατάλαβα είναι ότι στο διαχειριστικό με πετάει έξω μετά από κάποιο χρονικό διάστημα και πρέπει να ξανακάνω login σχετικά τακτικά στην διάρκεια της ημέρας. Δεν είναι και τόσο σοβαρό πρόβλημα αλλά κάποιες φορές με "κόβει" πάνω σε συνεχόμενη δουλειά που κάνω.

Σας ευχαριστώ πολύ για την απάντηση, σκεφτείτε η ε[…]

Έλεγξε αν έχεις πολύ μεγάλα αρχεία εικόνων και αν […]

Κάνε ένα restart τον σερβερ. (βασικα την λειτουργι[…]

Vqmod and SEARCH NOT FOUND

Καλησπέρα, έχω ένα xml που βγάζει αυτό το λάθος […]

Πριν ζητήσετε βοήθεια στο φόρουμ, παρακαλούμε ελέγξτε αν υπάρχει έτοιμη λύση στο OpenCart Extension Marketplace!