PDA

Просмотр полной версии : Кэширование расширения (4 варианта: кэшировать, не кэшировать, управлять, по времени.


Ивано
16.06.2012, 20:32
Добрый день.

Есть заготовка стандартного расширения создаваемая через kickstarter:
которая подключается в ext_localconf.php через t3lib_extMgm::addPItoST43($_EXTKEY, 'pi1/class.tx_test.php', '_pi1', 'list_type', 0);
где как понимаю значение 0 - не кэшировать, а 1 - это-кэшировать

--------


<?php


class tx_test_pi1 extends tslib_pibase {
var $prefixId = 'tx_test_pi1';
var $scriptRelPath = 'pi1/class.tx_test_pi1.php';
var $extKey = 'test';
var $pi_checkCHash = true;


function main($content, $conf) {
$this->conf = $conf;
$this->pi_setPiVarDefaults();


$content='Привет страна - Случайное значение = ' . rand (1, 100);

return $this->pi_wrapInBaseClass($content);
}
}



?>


Вопрос про варианты кэширования:

1. Как правильно включить кэширование данного расширения.
Случайное значение rand (1, 100) должно вывестись только один раз и все

2. Как правильно отключить кэширование данного расширения.
Случайное значение rand (1, 100) должно постоянно генерироваться по новому

3. Возможно ли кэшировать на определенный период времени, либо до определенного периода времени?

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

Т.е. так

//Включил кэш
$content=' Hellow Word - Случайное значение = ' . rand (1, 100);

//Выключил кэш
$content=' Hellow Word - Случайное значение = ' . rand (1, 100);

//Включил кэш
$content=' Hellow Word - Случайное значение = ' . rand (1, 100);

//Выключил кэш
$content=' Hellow Word - Случайное значение = ' . rand (1, 100) ;


Спасибо.

dmartynenko
18.06.2012, 17:52
1. В TS шаблоне расширение должно быть объявлено как = USER
2. Тоже, но как = USER_INT
3. В TYPO3 версии 4.6 и выше появилось свойство кэширование с указанием времени в stdWrap. Еще есть старый экст coago. Есть более новый enetcache.
4. Своей программной логикой на PHP, можно используя "caching framework" ядра начиная с версии 4.3. А можно что хотите.

Ивано
18.06.2012, 20:04
1. В TS шаблоне расширение должно быть объявлено как = USER
2. Тоже, но как = USER_INT
3. В TYPO3 версии 4.6 и выше появилось свойство кэширование с указанием времени в stdWrap. Еще есть старый экст coago. Есть более новый enetcache.
4. Своей программной логикой на PHP, можно используя "caching framework" ядра начиная с версии 4.3. А можно что хотите.

Как понимаю решение всех вариантов можно найти в "caching framework".

dmartynenko
18.06.2012, 20:07
Варианты 1-2 существуют в TYPO3 ну очень давно, еще до появления caching framework.

В варианте 4 все на ваше усмотрение. Можете использовать caching framework, а мы чаще используем memcached напрямую.

Ивано
18.06.2012, 20:22
Правильно понимаю, что это из этой серии и для этого нужен EXTBASE?
http://www.tomaj.sk/2011/03/22/typo3-caching-framework/
http://daniel.lienert.cc/blog/blog-post/2011/03/12/typo3-caching-framework-in-eigener-extension-verwenden/

dmartynenko
19.06.2012, 12:07
Нет, никакой extbase не нужен. Вторая ссылка в вашем примере это как раз оно (обычные настроки и использование классов ядра). Только как кэшь используется БД. Если у вас полноценный выделенный сервер и достаточно ОЗУ, то лучше использовать что-то вроде memcached. На БД в TYPO3 и так нагрузки хватает.

Ивано
23.06.2012, 10:42
Нет, никакой extbase не нужен. Вторая ссылка в вашем примере это как раз оно (обычные настроки и использование классов ядра). Только как кэшь используется БД. Если у вас полноценный выделенный сервер и достаточно ОЗУ, то лучше использовать что-то вроде memcached. На БД в TYPO3 и так нагрузки хватает.

Спасибо.
Хорошо - попробую и то и то...

Ивано
25.06.2012, 23:53
В общем с выше описанным ничего не выходит...
Нашел еще ссылку:

что это за способ кэширования?
http://buzz.typo3.org/people/steffen-kamper/article/using-cache-in-extensions/
http://wiki.typo3.org/Functions_for_t3lib_cache

dmartynenko
26.06.2012, 11:04
В общем с выше описанным ничего не выходит...
Нашел еще ссылку:

что это за способ кэширования?
http://buzz.typo3.org/people/steffen-kamper/article/using-cache-in-extensions/
http://wiki.typo3.org/Functions_for_t3lib_cache

А что значит не выходит? Можете написать подробнее что вы сделали.
На вскидку:
1. Если у вас плагин типа USER, то содержимое закэшируется при первом обращении к нему и внутренняя логика уже не будет использоваться. В случае любой динамики обязательно должен быть USER_INT.
2. Может у вас отключено использование caching framework в настройках TYPO3. На сколько я помню по умолчанию он выключен.

По новым ссылкам.
cache_hash - таблица которая используется для внутреннего кэширования. Она и функции работы с ней существуют в ядре очень давно. Ее тоже можно использовать (пример в первой ссылке), но как по мне это не очень эффективно.

Ивано
02.07.2012, 00:26
Вот допусти стандартный класс, созданный через kickstarter:

require_once(PATH_tslib.'class.tslib_pibase.php');


/**
* Plugin 'fwe' for the 'few' extension.
*
* @author Иван <litovan@bk.ru>
* @package TYPO3
* @subpackage tx_few
*/
class tx_few_pi1 extends tslib_pibase {
var $prefixId = 'tx_few_pi1'; // Same as class name
var $scriptRelPath = 'pi1/class.tx_few_pi1.php'; // Path to this script relative to the extension dir.
var $extKey = 'few'; // The extension key.
var $pi_checkCHash = true;

/**
* The main method of the PlugIn
*
* @param string $content: The PlugIn content
* @param array $conf: The PlugIn configuration
* @return The content that is displayed on the website
*/
function main($content, $conf) {
$this->conf = $conf;
$this->pi_setPiVarDefaults();
$this->pi_loadLL();


$content='
<strong>This is a few paragraphs:</strong><br />
<p>This is line 1</p>
<p>This is line 2</p>

<h3>This is a form:</h3>
<form action="'.$this->pi_getPageLink($GLOBALS['TSFE']->id).'" method="POST">
<input type="text" name="'.$this->prefixId.'[input_field]" value="'.htmlspecialchars($this->piVars['input_field']).'">
<input type="submit" name="'.$this->prefixId.'[submit_button]" value="'.htmlspecialchars($this->pi_getLL('submit_button_label')).'">
</form>
<br />
<p>You can click here to '.$this->pi_linkToPage('get to this page again',$GLOBALS['TSFE']->id).'</p>
';

return $this->pi_wrapInBaseClass($content);
}
}



if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/few/pi1/class.tx_few_pi1.php']) {
include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/few/pi1/class.tx_few_pi1.php']);
}

Как в нем использовать функции кэширования встроенные в ядро на основе таблиц из примера первой ссылки?

Ивано
23.10.2012, 21:09
По прежнему актуально.

Самый простой "кэш" (не знаю можно ли это назвать кэшированием), который могу создать это следующий: есть собранные данные HTML-код - их записываю в файл с именем time(), кидаю его в папку typo3temp - и при следующем вызове скрипта, проверяю через if - если разница более 30 минут - то по новому нужно собрать HTML-код с запросом к БД.

Какой и как использовать API typo3 для подобных вещей (как на файлах, так и на БД - хотя данный вариант мне тоже не очень нравиться).
Есть ли простые примеры...

Memcache - так понимаю должен быть включен (установлен) на сервера?
И есть ли что нибудь - что похоже на Memcache - только в независимости от настроек и установок сервера?

Ивано
23.10.2012, 21:29
Вот нашел ссылку на memcache - только на основе простой библиотеки...
http://raven.esiteq.com/2011/03/php-memcache/

Ивано
23.10.2012, 21:35
Как понимаю - это расширение "fastcache" - позволяет решать подобные задачи?

dmartynenko
24.10.2012, 12:15
Еще раз - можете использовать встроенные в ядро функции кэширования.
Подробно и с примерами (в конце) читайте http://wiki.typo3.org/Caching_framework

То что вы сохраняете какой-то готовый контент в файл - это тоже кэширование. Точно также вместо файла можно использовать Memcached, APC и т.п. Может быть fastcache и упростит задачу. Но там и так просто get/set.

Правда нужно понимать, что бы сделать из этого полноценный кэш нужно добавить к этому ряд функций. Например чистку кэша при общей команде "Clear Cache" из BE. Также при усложнении функциональности сайта/экста понадобиться тэггирование записей кэша и чистка по тэгам. сильно улучшает полезность кэша зависимость жизни кэша от изменения и добавления связанных записей. Например, вы отредактировали новость в BE, кэш плагина/страницы новости обновился сразу, а не через 30 минут.

PS: Если вы записываете с именем time(), то как вы потом этот файл находите? Гораздо удобней использовать другие параметры для имени ключа кэша. Например у нас есть метод который реднерит Single View. В нем определяем $cache_key = md5(serialize(array(__CLASS__, __FUNCTION__, $pid, $uid))); Так у нас есть гарантия что ключ кэша (он же имя файла или ключ в memcached) не перепутается с кэшем из другой функции, или из другого класса.

Ивано++
24.02.2013, 00:07
Возвращаясь к этой теме - очень сложно использовать Caching F в выше описанной статье...

И нашел варианты более простые:
1. http://typo3.org/extension-manuals/enetcache/1.1.0/view/toc/0/
расширение enetcache позволяет управлять кэшированием


2. http://buzz.typo3.org/people/steffen-kamper/article/using-cache-in-extensions/

можно использовать стандартные функции класса t3lib_pageSelect:
getHash
storeHash
которые пишут данные в таблицу "cf_cache_hash_tags"

t3lib_pageSelect - очень полезный класс, документация здесь:
http://doxygen.frozenkiwi.com/typo3/html/d1/d86/classt3lib__pageSelect.html#adc0a8be4033a4e687a13d faf1a0da959


А также вот еще интересные статьи:
http://wiki.typo3.org/Cache
http://wiki.typo3.org/Functions_for_t3lib_cache

Ивано++
24.02.2013, 00:30
А еще можно на прямую, даже с выбором таблицы, в которую надо писать:

if(isset($GLOBALS['typo3CacheManager']) && $GLOBALS['TYPO3_CONF_VARS']['SYS']['useCachingFramework']) { //на всякий случай можно проверять, включено ли кэширование на основе БД (и если галочка установлена - вперед)

$hash = "fewfew"; $ident = "fwefew"; $data = 123;
$GLOBALS['typo3CacheManager']->getCache('cache_hash')->set(
$hash,
$data,
array('ident_' . $ident),
intval($lifetime)
);

$contentHashCache = $GLOBALS['typo3CacheManager']->getCache('cache_hash');
$cacheEntry = $contentHashCache->get($hash);

//Либо так
t3lib_pageSelect::storeHash(...);
t3lib_pageSelect::getHash(...)


Даже время истечения можно задать...