Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Серверная оптимизация OpenCart


Recommended Posts

То есть вы будете спорить с профайлером? Время генерации страницы 0,5 сек, общее время запросов к БД 0,07. Профайлер показал, что для части модулей (например вывод категорий) большая часть времени тратится именно на рендинг.

 

 

т.е. нужен метод в каждом модуле который будет возвращать этот ключ исходя из состояния.

Я именно об этом и написал. Ключ зависит от модуля.

Надіслати
Поділитися на інших сайтах

Да пожалуйста. 10.000 товаров, ЧПУ включено, стоит сео-про с кешированием.

В среднем при переходе в категорию в модуле категорий вываливается около 100 категорий/подкатегорий.

Надіслати
Поділитися на інших сайтах

рендеринг это модуля зависит от path, если в магазине 100 категорий, это как минимум 100 разных cache'й нужно хранить

я ж говорю модуль не оптимизирован

вот хороший пример оптимизации

https://opencartforum.com/topic/3355-est-li-modul-analiza-log-failov/?do=findComment&comment=22909

попробуйте с ним протестировать производительность.

  • +1 1
Надіслати
Поділитися на інших сайтах

  • 1 month later...
 <?php
final class MySQL {
    private $link;
    
    public function __construct($hostname, $username, $password, $database) {
        if (!$this->link = ($GLOBALS["___mysqli_ston"] = mysqli_connect($hostname,  $username,  $password))) {
              trigger_error('Error: Could not make a database link using ' . $username . '@' . $hostname);
        }

                if (!((bool)mysqli_query( $this->link, "USE $database"))) {
                        trigger_error('Error: Could not connect to database ' . $database);
                }
        
        
        mysqli_query( $this->link, "SET NAMES 'utf8'");
        mysqli_query( $this->link, "SET CHARACTER SET utf8");
        mysqli_query( $this->link, "SET CHARACTER_SET_CONNECTION=utf8");
        mysqli_query( $this->link, "SET SQL_MODE = ''");
      }
        
      public function query($sql) {
        if ($this->link) {
                
                    if(!defined('IS_ADMIN')){
                           
                            $limit = 7;
                            $expire_default = 3600;
                            $expire_main = 3600 * 24 * 30;
                            $expire_product = 3600 * 7;
                            $tag_cache = array(
                                'main' => array(
                                    'expire' => false, 
                                ),
                                'Currency::__construct' => array(
                                    'expire' => $expire_main,
                                    'tag' => 'main',  
                                ),
                                'Weight::__construct' => array(
                                    'expire' => $expire_main,
                                    'tag' => 'main',
                                ),
                                'Length::__construct'=> array(
                                    'expire' => $expire_main,
                                    'tag' => 'main',
                                ),
                                'ModelDesignLayout::getLayout' => array(
                                    'expire' => $expire_main,
                                    'tag' => 'main',
                                ),
                                'ModelSettingExtension::getExtensions' => array(
                                    'expire' => $expire_main,
                                    'tag' => 'main',
                                ),
                                'ModelDesignBanner::getBanner' => array(
                                    'expire' => $expire_main,
                                    'tag' => 'main',
                                ),

                                'ModelCatalogProduct::getTotalProducts' => array(
                                    'expire' => $expire_product,
                                    'tag' => 'product',
                                ),
                                'ControllerCommonSeoUrl::rewrite' => array(
                                    'expire' => $expire_product,
                                    'tag' => 'product',
                                ),
                                'ControllerCommonSeoUrl::rewrite' => array(
                                    'expire' => $expire_product,
                                    'tag' => 'product',
                                ),
                                'ModelCatalogCategory::getCategories'=> array(
                                    'expire' => $expire_product,
                                    'tag' => 'product',
                                ),
                            );

                         
                            if(!Staticstore::get('expire_cache')){
                                mysqli_query($GLOBALS["___mysqli_ston"], "DELETE FROM " . DB_PREFIX . "cache WHERE expire < '" . time(true) . "' LIMIT $limit");
                                Staticstore::set('expire_cache', true);
                            }

                            $caller = debug_backtrace();
                            $hash = md5($sql);
                            $method = (!empty($caller[2]['class']) ? $caller[2]['class'].'::'.$caller[2]['function'] : 'main');
                            $expire = (isset($tag_cache[$method])) ?  (($tag_cache[$method]['expire']) ? time(true) + $tag_cache[$method]['expire'] : false) : time(true) + $expire_default;
                            $tag = (isset($tag_cache[$method]['tag'])) ? $tag_cache[$method]['tag'] : $method;


                            if($expire){
                                
                                if(isset($tag_cache[$method])){
                                    if($return = Staticstore::get($tag)){
                                           if (isset($return[$hash])){
                                               return unserialize($return[$hash]);
                                           }
                                    }else{
                                        $resource = mysqli_query($GLOBALS["___mysqli_ston"], "SELECT hash, data FROM " . DB_PREFIX . "cache WHERE tag = '" . $tag . "'");

                                        if($resource){
                                            $return = array();
                                            while ($result = mysqli_fetch_assoc($resource)) {
                                                 $return[$result['hash']] = $result['data'];
                                            }
                                            Staticstore::set($tag, $return);

                                            if(($return = Staticstore::get($tag)) && isset($return[$hash]))
                                                return unserialize($return[$hash]);
                                        }
                                    }
                                }

                                
                                $resource = mysqli_query($GLOBALS["___mysqli_ston"], "SELECT data FROM " . DB_PREFIX . "cache WHERE hash = '" . $hash . "'");
                                if (is_resource($resource)) {
                                    $result = mysqli_fetch_assoc($resource);
                                    if($result){
                                        return unserialize($result['data']);
                                    }
                                }
                            }
                    }     
                        
                        $resource = mysqli_query( $this->link, $sql);
                                                
                        
            if ($resource) {
                if (is_resource($resource)) {
                    $i = 0;
            
                    $data = array();
            
                    while ($result = mysqli_fetch_assoc($resource)) {
                        $data[$i] = $result;
                        $i++;
                    }
                    
                    ((mysqli_free_result($resource) || (is_object($resource) && (get_class($resource) == "mysqli_result"))) ? true : false);
                    
                    $query = new stdClass();
                    $query->row = isset($data[0]) ? $data[0] : array();
                    $query->rows = $data;
                    $query->num_rows = $i;
                    
                    unset($data);
                    
                                   
                                        if(!defined('IS_ADMIN'))
                                            $r = mysqli_query($GLOBALS["___mysqli_ston"], "INSERT INTO " . DB_PREFIX . "cache SET hash = '{$hash}', data = '" . $this->escape(serialize($query)) . "', tag = '{$tag}',  expire = '{$expire}' ");
                                            
                    return $query;    
                } else {
                    return true;
                }
            } else {
                trigger_error('Error: ' . ((is_object($this->link)) ? mysqli_error($this->link) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '<br />Error No: ' . ((is_object($this->link)) ? mysqli_errno($this->link) : (($___mysqli_res = mysqli_connect_errno()) ? $___mysqli_res : false)) . '<br />' . $sql);
                exit();
            }
        }
      }
    
    public function escape($value) {
        if ($this->link) {
            return mysqli_real_escape_string( $this->link, $value);
        }
    }
    
      public function countAffected() {
        if ($this->link) {
            return mysqli_affected_rows($this->link);
        }
      }

      public function getLastId() {
        if ($this->link) {
            return ((is_null($___mysqli_res = mysqli_insert_id($this->link))) ? false : $___mysqli_res);
        }
      }    
    
    public function __destruct() {
        if ($this->link) {
            ((is_null($___mysqli_res = mysqli_close($this->link))) ? false : $___mysqli_res);
        }
    }
}
?>

Что не так?

Надіслати
Поділитися на інших сайтах


Все сделал по инструкции, белый екран вместо сайта, что не так?

в конфиге прописал так

// DIR
define('IS_ADMIN', true);
define('DIR_APPLICATION', '/var/www/sites/1/kr/int/admin/');
 
 
стукните пм....за денежку даже помогите очень надо оптимизировать сайт.....
Надіслати
Поділитися на інших сайтах


  • 5 months later...

Всем кто дочитал эту тему до конца... не смотря на ее заброшенность.

хочу поделится опытом. был у меня магазин на оскоммерсе но большой на 23 тисчи товаров.

решил я его усовершенствовать и перенести на опенкарт. написал скриптик ... перетащил базу.

и началось... тормоза страшные. как оказалось опенкарт на выделенном сервере с оперативкой 512мб раз в 10 если не больше медленнее работает чем древний оскоммерс.

... и только благодаря этим скриптам удалось очень сильно ускорить загрузку страниц.

автору респект и моё личное почтение.

Надіслати
Поділитися на інших сайтах

Всем кто дочитал эту тему до конца... не смотря на ее заброшенность.

хочу поделится опытом. был у меня магазин на оскоммерсе но большой на 23 тисчи товаров.

решил я его усовершенствовать и перенести на опенкарт. написал скриптик ... перетащил базу.

и началось... тормоза страшные. как оказалось опенкарт на выделенном сервере с оперативкой 512мб раз в 10 если не больше медленнее работает чем древний оскоммерс.

... и только благодаря этим скриптам удалось очень сильно ускорить загрузку страниц.

автору респект и моё личное почтение.

У меня было в 2 раза больше товаров, и все прекрасно работало на обычном виртуальном хостинге, ИМХО у вас проблемы не в опенкарте искать надо, а в хостинге, ну или вы что-то сделали с движком, перегрузили его тяжелыми модулями, из-за чего полезли такие тормоза.

Надіслати
Поділитися на інших сайтах

У меня было в 2 раза больше товаров, и все прекрасно работало на обычном виртуальном хостинге, ИМХО у вас проблемы не в опенкарте искать надо, а в хостинге, ну или вы что-то сделали с движком, перегрузили его тяжелыми модулями, из-за чего полезли такие тормоза.

cкорее всего вы правы по поводу хостинга.

но я не рискнул в нем ковыряться... чтоб не навредить... тем более что опыта особого в настройке майескуел сервера нет.

а кеширование помогло...

Надіслати
Поділитися на інших сайтах

Vqmod нет, для тех кто с програмированием не очень дружит?

 

А если у меня в огороде 20 магазинов, вы предлагаете ручками накатывать ?

Надіслати
Поділитися на інших сайтах

У меня было в 2 раза больше товаров, и все прекрасно работало на обычном виртуальном хостинге, ИМХО у вас проблемы не в опенкарте искать надо, а в хостинге, ну или вы что-то сделали с движком, перегрузили его тяжелыми модулями, из-за чего полезли такие тормоза.

Поддержу.

Иногда подключено куча доп скриптов которые друг друга дублируют.

Есть схожая проблема.

Наверное придется просить дать в штат веб программиста, чтобы он под конкретные задачи писал скрипты, без подключения всяких библиотек и прочей лабуды. Например: нужно слайдер - пишет скрипт меняющий картинки местами, который берет их из определенной папки и ничего более.

Думаю время загрузки уменьшится в 2-3 раза, и время отклика элемента после нажатия тоже.

Конечно дорого, но всем советую.

Надіслати
Поділитися на інших сайтах


Поддержу.

Иногда подключено куча доп скриптов которые друг друга дублируют.

Есть схожая проблема.

Наверное придется просить дать в штат веб программиста, чтобы он под конкретные задачи писал скрипты, без подключения всяких библиотек и прочей лабуды. Например: нужно слайдер - пишет скрипт меняющий картинки местами, который берет их из определенной папки и ничего более.

Думаю время загрузки уменьшится в 2-3 раза, и время отклика элемента после нажатия тоже.

Конечно дорого, но всем советую.

 

Вы немного перегибаете, какой это должен быть слайдер, от которого будут тормоза? Подобные издержки акутальный на нагрузке от 50 000 хостов в сутки.

Изначальные тормоза опенкарта в подсчете товаров в категориях. В версии 1.5.5.x  - это побороли благодаря реализациям Toporchilo.

Следующий этап - кеширование основных повторяющихся элементов (меню, и стандартные модули). Если не помогает - тогда уже танцы с бубнами, денормализация базы, оптимизация запросов и наращивание железа.

Надіслати
Поділитися на інших сайтах

Проблема Опенкарта еще в том что в нем, из коробки, не реализовано кеширование отренденного модуля, а только запросов к БД, и нет возможности установить свое время жизни кеша для каждого случая кеширования. Хотя реализуется довольно просто.

Надіслати
Поділитися на інших сайтах

  • 3 months later...
  • 2 weeks later...
  • 3 months later...

Подыму ка я тему.

Есть сервер, комплектация его не имеет большого значения.

На днях озадачился, что как то не очень шустро на нем работает магазин.

В процесах обнаружился вечно на 99% висящий мускуль. Настройка мускуляя была по рекомендациям известного скрипта - /mysqltuner.pl, и тут мне на глаза попался сервис автогенерации файла my.cnf в зависимости от параметров сервера. Вот сам сервис - http://tools.percona.com/

Так вот моему удивлению не было предела, когда новом конфиге было рекомендовано отключить кеширование запросов в мускуле.

Но факт остается фактом, при включении кеша БД, скорость генерации страницы падат в 1,5-2 раза.

Дальше уже были попытки по добавлению индексов для таблиц, что позволило выиграть еще процентов 15% времени.

P.S. В базе несколько десятков тысяч товаров, около сотни категорий, и с пяток магазинов.

Надіслати
Поділитися на інших сайтах

Подыму ка я тему.

Есть сервер, комплектация его не имеет большого значения.

На днях озадачился, что как то не очень шустро на нем работает магазин.

В процесах обнаружился вечно на 99% висящий мускуль. Настройка мускуляя была по рекомендациям известного скрипта - /mysqltuner.pl, и тут мне на глаза попался сервис автогенерации файла my.cnf в зависимости от параметров сервера. Вот сам сервис - http://tools.percona.com/

Так вот моему удивлению не было предела, когда новом конфиге было рекомендовано отключить кеширование запросов в мускуле.

Но факт остается фактом, при включении кеша БД, скорость генерации страницы падат в 1,5-2 раза.

Дальше уже были попытки по добавлению индексов для таблиц, что позволило выиграть еще процентов 15% времени.

P.S. В базе несколько десятков тысяч товаров, около сотни категорий, и с пяток магазинов.

 

А чему вы удивляетес, очень жалко что вы параметров сервера не привели.

RAM -  дело для системы дефицитное. Она отдается и для PHP и для всех возможных кешей.

Опять же надо понимать какие именно кеши вы отключили  - кеши индексов, или кеши результатов запросов.

Так вот. Если у вас не хватает памяти для  хранения кешей и для swap, они сливаются на винт. В итоге поиск и обработка большого массива данных с винта, если он не SSD, может действительно быть в пару раз медленней, чем получение этих же данных непосредственно средствами SQL.

 

Такой же эффект появляется при установке memcache. Зачастую просто использование обычного родного кеша оказывается быстрее.

Надіслати
Поділитися на інших сайтах

А чему вы удивляетес, очень жалко что вы параметров сервера не привели.

RAM -  дело для системы дефицитное. Она отдается и для PHP и для всех возможных кешей.

Опять же надо понимать какие именно кеши вы отключили  - кеши индексов, или кеши результатов запросов.

Так вот. Если у вас не хватает памяти для  хранения кешей и для swap, они сливаются на винт. В итоге поиск и обработка большого массива данных с винта, если он не SSD, может действительно быть в пару раз медленней, чем получение этих же данных непосредственно средствами SQL.

 

Такой же эффект появляется при установке memcache. Зачастую просто использование обычного родного кеша оказывается быстрее.

query-cache-type = 0

query-cache-size = 0

А вот величина RAM здесь совсем не имеет значения, поскольку при установке любого значения (от минимального до оптимального), тут же падает скорость выборки.
Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.