[Помогите] Сжатие скриптов

Тема в разделе "OpenCart", создана пользователем five555, 11 май 2015.

  1. five555

    five555

    Регистрация:
    18 янв 2014
    Сообщения:
    248
    Симпатии:
    150
    Добрый день!
    Сайт sfera.by
    Гугл пишет включить сжатие скриптов. Подскажите, как включить это сжатие.
    Вот мой .htaccess
    Код:
    #dnwr_host cdn1.opencart.im cdn2.opencart.im
    
    Options +FollowSymlinks
    
    # Prevent Directoy listing
    Options All -Indexes
    
    # Prevent Direct Access to files
    <FilesMatch "\.(tpl|ini|log)">
        Order deny,allow
        Deny from all
    </FilesMatch>
    
    # SEO URL Settings
    # If your opencart installation does not run on the main web folder make sure you folder it does run in ie. / becomes /shop/ 
    RewriteEngine On
    RewriteBase /
    RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
    RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
    RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
    
    # Редирект c www на без www
    
    RewriteCond %{HTTP_HOST} ^www.sfera.by
    
    RewriteRule ^(.*)$ https://sfera.by/$1 [R=301,L]
    
    # Редирект для главной (с /index.php на /)
    
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\ HTTP/
    
    RewriteRule ^index\.html$ / [R=301,L]
    
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
    
    RewriteRule ^index\.php$ / [R=301,L]
    
    # Add "gzip Encoding" to already gzipped files
    AddType text/css .css .cssgz
    AddType text/javascript .js .jsgz
    AddEncoding x-gzip .cssgz .jsgz
    
    # Enable Gzip into use mod_gzip.c
    <IfModule mod_gzip.c>
        mod_gzip_on         Yes
        mod_gzip_dechunk    Yes
        mod_gzip_item_include file      \.(html?|txt|css|js|php|pl)$
        mod_gzip_item_include mime      ^text\.*
        mod_gzip_item_include mime      ^application/x-javascript.*
        mod_gzip_item_include mime      ^application/x-font-woff.*
        mod_gzip_item_exclude mime      ^image\.*
        mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
    </IfModule>
    
    <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css text/javascript application/x-javascript application/javascript
    </IfModule>
    
    # Disable access to php ettor log file
    <Files php_error.log>
        Order allow,deny
        Deny from all
        Satisfy All
    </Files>
    
    # Cache-Control
    <IfModule mod_headers.c>
        Header unset Last-Modified
    # 120 days
        <FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|cssgz|jsgz)$">
        Header set Cache-Control "max-age=7776000, public"
        </FilesMatch>
    # 120 days + Append Accept Encoding
        <FilesMatch "\.(css|js|cssgz|jsgz)$">
        Header set Cache-Control "max-age=7776000, public"
        Header append Vary: Accept-Encoding
        </FilesMatch>  
    # 120 days
        <FilesMatch "\.(xml|txt)$">
        Header set Cache-Control "max-age=7776000, public, must-revalidate"
        </FilesMatch>
    # 120 days
        <FilesMatch "\.(html|htm|php)$">
            Header set Cache-Control "max-age=7776000, private, must-revalidate"
        </FilesMatch>
    # Compatible with old browsers
        <FilesMatch "\.(js|css|gif|png|jpe?g|pdf|xml|oga|ogg|m4a|ogv|mp4|m4v|webm|svg|svgz|eot|ttf|otf|woff|ico|webp|appcache|manifest|htc|crx|oex|xpi|safariextz|vcf)$" >
            Header unset X-UA-Compatible
        </FilesMatch>
    </IfModule>
    
    # Optimization for Browser Caching 
    FileETag MTime Size
    <IfModule mod_expires.c>
        ExpiresActive on
        <filesmatch ".(jpg|jpeg|gif|png|ico|css|js|cssgz|jsgz)$">
            ExpiresDefault "access plus 1 year"
        </filesmatch>
        ExpiresDefault "access 7 days"
        ExpiresByType application/javascript "access plus 1 year"
        ExpiresByType text/javascript "access plus 1 year"
        ExpiresByType text/css "access plus 1 year"
        ExpiresByType text/html "access plus 7 day"
        ExpiresByType text/x-javascript "access 1 year"
        ExpiresByType image/gif "access plus 1 year"
        ExpiresByType image/jpeg "access plus 1 year"
        ExpiresByType image/png "access plus 1 year"
        ExpiresByType image/jpg "access plus 1 year"
        ExpiresByType image/x-icon "access 1 year"
        ExpiresByType application/x-shockwave-flash "access 1 year"
    </IfModule>
    
    #Compatible with old browsers
    <IfModule mod_setenvif.c>
        BrowserMatch "MSIE" force-no-vary
        BrowserMatch "Mozilla/4.[0-9]{2}" force-no-vary
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
        BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    </IfModule>
    
    #max_execution_time это максимальное время работы скрипта, поставил побольше, чтобы сервер не вырубал работающий скрипт.
    php_value max_execution_time 200
    
    ### Additional Settings that may need to be enabled for some servers 
    ### Uncomment the commands by removing the # sign in front of it.
    ### If you get an "Internal Server Error 500" after enabling any of the following settings, restore the # as this means your host doesn't allow that.
    
    # 1. If your cart only allows you to add one item at a time, it is possible register_globals is on. This may work to disable it:
    # php_flag register_globals off
    
    # 2. If your cart has magic quotes enabled, This may work to disable it:
    # php_flag magic_quotes_gpc Off
    
    # 3. Set max upload file size. Most hosts will limit this and not allow it to be overridden but you can try
    # php_value upload_max_filesize 999M
    
    # 4. set max post size. uncomment this line if you have a lot of product options or are getting errors where forms are not saving all fields
    # php_value post_max_size 999M
    
    # 5. set max time script can take. uncomment this line if you have a lot of product options or are getting errors where forms are not saving all fields
    
    # 6. set max time for input to be recieved. Uncomment this line if you have a lot of product options or are getting errors where forms are not saving all fields
    # php_value max_input_time 200
    
    AddDefaultCharset utf-8
    
    
     
    Последнее редактирование: 12 май 2015
    halfhope нравится это.
  2. halfhope

    halfhope

    Регистрация:
    31 дек 2012
    Сообщения:
    284
    Симпатии:
    309
    Конфиг мой)
    в AddOutputFilterByType DEFLATE нужно добавить
    Код:
    text/javascript
    
    Т.к. Ваш сервер отдает js файлы с таким заголовком (text/javascript).
    --- Добавлено, 12 май 2015 ---
    Если не сложно, то попробуйте новый класс кэширования, который не использует функцию glob. Может дать неплохой прирост.

    Еще заметил, что #header на некоторых страницах в высоту занимает 130px, а на некоторых 133px. Мало кто заметит, но все же.

    На сайте .htaccess обновил.
     
    Последнее редактирование: 12 май 2015
    five555 нравится это.
  3. five555

    five555

    Регистрация:
    18 янв 2014
    Сообщения:
    248
    Симпатии:
    150
    Добавил, но ничего не поменялось.
    Спасибо, подправил.
    А что там поменялось? Я не заметил вроде ничего.
    Я бы с удовольствием попробовал, но не совсем понял как это сделать, т.к. в PHP не силён. Может поможете?
    --- Добавлено, 12 май 2015 ---
    И ещё Гугл пишет: Включите функцию Keep-Alive на хосте sfera.by.
    Это можно сделать с помощью .htaccess?
    В поддержке хостинга сказали: "Сообщаем Вам что, к сожалению, мы не можем включить данную функцию, так как это затронет конфигурацию сервера в целом."
     
    halfhope нравится это.
  4. Voland70

    Voland70

    Регистрация:
    29 июн 2014
    Сообщения:
    74
    Симпатии:
    3
    Вопрос - в Вашем варианте .htaccess - только сжатие скриптов? Я правильно понимаю?
    Редирект c без www на с www и с /index.php на / - нужно добавлять дополнительно?
     
    halfhope нравится это.
  5. mytraz

    mytraz

    Регистрация:
    12 фев 2013
    Сообщения:
    102
    Симпатии:
    6
    halfhope нравится это.
  6. halfhope

    halfhope

    Регистрация:
    31 дек 2012
    Сообщения:
    284
    Симпатии:
    309
    Это касается только генерированного опенкартом трафика, т.е. html кода.

    Насколько я вижу, js файлы посылаются сервером уже сжатые. Так что все работает. может просто Google Page Speed кэширует результаты проверок?

    Увы, оказывается я его еще до конца не дописал, есть ошибки. Там все просто. Нужно будет сделать копию файла system/library/cache.php, чтобы можно было обратить изменения в случае неправильной работы нового класса. Затем заменить содержимое этого файла на то, что я опубликовал в посте (последнее сообщение темы). И все, сейчас этот класс работает на modcom.kz.

    Увы, нет.

    Я туда добавил строчку, которую Вам порекомендовал.
    Мой вариант - .htaccess от OpenCart + сжатие скриптов, стилей, кэширование и нужные заголовки.
     
    five555 нравится это.
  7. five555

    five555

    Регистрация:
    18 янв 2014
    Сообщения:
    248
    Симпатии:
    150
    Установлено изначально на 9.
    Сделал, но есть проблема с OCfilter. В категориях вот такие ошибки:
    Код:
    Warning: fopen(/.../sfera.by/system/cache/cache.ocfilter.data.7fcff611dc2369a20f17aee1ba1f672b.cache) [function.fopen]: failed to open stream: No such file or directory in /.../sfera.by/system/library/cache.php on line 10
    
    Warning: fopen(/.../sfera.by/system/cache/cache.ocfilter.manufacturer.167.cache) [function.fopen]: failed to open stream: No such file or directory in /.../sfera.by/system/library/cache.php on line 10
    
    Warning: fopen(/.../sfera.by/system/cache/cache.ocfilter.option.167.1.cache) [function.fopen]: failed to open stream: No such file or directory in /.../sfera.by/system/library/cache.php on line 10
    
    Warning: fopen(/.../sfera.by/system/cache/cache.ocfilter.data.7fcff611dc2369a20f17aee1ba1f672b.cache) [function.fopen]: failed to open stream: No such file or directory in /.../sfera.by/system/library/cache.php on line 10
     
    halfhope нравится это.
  8. halfhope

    halfhope

    Регистрация:
    31 дек 2012
    Сообщения:
    284
    Симпатии:
    309
    Уже исправил ошибку.
     
    five555 нравится это.
  9. five555

    five555

    Регистрация:
    18 янв 2014
    Сообщения:
    248
    Симпатии:
    150
    Сделал. Вроде всё нормально работает, но изменений в скорости я не увидел...
     
    Последнее редактирование: 13 май 2015
    halfhope нравится это.
  10. halfhope

    halfhope

    Регистрация:
    31 дек 2012
    Сообщения:
    284
    Симпатии:
    309
    Может быть, при большом кол-ве файлов в кэше это поможет. Визуально, возможно не увидите, а вот время генерации страниц уменьшится (у вас оно было и так маленькое).
     
    five555 нравится это.
  11. five555

    five555

    Регистрация:
    18 янв 2014
    Сообщения:
    248
    Симпатии:
    150
    Ещё вот такое в блоге выскочило:
    Код:
    Notice: Undefined index: name in /.../sfera.by/vqmod/vqcache/vq2-catalog_controller_common_header.php on line 287
    Notice: Undefined index: name in /.../sfera.by/vqmod/vqcache/vq2-catalog_controller_common_header.php on line 290
    Notice: Undefined index: name in /.../sfera.by/vqmod/vqcache/vq2-catalog_controller_common_header.php on line 298
    Notice: Undefined index: manufacturer_id in /.../sfera.by/vqmod/vqcache/vq2-catalog_controller_common_header.php on line 299
    Notice: Undefined index: status in /.../sfera.by/catalog/controller/module/currency.php on line 38
    
     
    halfhope нравится это.
  12. halfhope

    halfhope

    Регистрация:
    31 дек 2012
    Сообщения:
    284
    Симпатии:
    309
    В модуле блога используется свой класс кэширования. В файле system/library/agoo/cache.php замените функции set, get, delete на функции из нового класса.
     
    five555 нравится это.
  13. Pelmen2

    Pelmen2

    Регистрация:
    26 янв 2015
    Сообщения:
    169
    Симпатии:
    14
    В некоторых случаях сжатие замедляет работу.
    Кэширование - хорошее решение, если сделано с умом.
     
    halfhope нравится это.
  14. halfhope

    halfhope

    Регистрация:
    31 дек 2012
    Сообщения:
    284
    Симпатии:
    309
    Только в случае использования nginx, при использовании Apache для отдачи статики и валидных заголовков для кэширования прокси-серверами или на клиента - плюс.
     
    five555 нравится это.
  15. five555

    five555

    Регистрация:
    18 янв 2014
    Сообщения:
    248
    Симпатии:
    150
    У меня в этой папке два файла cache.php и cache_.php. Менять только в cache.php?
    --- Добавлено, 14 май 2015 ---
    Заменил. Получилось:
    Код:
    <?php
    class agooCache
    {
        private $expire = 36000;
    
        public function get($key) {
        
            $file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.cache';
        
            if (file_exists($file)) {
                $fp = fopen($file, 'r');
                flock($fp, LOCK_SH);
                $data = unserialize(fread($fp, filesize($file)));
                flock($fp, LOCK_UN);
                fclose($fp);
    
                if ((filemtime($file) + $this->expire) < time()) {
                    if (file_exists($file)) {
                        unlink($file);
                    }
                    return false;
                }
            
                return $data;
            }else{
                return false;
            }
        
        }
    
        public function set($key, $value) {
            $this->delete($key);
        
            $file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.cache';
        
            if (!$fp = fopen($file, 'w')) return false;
            if (flock($fp, LOCK_EX)){
                fwrite($fp, serialize($value));
                flock($fp, LOCK_UN);
                fclose($fp);
            
                clearstatcache();
            
                return true;
            } else {
    
                return false;
            }
        }
    
        public function delete($key) {
            $file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.cache';
            if (file_exists($file)) {
                unlink($file);
            }
        }
    }
    if (!function_exists('agoo_error_handler')) {
        function agoo_error_handler($errno, $errstr)
        {
        }
    }
    
    
    ?>
    И файл system/library/cache.php вот отсюда взял.
    Всё верно?
     
    Последнее редактирование: 14 май 2015
    halfhope нравится это.
  16. halfhope

    halfhope

    Регистрация:
    31 дек 2012
    Сообщения:
    284
    Симпатии:
    309
    Да, все верно.
     
    five555 нравится это.