Τον περασμένο Νοέμβριο η PHP 8 προσγειώθηκε. Ανακοίνωσε κάποιες βελτιώσεις στις επιδόσεις, την ταχύτητα και την ασφάλεια.
Όπως κάθε καλός μάστορας, έτρεξα να αναβαθμίσω από την 7.4, συγκεκριμένα από την 7.4.16, την έκδοση που τρέχει τώρα στον διακομιστή.
ένα ωραίο σφάλμα 500 με υποδέχεται και καταστρέφει ολόκληρο τον ιστότοπο. Καμία διεύθυνση URL δεν επιλύεται.
Έκανα το τυπική δοκιμή απενεργοποιώντας όλα τα πρόσθετα και χρησιμοποιώντας το προεπιλεγμένο πρότυπο. Το σφάλμα 500 δεν εξαφανίζεται.
Σοκαρίστηκα, αλλά πέρασα το θέμα πεπεισμένος ότι ήταν ακόμα πολύ νωρίς για ενημέρωση και, όπως με συμβούλευσαν, το καλύτερο που είχα να κάνω ήταν να περιμένω όλους τους συγγραφείς πρόσθετων και προτύπων να ενημερώσουν τον κώδικά τους ώστε να είναι συμβατός με την PHP 8.
Σχεδόν επτά μήνες αργότερα δοκίμασα ξανά και το σφάλμα 500 εξακολουθούσε να υπάρχει.
Η πρώτη ένδειξη ότι η προέλευση του σφάλματος είναι μόνο σε αυτό το ιστολόγιο είναι ότι στις άλλες δύο εγκαταστάσεις WordPress που έχω στον ίδιο διακομιστή όλα λειτουργούν σωστά.
Καθώς ένα σφάλμα 500 μπορεί να εμφανιστεί για πολλούς λόγους. Το επόμενο λογικό βήμα είναι να τραβήξω τα αρχεία καταγραφής σφαλμάτων για να προσπαθήσω να βρω τι φταίει. Εμφανίζεται μια σειρά από προειδοποιήσεις όπως αυτή:
PHP Warning: Use of undefined constant minor - assumed 'minor' (this will throw an Error in a future version of PHP) in /home/xxxxxx/public_html/blog/wp-config.php on line 11
Προειδοποίηση PHP: Use of the undefined constant minor - assumed 'minor' (this will throw an Error in a future version of PHP).
Δηλαδή, η σταθερά υποτίθεται ότι πρέπει να έχει εισαγωγικά γύρω της. Πηγαίνω στο wp-config.php και σίγουρα το minor εμφανίζεται χωρίς εισαγωγικά σε αυτή τη γραμμή.
define ('WP_AUTO_UPDATE_CORE', minor),
Ψάχνοντας στο φόρουμ του WordPress βρίσκω ότι πολλοί άνθρωποι είχαν το ίδιο πρόβλημα αναβαθμίζοντας σε παλαιότερες εκδόσεις της PHP λόγω συγκρούσεων με κάποιο πρόσθετο ή πρότυπο.
Ούτε μπορεί να αποκλειστεί ότι το πρόβλημα σχετίζεται με την εγκατάσταση του WordPress που έχει κάτι χαλασμένο, όπως μου είπαν σε ένα ticket που έστειλα στο LucusHost.
Σε κάποιες από τις απαντήσεις που λαμβάνουν, λένε ότι για να λυθεί το πρόβλημα αρκεί να προσθέσετε τα εισαγωγικά στο 'minor', οπότε δοκιμάστε το και αυτό έκανα
define ('WP_AUTO_UPDATE_CORE', 'minor'),
WP_AUTO_UPDATE_CORE σας επιτρέπει να ελέγχετε τις ενημερώσεις του πυρήνα του WordPress για μικρές, μεγάλες και αναπτυξιακές εκδόσεις. Αυτή η σταθερά μπορεί να οριστεί με διάφορους τρόπους. Η αφαίρεση αυτής της γραμμής δεν είναι καλή ιδέα.
#Disables all core updates:
define( ‘WP_AUTO_UPDATE_CORE’, false );
# Enable all updates, including minor and major updates:
define( ‘WP_AUTO_UPDATE_CORE’, true );
# Enables minor updates:
define( ‘WP_AUTO_UPDATE_CORE’, ‘minor’ );
Καλά νέα και κακά νέα.
Τα καλά νέα είναι ότι τώρα, τρέχοντας την PHP 8, το σφάλμα 500 έχει εξαφανιστεί.
Όλα φαίνεται να λειτουργούν μια χαρά με την πρώτη ματιά, τόσο τα plugins όσο και οι αναρτήσεις.
Τα κακά νέα είναι ότι το ευρετήριο είναι σπασμένο και μοιάζει με αυτό.
Αποφάσισα να επιτεθώ πρώτα στο post templatetemplate, που έγινε με το Elementor Proσε περίπτωση που ο οικοδόμος είχε αφήσει κάποια κρυμμένα σκουπίδια, αλλά αφού το εξέτασα και το ξαναέκανα εντελώς, απέκλεισα ότι το σφάλμα προέρχεται από εκεί.
Τώρα εξακολουθώ να επεξεργάζομαι το πρότυπο (GeneratePress Premium) σε ένα δοκιμαστικό περιβάλλον και τουλάχιστον ξέρω πού σπάει, αλλά κυρίως κοιτάζω το WordPress, όπου νομίζω ότι βρίσκεται η ουσία του προβλήματος, κάποιος μπαγιάτικος κώδικας που σέρνεται τριγύρω, κάποιο φίλτρο φραγμένο με λίπος ή οτιδήποτε άλλο.
Αφήνω αυτό το σημείωμα εδώ σε περίπτωση που κάποιος είχε παρόμοιο πρόβλημα και είναι χρήσιμο, ή αυτό που έχω γράψει εδώ ή γνωρίζει πολλά για το WP και μπορεί να μου δώσει κάποια περισσότερα στοιχεία για να το λύσω.
Μόλις βρω την οριστική λύση και την πιθανή εξήγηση, θα ενημερώσω αυτό το μήνυμα.
Ενημέρωση
Το αρχείο καταγραφής σφαλμάτων, μετά την ενεργοποίηση του DEBUG, δίνει ενδείξεις ότι το GeneratePress καταρρέει κάπου, ίσως εξαιτίας κάποιου γάντζου ή φίλτρου που έβαλα στο Elements module του (ή οτιδήποτε άλλο).
Καθώς έχω ένα παιδί-πρότυπο του GeneratePress έχω χαθεί και δεν ξέρω πού να πάω από εδώ και πέρα, αλλά καθώς έχω μερικές υποψίες δεν θεωρώ την αποστολή αποτυχημένη ακόμα.
Fatal error: Uncaught TypeError: Unsupported operand types: string + int in /home/ public_html/blog/wp-content/themes/generatepress/inc/structure/post-meta.php:169 Stack trace: #0
/home/ public_html/blog/wp-content/themes/generatepress/inc/structure/post-meta.php(419): generate_do_post_meta_item() #1
/home/ public_html/blog/wp-content/themes/generatepress/inc/structure/post-meta.php(538): generate_posted_on() #2
/home/ public_html/blog/wp-includes/class-wp-hook.php(292): generate_post_meta() #3
/home/ public_html/blog/wp-includes/class-wp-hook.php(316): WP_Hook->apply_filters() #4
/blog/wp-includes/plugin.php(484): WP_Hook->do_action() #5
/blog/wp-content/themes/generatepress/content.php(48): do_action() #6
/blog/wp-includes/template.php(732): require('/home/ ...') #7
/blog/wp-includes/template.php(676): load_template() #8
/blog/wp-includes/general-template.php(204): locate_template() #9
/blog/wp-content/themes/generatepress/inc/theme-functions.php(587): get_template_part() #10
/blog/wp-content/themes/generatepress/index.php(37): generate_do_template_part() #11
/blog/wp-includes/template-loader.php(106): include('/home/ ...') #12
/blog/wp-blog-header.php(19): require_once('/home/ ...') #13
/blog/index.php(17): require('/home/ ...') #14
{main} thrown in /blog/wp-content/themes/generatepress/inc/structure/post-meta.php on line 169
το διόρθωσα! Λοιπόν, σχεδόν
Ευτυχώς η πρώτη γραμμή ήταν το κλειδί, εκεί προκλήθηκαν όλα τα σφάλματα σε αυτή τη μακρά λίστα:
Fatal error: Uncaught TypeError: Unsupported operand types: string + int in /home/ public_html/blog/wp-content/themes/generatepress/inc/structure/post-meta.php:169
Το μυστήριο του λάθους ήταν σε κάποια μη υποστηριζόμενη λειτουργία του καταραμένου get_the_time .
Συνδέοντας όλα αυτά μαζί, οι υποψίες επιβεβαιώνονται. Το σφάλμα προκλήθηκε από αυτό το απόσπασμα συνάρτησης που χρησιμοποίησα για να δείξω την ημέρα και την ώρα της ενημέρωσης ως προέκταση του meta στην ημερομηνία.
Για να γίνουν τα πράγματα χειρότερα, δεν ξέρω πώς, αλλά παρέμεινε μόνιμο μετά την απενεργοποίηση του Αποσπάσματα κώδικα και την εκκαθάριση της μνήμης cache.
Το ηθικό δίδαγμα της ιστορίας, μην χρησιμοποιείτε λειτουργίες που λειτουργούν καλά για άλλους γιατί κάθε σελίδα έχει το δικό της ιδιαίτερο ιστορικό και είναι πολύ πιθανό να καταλήξουν να χαλάσουν κάτι αν τις ξεχάσετε, ενημερώσετε το WP, την PHP, ένα template ή ένα plugin και δεν είναι πλέον συμβατές.
Διαγράφοντας αυτό το απόσπασμα όλα λειτουργούν μια χαρά και η αρχική σελίδα επανέρχεται στο φυσιολογικό.
Δεν υπάρχουν δύο χωρίς τρία, άλλο ένα λάθος. Τώρα Feedzy
Αλλά μην φύγετε ακόμα, γιατί τώρα το πρόσθετο Feedzy plugin (υποθέτω) ή κάτι σχετικό σπάει τη σελίδα ειδήσεων.
Ήρθε η ώρα να ανοίξετε ένα ticket υποστήριξης, αφού πρόκειται για πληρωμένη έκδοση, για να ενημερώσετε τους προγραμματιστές του plugin αν είναι 100% συμβατό με την PHP 8 (και αν χαλάει επειδή δεν είναι) ή να πάρετε μια ιδέα από αυτούς.
02/07/2021 - Το Feedly αναπαρήγαγε το μοιραίο σφάλμα χρησιμοποιώντας την PHP 8 και μετέφερε το πρόβλημα στους προγραμματιστές του, τώρα πρέπει να περιμένουμε να κυκλοφορήσουν μια νέα έκδοση του πρόσθετου που θα διορθώνει το πρόβλημα.
05/07/2021 - Η περιγραφή του σφάλματος είναι τώρα διαθέσιμη στο Github.
06/07/2021 - Παρόλο που δεν έχουν απαντήσει ακόμα ή δεν έχουν κυκλοφορήσει μια νέα έκδοση με τη διόρθωση, σε αυτή τη δέσμευση υπάρχουν ήδη οι γραμμές κώδικα που το διορθώνουν. Το δοκίμασα και, ελλείψει μιας καλής και ενδελεχούς δοκιμής, φαίνεται ότι η PHP 8 δεν χαλάει τίποτα πια.
Ανακεφαλαιώνοντας
Καθόλου άσχημα. Από το να έχουμε ένα σφάλμα 500 που κατέστρεψε ολόκληρο το blog στο να το έχουμε μόνο στην αρχική σελίδα και τελικά σε μια μόνο"δευτερεύουσα" σελίδα για να καταλήξουμε να βρούμε μια λύση είναι αρκετό για να είμαστε ικανοποιημένοι με τις ώρες που επενδύσαμε στην επισκευή.
Το κλειδί για όλα βρίσκεται στην έρευνα, αφιερώστε όλο το χρόνο σας ψάχνοντας για την προέλευση και τι προκαλεί σε άλλα μέρη του blog σας. Μην πέφτετε με τα μούτρα στην προσπάθεια γρήγορων διορθώσεων χωρίς αρκετά στοιχεία γιατί είτε θα χάσετε τον χρόνο σας είτε, με άσχημο τρόπο, θα χαλάσετε κάτι άλλο.
Θα ενημερώσω ξανά όταν καταφέρω να νικήσω το νέο σφάλμα με το Feedzy ή ό,τι άλλο είναι αυτή τη φορά.