Prawidłowa metoda opróżniania pamięci podręcznej i zarządzania kompilatorem

25

Chciałbym wiedzieć, czy istnieje jakaś preferowana procedura dla następujących czynności:

  1. Opróżnianie pamięci podręcznej Magento
  2. Włączanie / wyłączanie kompilatora Magento

1. Opróżnianie pamięci podręcznej Magento

Jest tu kilka opcji, a mianowicie:

  • Sprawdzanie elementów zamówienia i przesyłanie odświeżenia z Actionsmenu rozwijanego
  • Kliknięcie Flush Magento Cacheprzycisku i
  • Kliknięcie Flush Storage Cacheprzycisku

Czy istnieje jakaś preferowana kolejność ich wykonywania? Jaka jest różnica między pamięcią podręczną Magento a pamięcią podręczną?

2. Włączanie / wyłączanie kompilatora Magento

a) Włączanie kompilatora

Jeśli chodzi o włączenie kompilatora Magento, czy należy włączyć wszystkie pamięci podręczne sklepów? A może buforowanie należy aktywować dopiero po włączeniu kompilatora i uruchomieniu procesu kompilacji? Po włączeniu kompilatora należy odświeżyć wszystkie pamięci podręczne? A jeśli tak, to czy obejmuje to opróżnianie pamięci podręcznej i pamięci podręcznej Magento (jak wspomniano powyżej)

b) Wyłączanie kompilatora

Jeśli chodzi o wyłączenie kompilatora Magento, należy najpierw wyłączyć wszystkie pamięci podręczne, a następnie włączyć je ponownie po wyłączeniu?

Czy jest jakaś różnica między pozostawieniem włączonych pamięci podręcznych a wyłączeniem / włączeniem kompilatora? Jaki to ma wpływ na wydajność?

Wszelkie uwagi będą mile widziane

Łoś
źródło
Łatwo to zapamiętać. Nie opróżniaj pamięci podręcznej w sklepie produkcyjnym. Nie włączaj pamięci podręcznej w sklepie deweloperskim.
Ben Lessani - Sonassi
1
A jeśli opróżnianie pamięci podręcznej w sklepie produkcyjnym powoduje awarię witryny, nie wykonano wystarczającej liczby testów na serwerze pomostowym i doszło do uszkodzenia kodu, stąd „Nie włączaj pamięci podręcznej w sklepie programistycznym”. Opróżnianie pamięci podręcznej nigdy nie powinno powodować awarii Magento. Błąd CBR (Zatwierdź przed przygotowaniem)
Fiasco Labs

Odpowiedzi:

20

Opróżnij pamięć podręczną Magento - Czyści pamięć podręczną (var / cache) wszystkich elementów, które Magento wie, że utworzyła.

Opróżnij pamięć podręczną - czyści wszystko w var / cache, niezależnie od tego, jak te pliki zostały utworzone.

Jeśli więc chcesz być bezpieczny, czyścisz wszystko, możesz wybrać opcję „ Opróżnij pamięć podręczną ”, która zasadniczo wyczyści pamięć var ​​/ cache.

W przypadku kompilatora zalecam opróżnienie pamięci podręcznej Magento po włączeniu kompilacji i uruchomieniu procesu kompilacji. Zapewnia to wyczyszczenie pamięci podręcznej z wszelkich nieskompilowanych danych.

Podczas wyłączania kompilacji najpierw ją wyłączam, a następnie opróżniam pamięć podręczną Magento. To ponownie zapewnia, że ​​pamięć podręczna nie zawiera żadnych skompilowanych danych.

O ile nie testujesz dużo rzeczy, zawsze zalecałbym pozostawienie pamięci podręcznej włączonej. Kompilację można przeoczyć lub przeoczyć pod względem wydajności. Widziałem, jak to przyspiesza, i wiele razy widziałem, że kompilacja spowalnia pracę i powoduje problemy z rozszerzeniami innych firm. Polecam uzyskanie linii bazowej dla czasu ładowania strony kategorii (przy użyciu Firebug / narzędzi programistycznych) przy wyłączonej kompilacji, a następnie ponownie przy włączonej kompilacji i sprawdzanie, czy istnieje duża różnica.

Lepiej byłoby użyć takich rzeczy, jak pamięć podręczna opcode w PHP, właściwe buforowanie zapytań MySQL, łączenie plików css / js, kompresja gzip, rozszerzenie Full Page Cache i odpowiednie ustawienia buforowania plików przez przeglądarkę.

Rob Mangiafico
źródło
15

Pamięć podręczna Magento nie jest inna. Zaczynając od podstaw, opcje pamięci podręcznej można przeglądać, przechodząc do

System-> Zarządzanie pamięcią podręczną

w backend. Możesz zobaczyć różne obszary buforowania, które można włączyć / wyłączyć, takie jak dowolne konfiguracje, layout.xml, bloki, pełne strony i pliki API. Oczywiście idealnym rozwiązaniem jest włączenie wszystkich tych funkcji po uruchomieniu witryny.

Pamięć podręczną można również wyczyścić lub opróżnić z tego miejsca. Naciśnięcie przycisku oznaczonego “Flush Magento Cache”spowoduje opróżnienie wszystkich plików pamięci podręcznej, które pasują do określonego zestawu wbudowanych domyślnych tagów używanych przez Magento. Jest to „bezpieczniejszy” sposób na wyczyszczenie pamięci podręcznej, ponieważ nie usuwa absolutnie wszystkiego. Jeśli korzystasz z dodatkowych typów pamięci podręcznej, kliknięcie “Flush Cache Storage”zapewni wyczyszczenie pamięci podręcznej, ponieważ powoduje wyczyszczenie WSZYSTKIEGO. Pozostałe dwa przyciski widoczne na stronie administratora wyczyszczą javascript i css oraz obrazy katalogu.

Alternatywnym i nieco mniej bezpiecznym sposobem na wyczyszczenie pamięci podręcznej jest przejście do

websiteroot / var / cache

i ręcznie usuwając wszystkie pliki. To samo dotyczy

websiteroot / var / full_page__cache

jeśli masz włączone pełne buforowanie strony.

Pełny bufor strony, dostępny w wersji Enterprise Edition, przyspiesza witrynę 10-krotnie, ale ważne jest, aby wiedzieć o niej trochę, na wypadek, gdybyś zauważył, że buforowana jest zawartość dynamiczna. Ciekawym plikiem do obejrzenia jest

websiteroot / app / code / core / Enterprise / PageCache / etc / cache.xml

Tutaj możesz zobaczyć, co jest buforowane przez FPC, nazwę bloku, nazwę kontenera i czas życia sesji. Jeśli uznasz, że absolutnie konieczna jest edycja lub usunięcie któregokolwiek z tych bloków z pamięci podręcznej, możesz to zrobić, tworząc moduł zależny od modułu PageCache i umieszczając w nim wszelkie modyfikacje.

Znacznik zastępczy informuje FPC, że ten blok jest uważany za dynamiczny. Po załadowaniu strony, jeśli blok nie jest jeszcze w pamięci podręcznej, ta wartość identyfikatora w znacznikach zastępczych jest wyszukiwana w pamięci podręcznej, a jeśli nie istnieje, wówczas ten blok jest wywoływany i generowany, a identyfikator jest dodawany do pamięć podręczna.

Funkcję kompilacji Magento można znaleźć pod

System> Narzędzia> Kompilacja

Jeśli uruchamiasz nową instalację, prawdopodobnie pojawi się komunikat systemowy, że oba includes and includes/src/katalogi muszą mieć możliwość zapisu. Gdy to zrobisz, możemy nacisnąć przycisk „Uruchom proces kompilacji” i po prostu gotowe, rdzeń Magento korzysta z kompilacji.

Kiedy Magento kompiluje swój kod źródłowy, framework robi kilka rzeczy. Być albo wywołane przez administratora lub shell, see shell/compiler.phpwszystkie kompilacji odbywa się za pomocą jednej klasy: Mage_Compiler_Model_Process. W tej klasie znajdziesz następujący fragment, który jest w rzeczywistości widokiem z lotu ptaka na cały proces.

/**
     * Run compilation process
     *
     * @return Mage_Compiler_Model_Process
     */
    public function run()
    {
        $this->_collectFiles();
        $this->_compileFiles();
        $this->registerIncludePath();
        return $this;
    }

Rozpoczęty $this->_collectFiles();rozmową Magento kopiuje wszystkie pliki PHP z obu

aplikacja / kod

i katalogi lib do

/ obejmuje / src

informator. Jak widać na poniższym fragmencie: podczas tego procesu Magento rekurencyjnie iteruje wszystkie pliki i katalogi. Te ścieżki są ostatecznie używane jako nazwa pliku. Gdy proces rekurencyjny trafi do pliku, sprawdzi, czy nie ma rozszerzenia PHP, a gdy zostanie znaleziony, plik zostanie skopiowany do katalogu kompilatora. Inne typy plików pozostają nietknięte.

Na przykład: ścieżka dla klasy Mage_Catalog_Model_Category była

app / code / core / Mage / Catalog / Model / Category.php

ale z włączoną kompilacją stał się teraz

zawiera / src / Mage_Catalog_Model_Category.php

/**
     * Copy files from all include directories to one.
     * Lib files and controllers files will be copied as is
     *
     * @return Mage_Compiler_Model_Process
     */
    protected function _collectFiles()
    {
        $paths  = $this->_getIncludePaths();
        $paths  = array_reverse($paths);
        $destDir= $this->_includeDir;
        $libDir = Mage::getBaseDir('lib');

        $this->_mkdir($destDir);
        foreach ($paths as $path) {
            $this->_controllerFolders = array();
            $this->_copy($path, $destDir); // this one will run recursively through all directories
            $this->_copyControllers($path);
            if ($path == $libDir) {
                $this->_copyAll($libDir, $destDir);
            }
        }

        $destDir.= DS.'Data';
        $this->_mkdir($destDir);
        $this->_copyZendLocaleData($destDir);
        return $this;
    }

Kontrolery otrzymują inne leczenie. Wszystkie katalogi kontrolera są kopiowane

zawiera / src /

ale są przechowywane w katalogu, który ma nazwę pokrewnej przestrzeni nazw, pomyśl: Mage, Enterprise lub własną podaną przestrzeń nazw.

W tych katalogach przestrzeni nazw kontrolery są przechowywane dla każdego modułu, a struktura katalogu kontrolera pozostaje nietknięta. To samo dotyczy nazwy pliku, to tylko dokładna kopia. Całą tę logikę można znaleźć w następującej metodzie$this->_copyControllers($path);

Ten drugi poziom kompilacji zbiera wszystkie zakresy i odpowiednie listy klas od administratora. Wszystkie te zakresy są przetwarzane przez pobranie zawartości powiązanych plików klas i zapisanie ich w jednym pliku nazwanym na podstawie podanego zakresu.

/**
     * Compile classes code to files
     *
     * @return Mage_Compiler_Model_Process
     */
    protected function _compileFiles()
    {
        $classesInfo = $this->getCompileClassList();

        foreach ($classesInfo as $code => $classes) {
            $classesSorce = $this->_getClassesSourceCode($classes, $code);
            file_put_contents($this->_includeDir.DS.Varien_Autoload::SCOPE_FILE_PREFIX.$code.'.php', $classesSorce);
        }

        return $this;
    }

Domyślnie Magento tworzy cztery różne pliki zakresu:

__default.php, __catalog.php, __checkout.php i __cms.php

Podczas procesu budowania tych plików zakresu Magento automatycznie analizuje wszystkie rozszerzenia klas i interfejsy, które są używane przez klasy znajdujące się na liście zakresów.

Po zainstalowaniu i skompilowaniu wszystkich plików Magento jest gotowy do włączenia funkcji kompilacji do użycia.

Na koniec dostosowywana jest konfiguracja związana z kompilacją. Ten plik można znaleźć w includes/config.phpi zawiera następujące dwie stałe. Po włączeniu kompilacji wiersz dotyczący COMPILER_INCLUDE_PATH nie jest komentowany i dlatego jest gotowy do działania.

> #define('COMPILER_INCLUDE_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR.'src');
> #define('COMPILER_COLLECT_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR.'stat');

Kod odpowiedzialny za dostosowanie pliku konfiguracyjnego można znaleźć w metodzie registerIncludePath metody Mage_Compiler_Model_Process class.

Podczas ładowania początkowego plik konfiguracyjny kompilacji jest zawarty w pliku index.php file (around line 44). Dzięki temu stałe include_path są dostępne w całym frameworku. Ścieżkę zbierania można włączyć tylko ręcznie, aby uzyskać więcej informacji statystycznych dotyczących wykorzystania skompilowanych plików. To nie powinno być włączone na żywo.

/**
 * Compilation includes configuration file
 */
$compilerConfig = 'includes/config.php';
if (file_exists($compilerConfig)) {
    include $compilerConfig;
}

Od tego momentu Magento sprawdzi, czy tryb kompilacji jest włączony za pomocą następującej instrukcji. Przeglądając bazę kodu (używając „grep”) zauważysz, że większość tej logiki można znaleźć w lib/Varien/Autoload.phppliku.

if (defined('COMPILER_COLLECT_PATH')) {
            // do stuff
        }

Innym miejscem do poszukiwania jest Mage_Core_Controller_Varien_Action. W tej klasie znajdziesz preDispatch()metodę, która jest wyzwalana dla każdej metody akcji kontrolera, zanim metoda zostanie faktycznie wywołana. W tej części źródłowej klasy autoloadera Magento wzywa się Varien_Autoload do załadowania określonego pliku zakresu kompilacji.

 Mage::dispatchEvent('controller_action_predispatch', array('controller_action'=>$this));
        Mage::dispatchEvent(
            'controller_action_predispatch_'.$this->getRequest()->getRouteName(),
            array('controller_action'=>$this)
        );
        Varien_Autoload::registerScope($this->getRequest()->getRouteName()); // right here
        Mage::dispatchEvent(
            'controller_action_predispatch_'.$this->getFullActionName(),
            array('controller_action'=>$this)
        );

Podczas pracy w trybie kompilacji Magento ma tylko jedną ścieżkę dołączania, includes/src/katalog, więc każdy plik znajduje się bezpośrednio przy pierwszej próbie. Dzięki znacznej liczbie plików, które posiada Magento, oszczędza to sporo czasu. Poniższy fragment pochodzi z

app / Mage.php

if (defined('COMPILER_INCLUDE_PATH')) {
    $appPath = COMPILER_INCLUDE_PATH;
    set_include_path($appPath . PS . Mage::registry('original_include_path'));
    include_once "Mage_Core_functions.php";
    include_once "Varien_Autoload.php";
} else {
    /**
     * Set include path
     */
    $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'local';
    $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'community';
    $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'core';
    $paths[] = BP . DS . 'lib';

    $appPath = implode(PS, $paths);
    set_include_path($appPath . PS . Mage::registry('original_include_path'));
    include_once "Mage/Core/functions.php";
    include_once "Varien/Autoload.php";
}

Gdy PHP zawiera plik, zawartość jest kompilowana do opcode. Jest to proces, który należy wykonać za każdym razem, gdy plik jest dołączany. Aby jeszcze bardziej poprawić wydajność swojego sklepu, możesz zainstalować APC na swoim serwerze. APC buforuje zakodowane wersje plików, udostępniając je dla kolejnych żądań. Tak więc na następne żądanie: plik zostanie odczytany z pamięci podręcznej APC, zamiast ponownie przejść ten sam proces i obniżyć wydajność.

TBI Infotech
źródło
3

KOMPILATOR

Wszystkie pliki kompilatora można znaleźć w includes/Po prostu nie czyść .htaccesslub config.php. Jeśli zobaczysz config.phpZauważysz, że wszystkie włączanie / wyłączanie kompilatora powoduje usuwanie komentarzy #przed tymi dwoma define. Można bezpiecznie założyć, że prosty rm -Rf includes/src;rm -Rf includes/statz katalogu głównego Magento wyczyści skompilowane dane.

Rozważ także użycie AOE_ClassPathCache wraz z APC, ponieważ będzie to zdecydowanie wystarczające, aby usunąć kompilator z równania.

Również więcej dyskusji na ten temat:


DACHY

Jest to ściśle określone na podstawie backendów buforowania, z których korzystasz local.xml. Jeśli używasz domyślnego modułu filesobsługi pamięci podręcznej, to czyścisz, var/cachea jeśli Enterprise var/full_page_cache. Jeśli używasz magazynu danych, takiego jak Memcache, musisz to zrobić za pośrednictwem Magento Flush Cache Storagelub za pomocą środków, które muszą wyczyścić / wyczyścić pamięć podręczną.

Również więcej szczegółów na temat możliwych magazynów danych, Magento używa Zend_Cache do swoich mechanizmów buforowania. Zauważysz, że dotyczą local.xmlXpaths z pamięci podręcznej.


UWAGA

Jeśli korzystasz z wersji Enterprise, znajdziesz drugi plik konfiguracyjny, w etc/enterprise.xmlktórym zdefiniowany jest magazyn danych dla FPC.

Jaka jest różnica między pamięcią podręczną i opróżnianiem pamięci podręcznej:

B00MER
źródło
0

Bardzo ważna uwaga na temat kompilatora Magento. Musisz wyłączyć takie rzeczy jak APC podczas kompilacji, ponieważ kompilator nie może skompilować zawartości APC i spowoduje uszkodzenie twojej kompilacji. Dla mnie oznaczałoby to rozładowanie APC na serwerze, a następnie ponowne uruchomienie Apache (httpd).

użytkownik3317382
źródło