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

блог для натуралов

  • записів
    10
  • коментаря
    72
  • переглядів
    9 030

долго грузится сайт на opencart


kJlukOo

1 031 перегляд

Причин может быть масса от конфига сервера, до тяжелых запросов к бд, проблемы с dns, cdn и тд

Возьмем то случай, когда ваш VPS имеет много ресурсов и настроен серьезным специалистом, а  значит проблема на стороне опенкарта и плагинов, которые были установлены

 

Обычно первым делом включают лог тяжелых запросов. Опенкарт в момент создания таблицы выбирает тип таблиц ENGINE=MyISAM. Этот тип может блокировать таблицы, именно поэтому в логе можно встретить простейшие запросы выполняющиеся по 2+ секунды. Лучше перейти на innodb. На просторах гитхаба есть скрипт, который поможет сменить движок хранилища, а так же добавить индексы к таблицам. Кстати, индексы он добавляет всем столбцам, которые содержат подстроку "_id" 

https://github.com/lilalaunesau/opencart-turbo

 

Но одним логом сыт не будешь и поэтому я написал решение, которое покажет время работы каждого контроллера на странице.

Предварительно желательно отключить кеширование mysql. За это отвечают такие параметры конфигурации как 

query_cache_size        = 0
query_cache_type        = 0

 

С скрина, который прикреплен к этому посту можно сделать вывод, что менюшка не кешируется и грузится около 640мс

Один из моих модулей отрабатывает за 100мс, что тоже не есть хорошо, но с учетом того что на этой странице таблица из 10+ товаров, то норм

Футер тоже можно закешировать сэкономив около 300мс

 

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

 

Screenshot_5.png

  • +1 7

17 коментарів


Recommended Comments

Тема интересная. Жаль не набралось тех самых 5 коментов. Может есть смысл уже поделится этим  решением. А там и постов добавится.

Надіслати

Второй Третий комментарий – для пользы сообществу.

25.07.2024 в 01:27, Tom сказал:

Может есть смысл уже поделится этим  решением. А там и постов добавится.

Поддержу!

Надіслати
25.07.2024 в 12:17, Flint2000 сказал:

404

  Показать содержимое

image.thumb.png.8edeacccc60741f14062701307ffff81.png

 

так задумано :grin:

ищите проблему и пул реквест засылайте. одобрю

на чистом окстор 3 и 23 и работает норм. еще на десятке боевых магазинов стабильно отрабатывало

Надіслати
25.07.2024 в 13:07, kJlukOo сказал:

ищите проблему и пул реквест засылайте. одобрю

 

:-D Це потрібно ще головоломку розв’язати? Як можна зробити реквест на 404 репозиторій?

Надіслати
25.07.2024 в 13:58, Flint2000 сказал:

:-D Це потрібно ще головоломку розв’язати? Як можна зробити реквест на 404 репозиторій?

а я думал сайт 404. репозиторий публичным сделал

  • +1 2
Надіслати

Немного подверстал. Добавлена так же проверка на авторизованного в админке пользователя.

Скрытый текст

 

<?xml version="1.0" encoding="utf-8"?>
<modification>
    <code>perfomence checker ttfb</code>
    <name>perfomence checker ttfb</name>
    <version>1</version>
    <author>kj</author>
    <link>cleanphp.pp.ua</link>
       <file path="system/engine/{router,front}.php">
        <operation error="skip">
            <search>
                <![CDATA[$action = $this->execute($action);]]>
            </search>
            <add position="after" offset = "1">
                <![CDATA[
                $this->user = new Cart\User($this->registry);

               if (strpos($_SERVER['REQUEST_URI'], "/admin/") !== false || !$this->user->isLogged() || !isset(Action::$timings)) {
                         return;
               }

                $maxtime = 200;
                echo "<button id='toggle-info-btn' class='btn btn-primary btn-sm fixed-top-right'><i class=\"fa fa-cog fa-spin\"></i> </button>";
                echo "<div id='info-panel' class='hidden'>";
                echo "<div class='ttfbperf-container row'>"; 
                foreach(Action::$timings as $key => $arr)
                {
                    uasort($arr, function($a, $b) {
                        return $b['time'] <=> $a['time']; // Изменено: $b['time'] <=> $a['time']
                    });
                        
                    echo "<div class='col-md-3'>"; 
                    echo "<table class='ttfbperf-table table table-bordered table-striped'>";
                    echo "<thead style='font-size: 14px;'>";
                    echo "<tr>";
                    echo "<th>".$key."</th>";
                    echo "<th>time</th>";
                    echo "<th>count</th>";
                    echo "</tr>";
                    echo "</thead>";
                    echo "<tbody style='font-size: 12px;'>";

                    foreach($arr as $key2 => $val)
                    {
                        $percent = $val['time']/$maxtime;
                        $R = round(255 * $percent);
                        $G = 255 - $R; 
                        $bgccc = "rgba(".$R.", ".$G.", 0, 0.5)";

                        echo "<tr style='background-color: $bgccc;'>";
                        echo "<td>" . $key2 . "</td>";
                        echo "<td>" . number_format($val['time'], 1) . " ms</td>";
                        echo "<td>" . $val['count'] . "</td>";
                        echo "</tr>";
                    }
                    echo "</tbody>";
                    echo "</table>";
                    echo "</div>"; 
                }
                echo "</div>"; 
                echo "</div>";
                echo "<script>
                    document.getElementById('toggle-info-btn').addEventListener('click', function() {
                        var panel = document.getElementById('info-panel');
                        if (panel.classList.contains('hidden')) {
                            panel.classList.remove('hidden');
                        } else {
                            panel.classList.add('hidden');
                        }
                    });
                </script>
                <style>
                    .fixed-top-right { position: fixed; top: 10px; right: 10px; z-index: 1000; }
                    .hidden { display: none; }
                    .ttfbperf-container { display: flex; flex-wrap: wrap; } 
                    .ttfbperf-table { margin: 5px; box-sizing: border-box; }
                    .clearfix::after { content: ''; display: table; clear: both; }
                </style>";
                ]]>
            </add>
        </operation>
    </file>

    <file path="system/engine/action.php">
        <operation error="skip">
            <search>
                <![CDATA[return call_user_func_array(array($controller, $this->method), $args);]]>
            </search>
            <add position="replace">
            <![CDATA[
                $time_start = microtime(true);
                $res = call_user_func_array(array($controller, $this->method), $args);
                
                if(isset(Action::$timings)) 
                {
                    $time_end = microtime(true);
                    $diff = ($time_end - $time_start) * 1000;
                    $parts = explode("/", $this->route);
                    array_pop($parts);
                    $newroute = implode("/", $parts);

                    if(!isset(Action::$timings[$newroute][$this->route]))
                    {
                        Action::$timings[$newroute][$this->route]['time'] = 0;
                        Action::$timings[$newroute][$this->route]['count'] = 0;
                    }

                    Action::$timings[$newroute][$this->route]['time'] += $diff;
                    Action::$timings[$newroute][$this->route]['count']++;
                }

                return $res;
                ]]>
            </add>
        </operation>
            
        <operation error="skip">
            <search>
                <![CDATA[private $id;]]>
            </search>
            <add position="after">
              <![CDATA[public static $timings = [];]]>
            </add>
        </operation>
    </file>
</modification>


 

 

  • +1 1
Надіслати

Интересно. Умные таблички - это конечно круто, но что по баллам-попугаям на Пейджспиде, кто-то тестил до и после7

Надіслати
26.07.2024 в 16:38, Etegro сказал:

Интересно. Умные таблички - это конечно круто, но что по баллам-попугаям на Пейджспиде, кто-то тестил до и после7

конечно ttfb влияет на попугаи гугла. но гугл оценивает скорость как до так и после первого байта всякие там cls, psi, fcp

Надіслати
26.07.2024 в 16:38, Etegro сказал:

Интересно. Умные таблички - это конечно круто, но что по баллам-попугаям на Пейджспиде, кто-то тестил до и после7

 

Есть результаты, когда после приведения всех этих дел в порядок, трафик за месяц лез +30-40%.
Тут главное не пузомерки а краулинговый бюджет, который позволяет и скормить как можно больше страниц и актуализировать информацию по товарам-категорями оперативно.

 

Но только в чистом виде пузомерки - это туфта как некие части тела, неких пользователей форума.

 

Без нормального контента, без поведенческих (читайте посещаемость), без тупого магазина на холодную без кеша, хоть 300% зелененький pagespeed нарисуйте. Кина не будет.

  • +1 2
Надіслати
27.07.2024 в 00:41, Yoda сказал:

Без нормального контента, без поведенческих (читайте посещаемость), без тупого магазина на холодную без кеша, хоть 300% зелененький pagespeed нарисуйте. Кина не будет.


Всё важно: контент, быстрые запросы на холодную, лёгкий шаблон без 100 скриптов. Ускорение магазина в двое, может принести в двое заказов больше.

Надіслати
21.08.2024 в 19:01, Sha сказал:

Когда-то и я подобное делал

 

неплохо, но не хватает детализации по модулям. чтобы найти виновника и ткнуть на него пальцем:-D

Надіслати

Бажаєте одним!!! налаштуванням сервера зменшити TTFB на 30%?

php_admin_value[open_basedir] = none

В hestia краще створити дублікат вашого шаблону в /usr/local/hestia/data/templates/web/php-fpm

 

Надіслати

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

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

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

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

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

Вхід

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

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

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