Το κάρμα μου στα ποστ είναι 0.32 και στο προφίλ 0.47.Εν τω μεταξύ πριν κάτι μέρες με είχαν ψηφίσει 37 άτομα ενώ τώρα 36!Γίνεται αυτό?
Προφανώς συνέβη αυτό που ανέφεραν τα παιδιά παρακάτω, κάποιος που σε είχε ψηφίσει (αρνητικά προφανώς) έφαγε ban και πλέον δεν μετράει η ψήφος του.
Ας εξηγήσω λίγο τώρα γιατί συμβαίνει αυτή η διαφορά τιμών, και όποιος έχει παρόμοια απορία ξανά να ανατρέχει εδώ. Θα προσπαθήσω να κάνω το κείμενο όσο πιο κατανοητό μπορώ.
Το postbit (το κομμάτι δίπλα απο κάθε ποστ) πρέπει να εμφανίζει την τιμή χωρίς να κάνει κάποιο query (query= ερώτημα, δλδ γράφεις μια πρόταση με συγκεκριμένη σύνταξη ώστε να πάρεις συγκεκριμένα αποτελέσματα) στη βάση. Αν έκανε query στη βάση, τότε θα είχαμε τουλάχιστον ένα query ανα πόστ, και αν είχε κάποιος πχ 100 ποστς ανα σελίδα, θα έκανε τουλάχιστον 100 επιπλέον queries. Αυτό βαραίνει πολύ τον server. Παλιότερα το είχα γράψει έτσι και πιθανολογούμε οτι ίσως συντέλεσε στα database errors που αντιμετωπίζαμε πριν μεταφερθούμε, μιας και προσθετε 1-3 (αναλόγως την περίπτωση) queries ανα μήνυμα. Αργότερα όταν το διαπίστωσα αυτό, αφαιρέθηκε το κάρμα απο τα posts, και κάποια στιγμή όπως θυμάστε επέστρεψε, με πιο βελτιστοποιημένο κώδικα. Αυτή τη στιγμή, το πεδίο που "κρατάει" το κάρμα του κάθε μέλους στη βάση βρίσκεται σε έναν πίνακα που γίνεται όλος query ούτως ή άλλως απο το vBulletin, οπότε απλώς το κάρμα χρησιμοποιεί την ήδη έτοιμη τιμή σε κάθε ποστ, χωρίς να προστίθεται κανένα απολύτως query για να την εμφανίσουμε σε posts. Με τον ίδιο τρόπο εμφανίζει το vBulletin και τα μηνύματα του καθενός δίπλα απο κάθε ποστ, καθώς και τα άλλα στοιχεία του. Προφανώς δεν τα ψάχνει εκείνη την ώρα όλα απο τη βάση, θα είχε κρασάρει τελείως ο σέρβερ.
Το προφίλ του κάθε μέλους ωστόσο δεν είναι κάτι που χρησιμοποιείται τόσο συχνά, και άλλωστε εκεί μας ενδιαφέρει το κάρμα μόνο ενός μέλους, όχι πολλών, οπότε υπολογίζεται εκείνη τη στιγμή απο όλες τις καταγεγγραμένες ενεργές ψήφους (ενεργές ψήφοι = ψήφοι που έχουν δώσει άτομα με ενεργό κάρμα, μη-αποκλεισμένα) με ένα μόνο query. Αυτό έγινε και για λόγους debugging (να εντοπίζεται εύκολα ενδεχόμενη διαφορά μεταξύ του πραγματικού κάρμα και του αποθηκευμένου στο πεδίο του πίνακα user που χρησιμοποιείται στα postbits) και επειδή έτσι ήταν, και δεν υπήρχε λόγος να αλλάξει.
Ωστόσο με το νέο σύστημα αυτό, δημιουργήθηκε ένα επιπρόσθετο πρόβλημα. Τι γίνεται όταν κάποιος αποκλείεται απο το e-steki ή απενεργοποιεί το κάρμα του; Προφανώς και είναι αρκετά εύκολο με ένα query μόνο να θέσω το πεδίο active (ενεργή) της κάθε ψήφου που έχει δώσει ή πάρει απο 1 σε 0, ώστε σε κάθε νέο υπολογισμό να μην υπολογίζονται αυτές, μέχρι να σταματήσει να είναι αποκλεισμένος ή να ενεργοποιήσει το κάρμα του. Όμως τι γίνεται με τις ήδη αποθηκευμένες τιμές που χρησιμοποιούνται στο postbit? Θα έπρεπε κάθε φορά που κάποιος παίζει με το κάρμα του ή αποκλείεται απο το e-steki να υπολογίζονται όλες απο την αρχή, κάτι που θα επιβάρυνε αρκετά τον server. Οπότε δεν γράφτηκε κώδικας για αυτό, και απλά συγχρονίζονταν με κάθε νέα ψήφο που έπαιρνε το άτομο αυτό (μιας και με κάθε νέα ψήφο καθοριζόταν εκ νέου και το αποθηκευμένο κάρμα του). Ωστόσο τι γίνεται με τα άτομα που δεν παίρνουν άλλη ψήφο ή αργουν να πάρουν; Θα έμενε για τόσο καιρό ασυγχόνιστο το κάρμα τους και άλλο θα έδειχνε το ποστ και άλλο το προφίλ; Έτσι δημιούργησα ένα νέο αρχείο php, που υπολογίζει το κάρμα όλων των μελών και το αποθηκεύει στο πεδίο που χρησιμοποιείται για το postbit. Ωστόσο όπως καταλαβαίνετε αυτό το αρχείο χρησιμοποιεί πολλά queries και δεν πρέπει να τρέχει συχνά. Έτσι το έβαλα (σήμερα βασικά, παλιότερα το τρέχαμε χειροκίνητα πότε πότε) να τρέχει κάθε εβδομάδα τα ξημερώματα (που δεν έχει αρκετό φόρτο ο σέρβερ). Έτσι το πολύ να μείνει το κάρμα ασυγχρόνιστο για μια εβδομάδα.
Όπως καταλαβαίνετε, όταν βλέπετε τέτοια διαφορά, η πραγματική τιμή είναι αυτή που δείχνει το προφιλ σας. Αν δεν μπορείτε να περιμένετε μια εβδομάδα να συγχρονιστούν, βάλτε ένα φίλο σας να σας ψηφίσει ξανά (ακόμη και με το ίδιο νούμερο, δεν παίζει ρόλο, ο συγχρονισμός γίνεται με κάθε ψήφο).