Для получения полного доступа
зарегистрируйтесь

Класс для создания хэша изменения ресурсов


Этот класс можно использовать в случаях, когда необходимо заставить барузеры клиентов обновить ресурсы ( css, js ) при их изменении в git. Требует доступного на выполнение git.

Этот пример оптимизирован по совету пользователя matweew. Улучшенную версию смотрите ниже после этой.

Первая версия:

<?php

class HashedAsset
{
    public $hash;
    
    public function init()
    {
        exec('git describe --always',$version_hash);
        if (isset($version_hash[0])) {
            $this->hash = md5($version_hash[0]);    
        }
    }
}

Использовать можно вот так


class CalcAsset extends HashedAsset
{  
    public function init() {
        parent::init();
        $this->js = [
            'static/js/jquery.bpopup.min.js?' . $this->hash
        ];
        $this->css = [
            'static/css/bpopup.css?' . $this->hash
        ];
    }
}

Если на сервере нет поддержки git, то обращение к git можно заменить на du -s /директория ресурсов** , программа du покажет размер директории в байтах, соответственно если размер изменился, значит и содержимое изменилось и браузер пользователя должен будет обновить ресурсы.

Вторая версия:

По совету пользователя matweew я решил сделать вторую версию этого пакета, которая бы не использовала лишние параметры запроса.

<?php

class HashedAsset
{
    public $hash;
    public $web_root = '/root/dir';
    
    public function init()
    {
        parent::init();
        exec('git describe --always',$version_hash);
        if (isset($version_hash[0])) {
            $this->hash = md5($version_hash[0]);
            (isset($this->css) ? $this->symlinking($this->css) : null);
            (isset($this->js)  ? $this->symlinking($this->js)  : null);
        }
    }

    public function symlinking(&$array) {
        $web_root = $this->web_root;
        foreach($array as $key => $item) {
            $dir_to_link = $web_root . '/' . dirname($item);
            $common_hash = md5(dirname($item) . $this->hash);
            if (is_dir($dir_to_link)
            	&& !is_dir($web_root . '/assets/' . $common_hash)) {
                $link_dir = $web_root . '/assets/' . $common_hash;
                $res = symlink($dir_to_link, $link_dir);
            }
            if (is_dir($web_root . '/assets/' . $common_hash)) {
                $array[$key] = 'assets/' . $common_hash 
                	. '/' . basename($item);
            }
        }
    }
}

Эту версию можно использовтаь следующим образом:

<?php

namespace app\assets;

class AppAsset extends HashedAsset
{
    public $css = [
        'css/site.css',
    ];
    public $js = [
        'js/script.js',
    ];
}

Результатом будет создание в директории assets символических ссылок, которые будут изменяться при получении новых комитов из репозитория git, и через эти ссылки будет идти обращение к ресурсам

<link href="/assets/73cf4aca22abe50f63cc67bf087eda50/site.css" rel="stylesheet"> 

Возможные проблемы:

  1. Могут сбиться привязки css файлов к изображениям, потому что доступ к css файлам будет идти через другую директорию.

Чтобы увидеть комментарии, нужно быть участником сообщества

Регистрация