Magento cache cũng không khác. Bắt đầu với những điều cơ bản, các tùy chọn bộ đệm có thể được xem bằng cách điều hướng đến
Hệ thống-> Quản lý bộ đệm
trong phần phụ trợ. Bạn có thể thấy các khu vực khác nhau của bộ nhớ đệm có thể được bật / tắt, chẳng hạn như bất kỳ cấu hình, layout.xml, khối, trang đầy đủ và các tệp api. Rõ ràng lý tưởng là để tất cả những thứ này được kích hoạt một khi trang web hoạt động.
Bộ nhớ cache cũng có thể bị xóa hoặc xóa, từ đây. Nhấn nút có nhãn “Flush Magento Cache”
sẽ xóa bất kỳ tệp bộ đệm nào khớp với một bộ thẻ mặc định được tích hợp sẵn mà Magento sử dụng. Đây là cách an toàn hơn để xóa bộ nhớ cache, vì nó không xóa tất cả mọi thứ. Nếu bạn đang sử dụng bất kỳ loại bộ đệm thứ cấp nào, thì nhấp vào “Flush Cache Storage”
sẽ đảm bảo bạn đã xóa bộ đệm của mình, vì nó sẽ xóa MỌI THỨ. Hai nút khác bạn thấy trên trang quản trị sẽ xóa javascript và css và danh mục hình ảnh.
Một cách khác và ít an toàn hơn để xóa bộ nhớ cache là điều hướng đến
websiteroot / var / cache
và xóa thủ công tất cả các tập tin. Tương tự cho
websiteroot / var / full_page__cache
nếu bạn đã bật bộ đệm toàn bộ trang.
Bộ nhớ cache toàn trang, có sẵn trên Phiên bản doanh nghiệp, tăng tốc trang web của bạn lên gấp 10 lần, nhưng điều quan trọng là phải biết một chút về nó, chỉ trong trường hợp bạn nhận thấy bất kỳ nội dung động nào được lưu trữ. Một tập tin thú vị để xem là
websiteroot / app / code / core / Enterprise / PageCache / etc / cache.xml
Tại đây bạn có thể thấy những gì đang được lưu trong bộ nhớ cache của FPC, tên khối, tên vùng chứa và thời gian tồn tại của phiên. Nếu bạn thấy cần phải chỉnh sửa hoặc xóa bất kỳ khối nào trong số các khối này khỏi bộ đệm, bạn có thể làm như vậy bằng cách tạo một mô-đun phụ thuộc vào mô-đun PageCache và đặt bất kỳ sửa đổi nào trong đó.
Thẻ giữ chỗ cho FPC biết rằng khối đó được coi là động. Khi một trang được tải, nếu khối chưa có trong bộ đệm, giá trị ID này trong các thẻ giữ chỗ được tìm kiếm trong bộ đệm và nếu nó không tồn tại, thì khối đó được gọi và tạo và ID được thêm vào bộ đệm.
Tính năng biên dịch của Magento có thể được tìm thấy dưới
Hệ thống> Công cụ> Biên dịch
Nếu bạn đang chạy một bản cài đặt mới, bạn có thể nhận được một thông báo hệ thống rằng cả hai includes and includes/src/
thư mục phải được ghi. Khi hoàn thành, chúng ta có thể nhấn nút 'Chạy quá trình biên dịch' và về cơ bản bạn đã hoàn thành, lõi Magento đang sử dụng quá trình biên dịch.
Khi Magento biên dịch mã nguồn, khung công tác sẽ thực hiện một số điều. Được kích hoạt thông qua quản trị viên hoặc shell, see shell/compiler.php
, tất cả quá trình biên dịch được thực hiện bởi một lớp duy nhất : Mage_Compiler_Model_Process
. Trong lớp này, bạn sẽ tìm thấy đoạn trích sau đây thực sự là một cái nhìn toàn cảnh về toàn bộ quá trình.
/**
* Run compilation process
*
* @return Mage_Compiler_Model_Process
*/
public function run()
{
$this->_collectFiles();
$this->_compileFiles();
$this->registerIncludePath();
return $this;
}
Bắt đầu bằng $this->_collectFiles();
cuộc gọi, Magento sao chép tất cả các tệp PHP từ cả hai
ứng dụng / mã
và thư mục lib đến
/ bao gồm / src
danh mục. Như bạn có thể thấy trong đoạn trích dưới đây: trong quá trình này, Magento lặp lại đệ quy thông qua tất cả các tệp và thư mục. Những đường dẫn này cuối cùng được sử dụng làm tên tệp. Khi quá trình đệ quy chạm vào một tệp, nó sẽ kiểm tra phần mở rộng PHP và khi tìm thấy, tệp sẽ được sao chép vào thư mục trình biên dịch. Các loại tập tin khác được giữ nguyên.
Ví dụ: đường dẫn cho lớp Mage_Catalog_Model_Carget là
ứng dụng / mã / lõi / Pháp sư / Danh mục / Mô hình / Danh mục.php
nhưng, với tính năng biên dịch được kích hoạt, giờ đã trở thành
bao gồm / src / Mage_Catalog_Model_Carget.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;
}
Kiểm soát đang nhận được một điều trị khác. Tất cả các thư mục điều khiển được sao chép vào
bao gồm / src /
nhưng được lưu trữ trong một thư mục có tên của không gian tên liên quan, hãy nghĩ: Mage, Enterprise hoặc không gian tên đã cho của riêng bạn.
Trong các thư mục không gian tên này, các bộ điều khiển được lưu trữ trên mỗi mô-đun và cấu trúc thư mục của bộ điều khiển được giữ nguyên. Tương tự với tên tệp, nó chỉ là một bản sao chính xác. Tất cả logic này có thể được tìm thấy trong phương pháp sau$this->_copyControllers($path);
Cấp độ biên dịch thứ hai này thu thập tất cả các phạm vi và danh sách lớp tương ứng của chúng từ quản trị viên. Tất cả các phạm vi này đang được xử lý bằng cách tìm nạp nội dung của các tệp lớp liên quan và ghi chúng vào một tệp duy nhất được đặt tên theo phạm vi đã cho.
/**
* 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;
}
Theo mặc định Magento tạo bốn tệp phạm vi khác nhau:
__default.php, __catalog.php, __checkout.php và __cms.php
Trong quá trình xây dựng các tệp phạm vi này, Magento sẽ tự động phân tích tất cả các phần mở rộng lớp và giao diện đang được sử dụng bởi các lớp được cung cấp trong danh sách phạm vi.
Với tất cả các tệp được đặt và biên dịch, Magento sẵn sàng kích hoạt tính năng biên dịch để sử dụng.
Cuối cùng nhưng không kém phần cấu hình liên quan đến việc biên dịch được điều chỉnh. Tập tin này có thể được tìm thấy tại includes/config.php
và giữ hai hằng số sau. Khi cho phép biên dịch, dòng liên quan đến COMPILER_INCLUDE_PATH không bị thiếu và do đó sẵn sàng hành động.
> #define('COMPILER_INCLUDE_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR.'src');
> #define('COMPILER_COLLECT_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR.'stat');
Mã chịu trách nhiệm điều chỉnh tệp cấu hình có thể được tìm thấy trong phương thức registerIncludePath của Mage_Compiler_Model_Process class
.
Trong quá trình bootstrap, tệp cấu hình biên dịch được bao gồm trong index.php file (around line 44)
. Điều này làm cho các hằng số include_path có sẵn trong toàn bộ khung. Coll_path là thứ bạn chỉ có thể kích hoạt thủ công để có thêm thông tin thống kê về việc sử dụng các tệp được biên dịch của bạn. Điều này không nên được kích hoạt trực tiếp.
/**
* Compilation includes configuration file
*/
$compilerConfig = 'includes/config.php';
if (file_exists($compilerConfig)) {
include $compilerConfig;
}
Từ thời điểm này, Magento sẽ kiểm tra xem chế độ biên dịch có được bật với câu lệnh sau hay không. Đi qua codebase (sử dụng 'grep') bạn sẽ nhận thấy rằng hầu hết logic này có thể được tìm thấy trong lib/Varien/Autoload.php
tệp.
if (defined('COMPILER_COLLECT_PATH')) {
// do stuff
}
Nơi khác để tìm là Mage_Core_Controller_Varien_Action
. Trong lớp này, bạn sẽ tìm thấy preDispatch()
phương thức, được kích hoạt cho mỗi phương thức hành động của bộ điều khiển trước khi phương thức thực sự được gửi đi. Trong phần này của lớp trình tải tự động của Magento, Varien_Autoload đang được yêu cầu tải một tệp phạm vi biên dịch cụ thể.
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)
);
Khi chạy trong chế độ biên dịch, Magento chỉ có một đường dẫn bao gồm duy nhất, includes/src/
thư mục, vì vậy mỗi tệp được tìm thấy trực tiếp ở lần thử đầu tiên. Với số lượng đáng kể các tệp mà Magento có, việc này giúp tiết kiệm khá nhiều thời gian. Đoạn mã bên dưới được lấy từ
ứng dụng / 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";
}
Khi PHP bao gồm một tệp, nội dung được biên dịch thành opcode. Đây là một quá trình cần phải được thực hiện mỗi khi bao gồm một tập tin. Để cải thiện hiệu suất của cửa hàng của bạn hơn nữa, bạn có thể cài đặt APC trên máy chủ của mình. APC lưu trữ các phiên bản mã hóa của các tệp, làm cho chúng có sẵn cho các yêu cầu tiếp theo. Vì vậy, theo yêu cầu tiếp theo: tệp sẽ được đọc từ bộ đệm APC, thay vì phải trải qua quá trình tương tự một lần nữa và làm cạn kiệt hiệu suất của bạn.