Артём Мáлков

Минификация (сжатие) исходного кода (HTML) в DLE на PHP

28 фев52 комм

Недавно мы с вами рассмотрели способ минификации исходного кода на сайте в 1C-Bitrix. Чтобы не дублировать сообщение о том, что это такое и что оно дает, прочитайте статью по ссылке выше.

В данной статье мы будем минифицировать (сжимать) исходный код сайта, который находится на CMS DataLife Engine.

Итак, приступим.

1. Подключитесь к вашему сайту по FTP.

2. Откройте файл index.php в корневой папке вашего сайта и сразу после <?php вставьте:

function minify_html($buffer) {

	$buffer = preg_replace(
		array(
			'/\>[^\S ]+/s',
			'/[^\S ]+\</s',
			'/(\s)+/s',
			'/<!--(?![^<]*noindex)(.*?)-->/'
		),
		array(
			'>',
			'<',
			'\\1',
			''
		),
		$buffer
	);

	return $buffer;

}

Сохраните изменения и отправьте файл обратно на сайт.

3. Далее откройте файл main.php в папке /engine/modules/. Найдите строку:

echo $tpl->result['main'];

и замените ее на:

ob_start('minify_html');
echo $tpl->result['main'];
ob_end_flush();

Сохраните изменения и также отправьте файл обратно на сайт.

4. В панели управления вашим сайтом, на главной странице, почистите кэш, после чего зайдите на свой сайт и посмотрите исходный код.

Если вы все сделали правильно – он (исходный код вашего сайта) будет в одну строку.

Рекомендуем к просмотру
Минификация (сжатие) JS- и CSS-файлов на PHP
Модули и скрипты
Минификация (сжатие) исходного кода (HTML) в WordPress на PHP
Посты
Минификация (сжатие) исходного кода (HTML) в 1C-Bitrix на PHP
Хаки
52
комментария
Форма комментирования этого поста скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 1
    4
      •  Пользователь
    10 дек в 02:33

    В консоли браузера есть ошибка "Uncaught SyntaxError: Unexpected end of input" что это значит?

      • 1
      1066
        •  Команда Pandoge
      изменено 12 дек в 15:46

      Example, вероятно, появилась незакрытая скобка в скрипте. Так могло случиться, если в присутствующих на странице скриптах есть комментарии.

      Пример скрипта:

      <script>
      
      	$(document).ready(function() {
      
      		// Ваш код
      
      	});
      	
      </script>

      А это пример того же скрипта после сжатия кода страницы:

      <script>$(document).ready(function() { // Ваш код });</script>

      Как видно, всё, что идет после // стало комментарием и последние скобки перестали учитываться.

    • 1
    11
      •  Проверенный
    31 мая в 04:45

    Нашел проблему связанную с данным кодом.

    В dle есть доп. поле. картинка (не галерея), а именно одна картинка.

    После загрузки данного поле - можно удалять картинку при нажатии на кнопку.. но больше эта кнопка с этим скриптом не работает..

    <a href="#" onclick="xfimagedelete('poster','2021-05/1622425206_miss-kobayashi-s-dragon-maid-anime-yuri-lolicon-crunchyroll-anime.jpg');return false;">Delete</a>

    Как можно сделать чтобы она работала? Не удаляя это.. как нить видоизменить что-ли ?

    • 6
    10
      •  Проверенный
    26 июн в 22:45

    Какую строчку надо удалить, чтобы код не удалял пробелы, а просто делал код в одну строку?

      • 5
      1066
        •  Команда Pandoge
      30 июн в 00:11

      Bashmak, попробуйте так:

      function minify_html($buffer) {
      
      	$buffer = preg_replace(
      		array(
      			'/\>[^\S ]+/s',
      			'/[^\S ]+\</s',
      			'/<!--(?![^<]*noindex)(.*?)-->/'
      		),
      		array(
      			'>',
      			'<',
      			''
      		),
      		$buffer
      	);
      
      	return $buffer;
      
      }
    • 2
    1
      •  Пользователь
    15 мая в 10:18

    А как сделать чтобы часть кода на странице не сжималась?

      • 4
      1066
        •  Команда Pandoge
      16 мая в 13:37

      Роман Бандеренко, здравствуйте!

      Варианты в комментариях не подходят для решения Вашего вопроса?

    • 1
    10
      •  Проверенный
    19 авг в 23:24

    А этот процесс хоть как-то кэшируется? Или сервер производит сжатие каждый раз когда посетитель открывает какую-либо страницу на сайте?

      • 1
      1066
        •  Команда Pandoge
      19 авг в 23:45

      Bashmak, каждый раз при посещении. Для кеширования страниц вроде есть какой-то сторонний модуль.

      А так, где я лично тестировал этот способ, даже на слабеньком хостинге проблем не наблюдал.

      • 11
      10
        •  Проверенный
      20 авг в 00:01

      Артем Мáлков, а посещаемость какая была?

      Кажись при большой посещаемости сервер не выдержит каждому юзеру пока он перемещается по сайту каждый раз сживать ему код. А если например одновременно 500 или 1000 человек зайдут на сайт, сервер должен будет произвести 1000 сжатий страниц?

      Попробую поставить на пару дней, потом отпишу о результатах.

      • 20
      1066
        •  Команда Pandoge
      20 авг в 00:16

      Bashmak, пробуйте. Ждем результатов. smiley

      • 2
      10
        •  Проверенный
      22 авг в 22:33

      Не смог установить хак, так как у меня другой плагин меняет

      echo $tpl->result['main'];

      на

      eval (' ?' . '>' . $tpl->result['main'] . '<' . '?php ');

      Это мне нужно для того чтобы я мог в шаблонах tpl использовать php код.

      Как-то можно адаптировать под этот код?

      • 4
      10
        •  Проверенный
      22 авг в 22:37

      Может вот так?

      ob_start("sanitize_output");
      eval (' ?' . '>' . $tpl->result['main'] . '<' . '?php ');
      ob_end_flush();

      Так правильно будет?

      • 4
      10
        •  Проверенный
      22 авг в 22:46

      Вроде сработало, но, хак в некоторых местах ломает дизайн сайта, наверное всё таки не буду использовать. Да и в page speed у гугла вообще ничего не изменилось.

      • 14
      1066
        •  Команда Pandoge
      23 авг в 04:04

      Bashmak, попробуйте так:

      ob_start('minify_html');
      eval(' ?>'.$tpl->result['main'].'<?php ');
      ob_end_flush();

      Ломать может, если в верстке есть ошибки.

    • 13
    6
      •  Проверенный
    8 авг в 18:12

    Добрый день, после этого код сжался но при переходе на страницу с новостью выдает след ошибку

    /engine/cache/system/plugins/ba23314b9ef6d588ec169a40d86d8b8f.php on line 1994

    но данного файла даже нету в папке, а точней нету этого /plugins/ba23314b9ef6d588ec169a40d86d8b8f.php

      • 3
      1066
        •  Команда Pandoge
      8 авг в 19:30

      Евгений Лысенко, Здравствуйте.

      Кеш чистили? Плагинов много установлено?

      • 17
      6
        •  Проверенный
      8 авг в 20:56

      Артем Мáлков, плагин только один стоит который не родной идет.

      Telegram Posting

      Кеш чистил и браузера и CMS, заходил через инкогнито такое же самое

      • 13
      1066
        •  Команда Pandoge
      8 авг в 21:14

      Евгений Лысенко, есть возможность предоставить доступ к сайту? Админка+FTP.

      • 5
      6
        •  Проверенный
      29 авг в 15:33

      Артем Мáлков, да могу предоставить! но уже сделал бэкап ибо обычно очисткой не пропадала ошибка

      • 17
      1066
        •  Команда Pandoge
      29 авг в 18:41

      Евгений Лысенко, долго что-то решали проблему smiley

      Присылайте данные через форму обратной связи, постараемся помочь.

      • 13
      6
        •  Проверенный
      30 авг в 13:37

      Артем Мáлков, Сайт на стадии запуска, то не всегда к нему доходят руки. smiley

      • 14
      6
        •  Проверенный
      30 авг в 13:44

      Артем Мáлков, Данные отправил

      • 4
      6
        •  Проверенный
      1 сен в 11:35

      Артем Мáлков, Здравствуйте, есть ли информация по этой ошибке ?

      • 14
      1066
        •  Команда Pandoge
      1 сен в 13:46

      Евгений Лысенко, здравствуйте, да.

      Ошибка была не в скрипте из статьи, а в файле show.full.php (папка /engine/modules/) на Вашем сайте.

      1994 строка в файла имела такой вид:

      $tpl->set("{full-story}", $row["full_story"]);$row['full_story'] );

      Это ошибка, и должно быть:

      $tpl->set('{full-story}', $row['full_story']);

      Исправил это и исходный код сжимается без проблем с нормальной работой сайта.

    • 18
    2
      •  Пользователь
    17 дек в 20:46

    Добрый день, не подскажете как можно добавить в исключение эти теги: <!--noindex--><!--/noindex-->

      • 9
      1066
        •  Команда Pandoge
      18 дек в 21:38

      list, поправили код в статье. Проверьте.

      • 18
      2
        •  Пользователь
      19 дек в 23:29

      Так, как в статье не работает, там две кавычки лишние. Если их убрать, то работает, но только открывающий тег появляется, а закрывающий <!--/noindex--> нет

      • 18
      1066
        •  Команда Pandoge
      20 дек в 00:13

      list, спасибо за замечания. Просмотрели. nerd

      Кавычки поправили и добавили рабочий вариант.

    • 18
    766
      •  Гости
    27 сен в 13:00

    Спасибо большое! В большинстве случаев PageSpeed просит это!

    • 2
    766
      •  Гости
    12 сен в 18:59

    Здравствуйте Артём, после того как вы изменили 2 пункт, ваш Хак перестал работать. У меня версия 11.2.

    К слову, прежняя версия кода:

    function sanitize_output($buffer) {

    $search = array('/\>[^\S ]+/s', '/[^\S ]+\</s', '/(\s)+/s', '/<!--(.*?)-->/',);

    $replace = array('>', '<', '\\1', '');

    $buffer = preg_replace($search, $replace, $buffer);

    return $buffer;

    }

    работает отлично.

      • 26
      1066
        •  Команда Pandoge
      12 сен в 22:58

      Артём, спасибо за замечание. В статье поправил.

    • 13
    766
      •  Гости
    16 апр в 23:47

    Как не сжимать определенные теги типа <yamps></yamaps>?

      • 13
      1066
        •  Команда Pandoge
      17 апр в 01:07

      андрей, на первой странице, 3 комментарий снизу. Список исключения делается по аналогии.

      • 15
      766
        •  Гости
      20 апр в 15:38

      Как мне исключить эти теги ? я так и не понял

      • 10
      1066
        •  Команда Pandoge
      20 апр в 23:53

      андрей,

      "/(\s)+/s",  // Двойные пробелы

      замените на:

      "/(?![^<]*<\/yamps>)(\s)+/s",  // Двойные пробелы

      Пробовали?

      • 1
      766
        •  Гости
      21 апр в 19:39

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

    • 13
    766
      •  Гости
    13 мар в 20:23

    В админке тоже все будет в одну строчку или так как и прежде?

      • 19
      1066
        •  Команда Pandoge
      14 мар в 02:24

      Zhurik, хак не распространяется на админку.

    • 6
    1066
      •  Команда Pandoge
    13 авг в 14:49

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

    "/(\s)+/s",  // Двойные пробелы

    замените на:

    "/(?![^<]*<\/code>)(\s)+/s",  // Двойные пробелы
    • 2
    766
      •  Гости
    9 июн в 19:21

    Добрый вечер. У меня на версии 10,3 нет этого файла маин

      • 8
      1066
        •  Команда Pandoge
      10 июн в 02:51

      Megazvezda, Здравствуйте!

      3-м шагом, echo $tpl->result['main']; ищите не в main.php а в index.php (почти в самом конце) который лежит в корне вашего сайта.

      • 3
      766
        •  Гости
      10 июн в 09:03

      Спасибо большое! Только мне этот хак не подошел. После манипуляций гугл спеед занижает показатели

      • 6
      1066
        •  Команда Pandoge
      10 июн в 13:02

      Megazvezda, этого мало чтобы повысить оценку Google. Но при установке - все равно является плюсом. wink

    • 24
    766
      •  Гости
    17 апр в 10:27

    Здравствуйте !

    Скажите поисковые системы нормально будут видеть и относится к этому коду ?

    Проблем по индексации не будет ?

      • 21
      1066
        •  Команда Pandoge
      17 апр в 15:55

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

    • 35
    766
      •  Гости
    8 апр в 21:32

    Спасибо пригодилось.

    • 6
    766
      •  Гости
    25 мар в 19:56

    Благодарю, хорошая вещь все отлично работает;)

    • 15
    766
      •  Гости
    22 мар в 23:55

    Спасибо, давно искал не мог найти решения, а тут так все просто супер)

      • 8
      766
        •  Гости
      23 мар в 00:11

      Скажите, а как прописать, чтоб код сжимался всем кроме админа?

      • 24
      1066
        •  Команда Pandoge
      23 мар в 01:24

      Богдан, для этого в 3 шаге

      ob_start('minify_html');
      echo $tpl->result['main'];
      ob_end_flush();

      замените на:

      if($member_id['user_group'] == 1) {
      
      	echo $tpl->result['main'];
      	
      } else {
      	
      	ob_start("minify_html");
      	echo $tpl->result['main'];
      	ob_end_flush();
      	
      }

      Где 1 - это ID группы, для которой сжатие не работает, в нашем случае - это группа администраторов.

      • 13
      766
        •  Гости
      23 мар в 13:14

      спасибо большое, все работает =) Крутая штука, особенно поможет тем кто делает оптимизацию для google pagespeed.

Подняться наверх
«Pandoge» - помощник вебмастера