Rozwiązywanie problemów ze zgodnością w DLE po aktualizacji do PHP 5.4

  1. Przedmowa
  2. Szukamy problemu
  3. Poprawione
  4. Na koniec

Niedawno spotkałem się z koniecznością przeniesienia kilku witryn mojego przyjaciela na serwer dedykowany, strony są oparte na DLE (Data Life Engine) w wersji 8 Niedawno spotkałem się z koniecznością przeniesienia kilku witryn mojego przyjaciela na serwer dedykowany, strony są oparte na DLE (Data Life Engine) w wersji 8.3 i 9.3. Skopiowałem wszystkie pliki witryn, ustawiłem niezbędne prawa do odczytu i zapisu do potrzebnych folderów i zrzuconych zrzutów bazy danych - potem strony zarobiły, ale to po prostu nie do końca poprawne ... Na stronach internetowych nagłówki zniknęły w niektórych blokach tekstu w admin podczas przeglądania listy publikacji nie ma nagłówków wiadomości, wyszukiwanie publikacji przez użytkownika prowadzi do pustej białej strony, problemy z autoryzacją za pośrednictwem formularza na stronie. Był wybór: zmiana PHP na wersję 5.2 lub silniki edycji dla PHP 5.4 - wybrałem ostatnią opcję, która wydawała się szaloną opcją ...

Zawartość:

  1. Przedmowa
  2. Szukamy problemu
  3. Poprawione
  4. Na koniec

Przedmowa

Najpierw postanowiłem poszukać tego, co ludzie myślą i jak działają w tej sytuacji, rzucili się w poszukiwania i odkryli różne fora, usługi odpowiedzi na pytania. Wszystkie wskazówki i komentarze sprowadzały się do kilku rozwiązań: downgrade PHP, aktualizacja DLE do najnowszej wersji (wszystko działa poprawnie z PHP 5.4), zmień hoster)))

Generalnie zdałem sobie sprawę, że muszę wziąć i zrozumieć siebie, ponieważ nie spotkałem się z żadną rozsądną radą - wybrałem ścieżkę, która jest sprzeczna ze wszystkimi wskazówkami i wskazówkami na forach i konferencjach.

(i) Jeśli nie jesteś zainteresowany niuansami technicznymi i potrzebujesz tylko przewodnika po działaniu, możesz natychmiast przejść do dolnej części artykułu.

Na początek zobaczmy, co zmieniło się w PHP 5.4 bez kompatybilności wstecznej. Aby to zrobić, za pomocą kilku kliknięć w Google wejdziemy tutaj: Co zmieniło się w PHP 5.4.x? , a następnie kliknij link kilka niezgodności .

Szukamy problemu

Oto główne nieodwracalne zmiany, które nas interesują:

  • W PHP nie ma trybu bezpiecznego (dla DLE nie jest to krytyczne, wszystko jest w porządku tutaj)
  • Cytaty „Magiczne” (Magic Quotes) teraz nie działają (w tym miejscu należy sprawdzić)
  • Możliwość przejścia przez referencję podczas wywołania funkcji została usunięta (może również coś przerwać, sprawdzić)
  • Operatory break i continue nie akceptują już argumentów jako zmiennej (rzadko widzę to w DLE, myślę, że wszystko jest w porządku tutaj)
  • Jeśli korzystasz z funkcji htmlentities z azjatyckimi zestawami znaków, działa ona podobnie jak funkcja htmlspecialchars. (trzeba sprawdzić)
  • Usunięto niektóre funkcje, jesteśmy zainteresowani: session_is_registered (), session_register () i session_unregister ().

Domyślnie DLE ma włączoną wystarczającą liczbę mapowań błędów, co jest bardzo przydatne do śledzenia skryptów problemów:

@error_reporting (E_ALL ^ ​​E_WARNING ^ E_NOTICE); @ini_set ('display_errors', true);

Przeglądamy problematyczne strony komunikatów o błędach - natychmiast natrafiliśmy na błąd:

Funkcja set_magic_quotes_runtime () jest przestarzała

Na stronach internetowych znajdują się moduły SAPE i są one używane w pliku skryptu sape.php. Funkcje set_magic_quotes_runtime nie zaczynają się już od PHP 5.3, wystarczy usunąć wszystkie wywołania tej funkcji z pliku i wszystko będzie dobrze. Jeśli chodzi o aktualizację kodu SAPE z witryny stowarzyszonej, nie pociłem się, wszystkie linki są wyświetlane poprawnie.

Teraz musimy ustalić, dlaczego nagłówki wiadomości nie są wyświetlane, na przykład w panelu administracyjnym, w tym celu śledzimy plik odpowiedzialny za dane wyjściowe modułu i szukamy funkcji lub linii odpowiedzialnej za przygotowanie / wyświetlenie nazwy wiadomości.

Po krótkim przeszukiwaniu kodu stwierdzono, że tekst nagłówka jest filtrowany (filtrowany) przez funkcję przed wyjściem. htmlspecialchars - ta funkcja jest potrzebna do konwersji specjalnych znaków HTML na bezpieczne dla użytkownika w przeglądarce.

Po usunięciu filtrowania tej funkcji przez wszystkie tytuły artykułów w obszarze administracyjnym wróciły na swoje miejsce. Funkcja htmlspecialchars jest używana dość często i odmowa jej użycia jest bardzo nierozsądną decyzją, musisz dowiedzieć się, dlaczego nie działa.

Po zbadaniu, jak w DLE w różnych modułach wywoływana jest ta funkcja, doszedłem do wniosku, że jest ona wywoływana bardzo często z jednym argumentem, a czasami flaga ENT_QUOTES jest przekazywana jako inny argument.

Odnosząc się do dokumentacji PHP, starannie rozważamy, jakie argumenty ta funkcja przyjmuje:

string htmlspecialchars (string $ string [, int $ flags = ENT_COMPAT | ENT_HTML401 [, string $ encoding = 'UTF-8' [, bool $ double_encode = true]]])

Zatem pierwszy argument jest linią do przetworzenia, drugi jest specjalną flagą wskazującą na niezbędne przetwarzanie, trzeci to kodowanie, czwarty to przełącznik wskazujący, czy konwertować istniejące podmioty HTML.

Tak więc domyślne flagi są używane ENT_COMPAT | ENT_HTML401, domyślne kodowanie to UTF-8, następny argument ... stop, stop ... domyślne kodowanie to UTF-8? - więc mam te same strony w CP1251, postanowiłem spróbować zmusić funkcje htmlspecialchars do określenia kodowania cp1251 i co myślisz, nazwy wiadomości zaczęły być wyświetlane poprawnie.

Postanowiłem poszukać w Google tego tematu i okazało się, że funkcja htmlspecialchars w PHP 5.4 działa poprawnie z kodowaniem UTF-8 CP1251, jeśli kodowanie jest zmuszone do przekazania pustego łańcucha, jak poniżej:

$ title = htmlspecialchars ($ str, ENT_COMPAT, ''); $ title = htmlspecialchars ($ str, ENT_QUOTES, '')

Po poprawieniu wszystkich funkcji w silniku za pomocą tekstów, wszystko stało się w porządku.

Jednak nawet po poprawieniu wszystkich funkcji htmlspecialchars, w niektórych modułach teksty mogą być wyświetlane w złym kodowaniu. Powodem tego może być funkcja htmlentities, która tłumaczy znaki HTMl na elementy. Wywoływanie go w skryptach odbywa się w taki sam sposób jak htmlspecialchars, więc powinieneś również przejrzeć wszystkie skrypty, w których ta funkcja jest i naprawić wywołanie.

Pozostaje do czynienia z pustą stroną podczas wyświetlania listy wiadomości według nazwy użytkownika.

Po znalezieniu modułu odpowiedzialnego za wyświetlanie tej strony, zacząłem przyglądać się, jak zamyka się wykonanie skryptu. Rozmieszczamy w różnych miejscach skryptu wynik debugowania i sprawdzamy, która część skryptu zatrzymuje debugowanie. Oto kod debugowania wstawek - proste echo, nie ma nic do wymyślenia:

echo „Testowanie 1”;

Zatrzymanie może nastąpić z powodu włączenia innego skryptu do skryptu, co oznacza, że ​​musi być również sondowana tą samą metodą, dopóki nie zostanie określony końcowy punkt martwy.

W ten sposób ustalono, że funkcja session_register () w jednym z modułów odpowiedzialnych za autoryzację skutkuje wtyczką. Po wywołaniu tej funkcji zmienne są inicjowane w globalnej tablicy $ _SESSION. Mając doświadczenie z sesjami, skomentowałem funkcje session_register () bez strachu, a problem z pustą stroną zniknął - wszystko jest wyświetlane w razie potrzeby, nie ma problemów z autoryzacją.

Oczywiście, możesz natychmiast przeszukać wszystkie skrypty pod kątem obecności w nich funkcji session_register i usunąć je tam, gdzie jest, ale chciałem ci powiedzieć, mój czytelniku, jak inaczej możesz złapać taki błąd.

Inne niekompatybilności PHP 5.4 zostały również sprawdzone pod kątem obecności witryn DLE w skryptach - nic więcej nie wymagało edycji.

Podsumowując, dopasowanie starego silnika DLE do pracy z PHP 5.4 jest następujące:

  • popraw wywołanie funkcji htmlspecialchars ().
  • napraw wywołanie funkcji htmlentities ().
  • usuń / skomentuj wywołania funkcji session_register ().

Poprawione

Powiem ci szczegółowo, jak szybko i wygodnie poprawisz skrypty silnika dowolnej wersji.

Czyszczenie funkcji session_register ().

  1. Do pracy potrzebujemy Total Commander i Notepad ++.
  2. Przesyłamy folder silnika z witryny na nasz lokalny komputer (jeśli na stronie znajdują się inne skrypty, na przykład forum, musisz je również skopiować do późniejszej edycji); Wykonujemy kopię archiwum z pobranymi plikami w bezpiecznym miejscu, na wypadek gdybyś musiał coś przynieść. Rozpakowanie kolejnej kopii plików (będziemy mieli je uruchomione) w dowolnym wygodnym folderze, na przykład d: Work.
  3. Otwórz folder z pobranymi skryptami w Total Commander i naciśnij ALT + F7 (szukaj), umieść „* szukaj plików” i zaznacz „Z tekstem” i wpisz „session_register (” i kliknij Szukaj;
  4. Po zakończeniu wyszukiwania znalezione pliki zostaną wyświetlone w dolnej części panelu, kliknij przycisk „Pliki w panelu” - lista ze znalezionymi plikami pojawi się w panelu Total Commander, zaznacz je prawym przyciskiem myszy i przeciągnij do Notepad ++.
  5. Każdy plik jest wyświetlany na karcie, w każdym pliku szukamy wywołania funkcji session_register z dowolnymi argumentami i całkowicie go usuwamy. Aby wygodnie wyszukiwać, naciśnij CTRL + F i przesuń panel wyszukiwania w prawo do krawędzi bez zamykania go, wpisz tam session_register i wyczyść wszystkie znalezione pliki z tej funkcji.

Dla większej jasności powyższego, oto kilka zrzutów ekranu procesu:

Rys. 1. Wyszukaj tekst w folderze za pomocą Total Commander.

Rys. 2. Zaznacz pliki do edycji w Total Commander.

Rys. 3. Wyszukaj kod i edytuj go w Notepad ++ (kliknij, aby powiększyć).

Poprawki Htmlspecialchars.

Tutaj będzie więcej pracy. Tak więc, analogicznie, szukamy wszystkich plików skryptowych, w których znajduje się fm htmlspecialchars, takich plików może być około 40-70 sztuk (w zależności od liczby zainstalowanych wtyczek i modułów do silnika), przeciągnij je do naszego ulubionego Notepad ++ i wprowadź zmiany w zależności od tego, jak nazywa się F, jest bardzo ważne!

a) Jeśli funkcja jest wywoływana z jednym argumentem, na przykład:

$ title = htmlspecialchars ($ title)
$ name = $ db-> safesql ($ parse-> process (htmlspecialchars (trim ($ _POST ['name']))))));

następnie dodajemy dwa dodatkowe argumenty, a następnie kierujemy je do następnego widoku:

$ title = htmlspecialchars ($ title, ENT_COMPAT, '')
$ name = $ db-> safesql ($ parse-> process (htmlspecialchars (trim ($ _POST ['name'])), ENT_COMPAT, '')));

b) Jeśli funkcja jest wywoływana z dwoma argumentami, na przykład w fullsearch.php:

$ tpl-> set ('{result-author}', „<a href="mailto:".htmlspecialchars($rowl'gast_email'yyör, ENT_QUOTES)."">”

następnie dodaj trzeci - pusty ciąg znaków, cytaty:

$ tpl-> set ('{result-author}', "<a href="mailto:".htmlspecialchars($rowrow'gast_email'yyör, ENT_QUOTES,'') .">"

c) Są chwile (jest tylko kilka, około 1-2 sztuk), w których nie musisz niczego dotykać, na przykład są to pliki editnews.php, registration.php:

$ name = $ db-> safesql (trim (htmlspecialchars ($ parse-> process (convert_unicode ($ _ POST ['name'], $ config ['charset'])))))));

Tutaj zmienna $ _POST ['name'] jest konwertowana na wymagane kodowanie przy użyciu funkcji convert_unicode, w której kodowanie jest określone dla wstępnej konwersji ze zmiennej systemowej $ config.

Konieczne jest staranne naprawienie wszystkich funkcji, spojrzenie na zagnieżdżanie i gdzie jest argument. Notepad ++ może podświetlić składnię - użyj jej, po umieszczeniu jednego z cudzysłowów, edytor podświetli ten, który zamyka pierwszy, jak na przykład z zagnieżdżonymi funkcjami:

$ db-> safesql (htmlspecialchars (trim ($ _ POST ['name']) ) ));

tutaj jest jasne, że przed podświetlonym cytatem należy dodać dwa argumenty oparte na opcjach podanych powyżej.

W podobny sposób szukamy i poprawiamy wszystkie wywołania funkcji htmlentities, będą one znacznie mniej - zazwyczaj kilka.

Po wszystkich edycjach zamknij edytor, spakuj foldery ze skryptami do archiwum i prześlij je do hostingu, rozpakuj archiwum z wymianą plików i ciesz się z rezultatu. Zaleca się usunięcie starych folderów za pomocą skryptów przed rozpakowaniem archiwum, będzie ono bardziej niezawodne i będziemy pewni, że mamy teraz niezbędne skrypty.

Jeśli zrobisz coś złego, wkrótce się pokaże i będziesz mógł to naprawić wystarczająco szybko.

Radzę również przejść przez wszystkie kluczowe momenty silnika i sprawdzić wydajność - zarejestrować użytkownika, przejść przez autoryzację, utworzyć wiadomość, przesłać zdjęcia, zapisać ustawienia w panelu administracyjnym.

Włączając naszą logikę i używając prostych dostępnych narzędzi, osiągnęliśmy pożądany rezultat. Po takich stosunkowo prostych, ale wielokrotnych operacjach, wydajność silnika DLE przeniesionego do PHP 5.4 zostanie przywrócona. Przynajmniej inne usterki nie zostały jeszcze zauważone)

Na koniec

W tym artykule z jednej strony próbowałem dotknąć złożonych problemów technicznych, az drugiej strony mogę wyjaśnić początkującemu, jak wszystko naprawić. Mimo, że praca okazuje się dużo, ale wciąż jest tańsza i bardziej praktyczna niż wykonanie downgrade'u PHP lub szhat do innego hostera, gdzie jest stary PHP 5.2.

Ponadto w PHP 5.4 istnieje wiele innowacji, które będą używane w nowych silnikach, z których możesz korzystać, a szybkość nowego PHP jest wyraźnie wyższa niż w wersji 5.2.

Z przyjemnością usłyszę wasze opinie i komentarze!

5.4.x?
Domyślne kodowanie to UTF-8?