Błąd krytyczny na stronach administracyjnych

15

Mam zainstalowany Magento 1.7 i do tej pory działał dobrze.

Codziennie importuję produkty. Jeśli jest jakiś nowy producent, dodaję go w rozwijanym atrybucie producenta.

Dzisiaj dodałem nową opcję producenta w zapleczu atrybutu i udałem się do importowania produktów, które z powodzeniem importowałem.

Ale potem próbuję otworzyć dowolną stronę w witrynie administratora Magento, kończy się to poniższym komunikatem o błędzie

Błąd krytyczny: nie można zastąpić ostatecznej metody Mage_Core_Model_Abstract :: clearInstance () w /var/www/html/app/code/core/Mage/Catalog/Model/Category.php w linii 36

Linia 36właśnie zaczęła się kręcić {dla tej klasy

class Mage_Catalog_Model_Category extends Mage_Catalog_Model_Abstract
{ <-- this is line 36

I sprawdziłem, Mage_Catalog_Model_Categoryale nie ma metody zdefiniowanej z nazwą clearInstance. To jest naprawdę denerwujące.

FYI: Nie dotknąłem ani jednego znaku kodu, używam strony ADMIN do importowania produktów i dodawania niektórych wymaganych atrybutów

światło słoneczne
źródło
Dlaczego -1? Jestem tutaj, aby uzyskać pomoc ludziom. Czy to nie jest miejsce do zadawania pytań na temat Magento.
światło słoneczne
Około -1, czasem ludzie dziwnie reagują ... O twoim problemie jest napisane w komunikacie o błędzie, po prostu go przeczytaj. „NIE MOŻNA NALEŻY PRZERWAĆ METODY KOŃCOWEJ ...”.
Starasz
@ SylvainRayé: Nawet nie dotknąłem ani jednego znaku kodu. Czy przeczytałeś pytanie ?, Używam tylko strony ADMIN do importowania produktu. To Magento rzuca błąd i znowu to Magento źle go koduje
światło słoneczne
@ SylvainRayé: Błąd nie jest tak drobny, jak myślisz, szczególnie, gdy pochodzi z kodu podstawowego, a nawet bez dotykania kodu.
światło słoneczne
Wróżki downvote są dość agresywne w tej społeczności, zignoruj ​​je. Może to być problem polegający na tym, że rozszerzenie innej firmy powoduje problem przez rozszerzenie lub zastąpienie klasy. Spróbuj wyłączyć wszystkie rozszerzenia innych firm, aby zobaczyć, czy to pomoże
Sander Mangel

Odpowiedzi:

5

Takie zachowanie zwykle by się nie zdarzyło, chyba że zmodyfikujesz kod Magento w jakikolwiek sposób - czy to za pomocą rozszerzeń innych firm, podstawowych edycji kodu lub ogólnych dostosowań.

Fakt, że występuje on w adminie, przed załadowaniem jakichkolwiek modeli danych (siatka produktu itp.) Sugerowałby, że przyczyną jest rozszerzenie - nie importowane dane.

Miało to miejsce w siatce produktów - wówczas mógł to być model produktu, który zawinił w wyniku nieudanego importu.

Ale po szybkim wyszukiwaniu istnieje wiele zindeksowanych wyników wyszukiwania Google sklepów Magento z tym samym błędem. Więc może być w centrum (choć nigdy się nie spotkaliśmy) - ale wątpię.

Patrząc na rdzeń w 1.7

+34 abstract class Mage_Catalog_Model_Abstract extends Mage_Core_Model_Abstract
+35 {
+36     /**
+37      * Identifuer of default store

Nie powinieneś mieć żadnego zastąpienia tej clearInstance()metody. W rzeczywistości metoda ta jest zadeklarowana tylko raz, wapp/code/core/Mage/Core/Model/Abstract.php

final public function clearInstance()

Widziałem błędy tego rodzaju występujące, gdy ludzie omyłkowo zastosowali się includedo przesłoniętej klasy (co powoduje, że jest ona ładowana dwukrotnie).


Najlepszym rozwiązaniem jest zastosowanie standardowej procedury debugowania

  1. Przywróć czysty rdzeń
  2. Przywróć czysty katalog adminhtml
  3. Zmień nazwę ./app/code/localkatalogu
  4. Zmień nazwę ./app/code/communitykatalogu

I sprawdź, czy problem nadal występuje.

Ben Lessani - Sonassi
źródło
3

problem dotyczy APC, wyłącz APC, a problem zniknie.

Calvin Muller
źródło
wyłączenie APC nie jest opcją. Ale dobry pomysł! Nigdy bym o tym nie pomyślał! @sunlight czy masz zainstalowanych więcej niż jedno Magento? i zdefiniowałeś ten sam prefiks? Może to być problem z innym sklepem w tej samej pamięci podręcznej.
Fabian Blechschmidt
3

przestrzeganie standardów php dla tego konkretnego błędu:

Błąd krytyczny: nie można zastąpić ostatecznej metody Mage_Core_Model_Abstract :: clearInstance () w /var/www/html/app/code/core/Mage/Catalog/Model/Category.php w linii 36

Oznacza to oczywiście, że masz rozszerzoną klasę Mage_Core_Model_Abstractużywając

class Mage_Catalog_Model_Category extends Mage_Catalog_Model_Abstract

i w tej klasie clearInstance()zdefiniowałeś jako funkcję.

Ponieważ clearInstance()funkcja jest funkcją końcową, więc nie można modyfikować tej funkcji w żadnej z rozszerzonych klas.

czym dokładnie jest twoja linia 36 poprzez dodanie jakiegoś kodu zastępczego powyżej i poniżej linii, którą zakładasz, to linia 36.

Widziałem programistów modyfikujących lub przeglądających pliki w określonym folderze, gdzie tak jak w przypadku kompilatora ustawionego na prawdziwą klasę plików php znajduje się w innym folderze.

Oscprofessionals
źródło
Sprawdziłem, nie mam żadnej metody o nazwie clearInstancew locali communitybasen. Jednak tymczasowo usunąłem ostatnie słowo kluczowe z deklaracji funkcji, aby rozwiązać problem, ale denerwuje mnie to, że kiedy dodałem finalsłowo kluczowe z powrotem przed funkcją, wszystko nadal działa poprawnie.
światło słoneczne
Prawdopodobnie twoja klasa zostanie uwzględniona dwukrotnie, jak stwierdził sonassi: Widziałem błędy tego rodzaju, gdy ludzie błędnie użyli opcji włączania dla przesłoniętej klasy (co powoduje, że jest ona ładowana dwukrotnie).
Oscprofessionals
2

Miałem ten sam problem z najnowszą wersją PHP 5.4 w innej wersji Magento (w obszarze frontend) i nie mogłem rozwiązać tego za pomocą kodu ani żadnych pamięci podręcznych. Czy sprawdziłeś wersję?

W takim przypadku warto spróbować przywrócić poprzednią wersję.

Nico Siebler
źródło
2

Właśnie tego doświadczyłem i znalazłem niepotwierdzone zgłoszenie błędu o bardzo podobnej konfiguracji.

To wydaje się być błędem w połączeniu z

  • PHP 5.4.12+
  • Magento 1.7.x (1.13.x EE)
  • APC (3.1.x)

Apache error_log pokazuje AH00052: potomny sygnał wyjściowy pid XX Błąd segmentacji (11)

Dwa najlepsze rozwiązania problemu w chwili, gdy się wydaje, to:

A) Zmień PHP na niższą działającą wersję, prawdopodobnie 5.4.11 lub niższą.

B) Wyłącz APC, jeśli nie jest to możliwe, patrz A. :)

B00MER
źródło
Mam ten sam problem z PHP 5.3.27 z MariaDB, Magento 1.7.0.2, bez APC. Im też używam Varnish + nginx. Jest to przejściowy problem, który czasami zmusza do ponownego uruchomienia php-fpm, lakieru, nginx itp. Nawiasem mówiąc, nie znalazłem nigdzie żadnej innej nie-podstawowej metody clearInstance. Może jest coś z klasami dwa razy. Ale to dziwne, ponieważ gdyby był to błąd analizatora składni, zdarzałoby się to za każdym razem.
Ricardo Martins,
1

Rozwiązałem ten problem dla Magento 1.9, zmieniając sposób działania PHP (w panelu kontrolnym hostingu przesunąłem Uruchom PHP jako ... na Szybką aplikację CGI). Nie mam pojęcia, jakie inne konsekwencje ma ta zmiana. W tej chwili próbuję to rozgryźć.

matthijshofstede
źródło
0

Spodziewałem się tego samego problemu. Nigdzie poza pulą rdzeniową nie było deklaracji metody clearInstance .

Analizowałem mój nginx access.log i error.log i zauważyłem, że błędy te pojawiają się, gdy boty Google i Bing odwiedzają moją witrynę tysiąc razy w ciągu kilku minut w różnych adresach URL, wysyłając wiele zapytań i zapytań z Magento. To wszystko zdejmuje moją stronę.

Wydaje mi się, że to naprawiłem, zmniejszając moc robota Google i bing na panelach ich webmastera.

Możesz użyć GoAccess lub Request Log Analyzer do analizy pliku dziennika i zobaczenia najczęściej odwiedzanego klienta użytkownika.

Ricardo Martins
źródło