Как принудительно очистить кеш для динамического URL-адреса в Fat-free Framework?

Как очистить кеш шаблонного URL-адреса (динамического URL-адреса)?
Например, /assets/js/@jsname.js...

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

Говорили, что для очистки базы нужно указать для нее ключ. И я не знаю, что я должен ввести для ключа :(

Вот мой код:

\F3::route("GET @virtualasset: /assets/img/@link/@size.@id.@type", "Control\\Imager->akses", 3600 * 24 * 7); // cache seminggu :3

person Chris Qiang    schedule 21.12.2015    source источник


Ответы (2)


Ответы HTTP кэшируются с использованием следующего ключа: hash(VERB URI).url.

Итак, если вы хотите обновить assets/js/foo.js, вам нужно будет сделать:

$hash=$f3->hash('GET /assets/js/foo.js');
$cache->clear($hash.'.url');

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

Также вам нужно помнить, что параметр маршрута $ttl запускает не только кеш сервера, но и кеш клиента. Это означает, что вам нужно реализовать блокировку кеша, чтобы обновить кеш клиента. Что-то вроде assets/js/foo.js?v=3.

Вы можете рассмотреть возможность реализации кеша непосредственно в вашем классе контроллера. Это дало бы вам больше гибкости.

person xfra35    schedule 22.12.2015
comment
вау! хорошо я попробую! - person Chris Qiang; 22.12.2015

Я использую этот маршрут:

GET|HEAD /assets/@folder/@type/v-@version/* = controllers\Assets->отправить, 3600

Мой контроллер:

namespace controllers;
class Assets {

    private $paths;
    private $types = ['css', 'js', 'i', 'fonts', 'files', 'icons'];
    private $dontminify = ['i', 'fonts', 'files', 'icons'];


    public function __construct() {
        $this->fw = \Base::instance();
        $this->paths['app'] =  '../app/views/site_tpl/assets/';
        $this->paths['core'] = '../core/views/default/assets/';
    }

    public function send() {

        if (in_array($this->fw->get('PARAMS.folder'), array_keys($this->paths))
            && in_array($this->fw->get('PARAMS.type'), $this->types))
        {
            $folder = $this->paths[$this->fw->get('PARAMS.folder')];
            $type = $this->fw->get('PARAMS.type');
            if (in_array($type, $this->dontminify)) {
                $file = $folder . $type . '/' . $this->fw->pop('PARAMS');
                if (\Web::instance()->send($file)) {
                    return true;
                }
            } else {
                $this->fw->set('UI', $folder . $type . '/');
                $file = $this->fw->pop('PARAMS');
                if (file_exists($this->fw->get('UI') . $file)) {
                    if (!$this->fw->exists('GET.dontminify')) {
                        echo \Web::instance()->minify($file);
                        return true;
                    } elseif (\Web::instance()->send($this->fw->get('UI') . $file)) {
                        return true;
                    }
                }
            }
        }
        $this->fw->error(404);
    }

}

Итак, когда я хочу обновить версию файла, я пишу что-то вроде этого:

<script src="/assets/app/js/v-20160205/main.js"></script>
person bigsiter    schedule 09.02.2016