Błąd 500 podczas aktualizacji do PHP 8

 
Błąd 500 podczas aktualizacji do PHP 8

W listopadzie ubiegłego roku pojawił się PHP 8, który zapowiadał poprawę wydajności, szybkości i bezpieczeństwa.

Jak każdy dobry majsterkowicz, pobiegłem zaktualizować wersję 7.4, a konkretnie 7.4.16, która obecnie działa na serwerze.

plof! przywitał mnie miły błąd 500 i zepsuł całą witrynę. Żaden adres URL nie został rozwiązany.

Wykonałem typowy test polegający na wyłączeniu wszystkich wtyczek i użyciu domyślnego szablonu. Błąd 500 nie zniknął.

Byłem zszokowany, ale zdałem sprawę przekonany, że jest jeszcze za wcześnie na aktualizację i, jak radzili, najlepiej poczekać, aż wszyscy autorzy wtyczek i szablonów zaktualizują swój kod, aby był kompatybilny z PHP 8.

Prawie siedem miesięcy później spróbowałem ponownie i błąd 500 nadal występował.

Pierwszą wskazówką, że źródłem błędu jest tylko ten blog, jest to, że w pozostałych dwóch instalacjach WordPressa, które mam na tym samym serwerze, wszystko działa poprawnie.

Ponieważ błąd 500 może pojawić się z wielu powodów. Następnym logicznym krokiem jest wyciągnięcie dzienników błędów, aby spróbować dowiedzieć się, co jest nie tak. Pojawia się następujący ciąg ostrzeżeń:

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

Ostrzeżenie PHP: Use of the undefined constant minor - assumed 'minor' (this will throw an Error in a future version of PHP).

Oznacza to, że stała powinna być ujęta w cudzysłów. Idę do wp-config.php i rzeczywiście, minor pojawia się bez cudzysłowów w tej linii.

define ('WP_AUTO_UPDATE_CORE', minor);

Przeszukując forum WordPress stwierdzam, że wiele osób miało ten sam problem z aktualizacją do starszych wersji PHP z powodu konfliktów z wtyczką lub szablonem.

Nie można również wykluczyć, że problem jest związany z instalacją WordPressa, która ma coś zepsutego, jak powiedziano mi w zgłoszeniu, które wysłałem do LucusHost.

W niektórych otrzymanych odpowiedziach piszą, że aby rozwiązać problem wystarczy dodać cudzysłów do "minor", więc proszę spróbować i tak właśnie zrobiłem

define ('WP_AUTO_UPDATE_CORE', 'minor');

WP_AUTO_UPDATE_CORE pozwala kontrolować aktualizacje rdzenia WordPressa dla wersji minor, major i development. Ta stała może być zdefiniowana na kilka sposobów. Usunięcie tej linii nie jest dobrym pomysłem.

#Wyłącza wszystkie aktualizacje rdzenia:

define( 'WP_AUTO_UPDATE_CORE', false );

# Włącza wszystkie aktualizacje, w tym mniejsze i większe aktualizacje:

define( 'WP_AUTO_UPDATE_CORE', true );

# Włącza pomniejsze aktualizacje:

define( 'WP_AUTO_UPDATE_CORE', 'minor' );

Dobra i zła wiadomość.

Dobra wiadomość jest taka, że teraz, po uruchomieniu PHP 8, błąd 500 zniknął.

Na pierwszy rzut oka wszystko wydaje się działać dobrze, zarówno wtyczki, jak i posty.

Zła wiadomość jest taka, że indeks jest uszkodzony i wygląda tak.

Błąd 500 podczas aktualizacji do PHP 8 1

Postanowiłem najpierw zaatakować szablon postu, wykonany za pomocą Elementora Pro, na wypadek, gdyby konstruktor zostawił jakieś ukryte śmieci, ale po przejrzeniu go i całkowitym przerobieniu wykluczyłem, że błąd pochodzi stamtąd.

Teraz wciąż sprawdzam szablon(GeneratePress Premium) w środowisku testowym i przynajmniej wiem, gdzie się psuje, ale głównie szukam w WordPressie, który moim zdaniem jest sednem sprawy, jakiś nieaktualny kod wciągnięty, jakiś filtr zatkany smarem lub cokolwiek innego.

Zostawiam tę notatkę tutaj na wypadek, gdyby ktoś miał podobny problem i byłoby to pomocne, lub to, co tu napisałem, lub wie dużo o WP i może dać mi więcej wskazówek, aby go rozwiązać.

Jak tylko znajdę ostateczne rozwiązanie i możliwe wyjaśnienie, zaktualizuję ten post.

Aktualizacja

Dziennik błędów, po włączeniu DEBUG, daje wskazówki, że GeneratePress gdzieś się zawiesza, być może z powodu jakiegoś haka lub filtra, który umieściłem w jego module Elements (lub czymkolwiek innym).

Ponieważ mam szablon potomny GeneratePress, jestem zagubiony i nie wiem, dokąd się stąd udać, ale ponieważ mam kilka podejrzeń, nie uważam jeszcze misji za nieudaną.

Błąd krytyczny: 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} rzucone w /blog/wp-content/themes/generatepress/inc/structure/post-meta.php na linii 169

naprawione! No, prawie

Na szczęście kluczowa okazała się pierwsza linijka, w której pojawiały się wszystkie błędy z tej długiej listy:

Błąd krytyczny: Uncaught TypeError: Unsupported operand types: string int in /home/ public_html/blog/wp-content/themes/generatepress/inc/structure/post-meta.php:169

Błąd 500 podczas aktualizacji do PHP 8 2

Tajemnica błędu tkwiła w jakiejś nieobsługiwanej operacji cholernego get_the_time .

Łącząc to wszystko razem, podejrzenia się potwierdziły. Błąd został spowodowany przez ten fragment funkcji, którego użyłem do pokazania dnia i godziny aktualizacji jako rozszerzenia meta w dacie.

Co gorsza, nie wiem jak, ale pozostał on rezydentny po wyłączeniu Code Snippets i wyczyszczeniu pamięci podręcznej.

Błąd 500 podczas aktualizacji do PHP 8 3

Morał z tej historii, proszę nie używać funkcji, które działają dobrze dla innych, ponieważ każda strona ma swoją własną historię i jest bardzo prawdopodobne, że coś zepsują, jeśli o nich zapomnisz, zaktualizujesz WP, PHP, szablon lub wtyczkę i nie będą już kompatybilne.

Po usunięciu tego fragmentu wszystko działa dobrze, a strona główna wraca do normy.

Nie ma dwóch bez trzech, kolejny błąd. Teraz Feedzy

Ale proszę jeszcze nie odchodzić, teraz wtyczka Feedzy (jak sądzę) lub coś z nią związanego psuje stronę z wiadomościami.

Błąd 500 podczas aktualizacji do PHP 8 4

Nadszedł czas, aby otworzyć zgłoszenie do pomocy technicznej, ponieważ jest to wersja płatna, aby poinformować twórców wtyczki, czy jest ona w 100% kompatybilna z PHP 8 (i czy psuje się, ponieważ nie jest) lub uzyskać od nich wskazówkę.

02/07/2021- Feedly odtworzyło fatalny błąd przy użyciu PHP 8 i przekazało problem swoim programistom, teraz musimy poczekać, aż wydadzą nową wersję wtyczki, która naprawi problem.

05/07/2021- Opis błędu jest już dostępny na ich Githubie.

06/07/2021 - Chociaż nie odpowiedzieli jeszcze ani nie wydali nowej wersji z poprawką, w tym zatwierdzeniu można znaleźć linie kodu, które to naprawiają. Przetestowałem to i, w oczekiwaniu na dobre i dokładne testy, wydaje się, że PHP 8 niczego już nie psuje.

Podsumowując

Nie jest źle. Od posiadania błędu 500, który zepsuł cały blog, do posiadania go tylko na stronie głównej i wreszcie na jednej"drugorzędnej" stronie, aby w końcu znaleźć poprawkę, wystarczy, aby być zadowolonym z godzin zainwestowanych w naprawę.

Kluczem do wszystkiego jest badanie, spędzanie całego czasu na szukaniu źródła i tego, co powoduje w innych częściach bloga. Proszę nie próbować szybkich rozwiązań bez wystarczających wskazówek, ponieważ albo stracą Państwo czas, albo w zły sposób zepsują coś innego.

Zaktualizuję ponownie, gdy uda mi się pokonać nowy błąd za pomocą Feedzy lub cokolwiek to jest tym razem.