24.07.2018 01:26:59 pm
Все современные CMS создают шаблоны в виде файлов с разным расширением php, html, tmp и т. д. Если в кеше есть требуемый файл, он будет взят от туда, если нету, он будет создан специальной программой для использования в будущем. Использование кешированных файлов в разы увеличивает скорость генерации страницы, потому, как значительно сокращается количество запросов в базу, ещё и нагрузка на сервер станет меньше.
Если у вас ещё нет кеша, то рекомендую обзавестись им немедленно. А сейчас, давайте разберёмся, как сделать программу, что будет обрабатывать данные и сохранять их в кеше!
Если у вас ещё нет кеша, то рекомендую обзавестись им немедленно. А сейчас, давайте разберёмся, как сделать программу, что будет обрабатывать данные и сохранять их в кеше!
- Жалоба
24.07.2018 02:47:31 pm
Здравствуйте, Яркий!
Все просто. Как вы сами сказали, первым делом проверяется кеш на наличие определенных данных, если данные есть, используются они, если нет, они будут созданы для дальнейшей работы. Как мне кажется лучше написать отдельный класс для работы с кешом, который будет выполнять проверку наличия файлов в кеше, создавать шаблоны и удалять их. Именно так делается во многих CMS, в том числе и в phpFox. Как то создал тему про кеш в phpFox: Работа с кэшем сайта (phpFox), может пригодится для реализации своей системы кеша. А вот так выглядит один из классов кеша в phpFox:
Все просто. Как вы сами сказали, первым делом проверяется кеш на наличие определенных данных, если данные есть, используются они, если нет, они будут созданы для дальнейшей работы. Как мне кажется лучше написать отдельный класс для работы с кешом, который будет выполнять проверку наличия файлов в кеше, создавать шаблоны и удалять их. Именно так делается во многих CMS, в том числе и в phpFox. Как то создал тему про кеш в phpFox: Работа с кэшем сайта (phpFox), может пригодится для реализации своей системы кеша. А вот так выглядит один из классов кеша в phpFox:
<?php
class Phpfox_Cache_Storage_File extends Phpfox_Cache_Abstract
{
private $nameArray = array();
private $_name;
private $fromMemory = false;
private $skipClose = false;
public function set($name, $group = '')
{
if (is_array($name))
{
if (PHPFOX_SAFE_MODE | PHPFOX_OPEN_BASE_DIR)
{
$name = str_replace(array('/', PHPFOX_DS), '_', $name[0]) . '_' . $name[1];
}
else
{
if ($name[0] == 'feed' | $name[0] == 'feed_mobile')
{
$name[0] = $name[0] . '_' . Phpfox::getLib('locale')->getLangId();
}
$sNewDirectory = PHPFOX_DIR_CACHE . $name[0];
if (!is_dir($sNewDirectory))
{
Phpfox::getLib('file')->mkdir($sNewDirectory, true, 0777);
}
$name = rtrim($name[0], '/') . PHPFOX_DS . $name[1];
}
}
$id = $name;
$this->nameArray[$id] = (strlen($name) > 150) ? substr($name, 0, 150) : $name;
$this->_name = $name;
if ($group == 'memory')
{
$this->fromMemory = true;
}
return $id;
}
public function skipClose($close)
{
$this->skipClose = $close;
return $this;
}
public function get($id, $time = 0)
{
# We don't allow caching during an install or upgrade.
if (defined('PHPFOX_INSTALLER'))
{
return false;
}
if ($this->fromMemory)
{
$this->fromMemory = false;
return false;
}
(PHPFOX_DEBUG ? Phpfox_Debug::start('cache') : false);
if (!$this->isCached($id, $time))
{
return false;
}
require($this->_getName($this->nameArray[$id]));
(PHPFOX_DEBUG ? Phpfox_Debug::end('cache', array('namefile' => $this->_getName($this->nameArray[$id]))) : false);
if (empty($content))
{
return false;
}
if ($this->skipClose === false)
{
$this->skipClose = false;
$this->close($id);
}
if (!is_array($content) && empty($content))
{
return true;
}
if (is_array($content) && !count($content))
{
return true;
}
return $content;
}
public function save($id, $content)
{
if (defined('PHPFOX_IS_HOSTED_SCRIPT'))
{
return false;
}
# We don't allow caching during an install or upgrade.
if (defined('PHPFOX_INSTALLER'))
{
return false;
}
if ($this->fromMemory)
{
$this->fromMemory = false;
$this->close($id);
return false;
}
if ($this->_getParam('free'))
{
$_content = $content;
}
else
{
$_content = '<?php $content = ' . var_export($content, true) . '; ?>';
}
if ($open = fopen($this->_getName($this->nameArray[$id]), 'w+'))
{
fwrite($open, $_content);
fclose($open);
}
}
public function close($id)
{
unset($this->nameArray[$id]);
}
public function remove($name = null, $type = '')
{
if (file_exists(PHPFOX_DIR_CACHE . 'cache.lock'))
{
return false;
}
if ($name === null)
{
foreach ($this->getAll() as $aFile)
{
if (file_exists(PHPFOX_DIR_CACHE . $aFile['name']))
{
if (is_dir(PHPFOX_DIR_CACHE . $aFile['name']))
{
Phpfox::getLib('file')->delete_directory(PHPFOX_DIR_CACHE . $aFile['name']);
}
else
{
unlink(PHPFOX_DIR_CACHE . $aFile['name']);
$this->removeInfo(PHPFOX_DIR_CACHE . $aFile['name']);
}
}
}
return true;
}
switch($type)
{
case 'substr':
$dir = PHPFOX_DIR_CACHE . (is_array($name) ? rtrim($name[0], '/') . PHPFOX_DS : '');
if (!PHPFOX_SAFE_MODE && !PHPFOX_OPEN_BASE_DIR && !is_dir($dir))
{
Phpfox::getLib('file')->mkdir($dir, true, 0777);
}
$files = Phpfox::getLib('file')->getFiles($dir);
$count = strlen((is_array($name) ? $name[1]: $name));
foreach ($files as $file)
{
if (substr($file, 0, $count) != (is_array($name) ? $name[1]: $name))
{
continue;
}
if (is_dir($dir . $file))
{
Phpfox::getLib('file')->delete_directory($dir . $file);
}
else
{
unlink($dir . $file);
}
$this->removeInfo($dir . $file);
}
break;
case 'path':
if (file_exists($name))
{
unlink($name);
$this->removeInfo($name);
}
break;
default:
if (is_array($name))
{
$name[0] = rtrim($name[0], '/');
if ($name[0] == 'feed' | $name[0] == 'feed_mobile')
{
$name[0] = $name[0] . '_' . Phpfox::getLib('locale')->getLangId();
}
$name = $name[0] . PHPFOX_DS . $name[1];
}
$name = $this->_getName($name);
if (file_exists($name))
{
unlink($name);
$this->removeInfo($name);
}
break;
}
return true;
}
public function isCached($id, $time = 0)
{
if (Phpfox::getParam('core.cache_skip'))
{
return false;
}
if (isset($this->nameArray[$id]) && file_exists($this->_getName($this->nameArray[$id])))
{
if ($time && (PHPFOX_TIME - $time * 60) > (filemtime($this->_getName($this->nameArray[$id]))))
{
$this->remove($this->nameArray[$id]);
return false;
}
return true;
}
return false;
}
public function getCachedFiles($aConds = array(), $sSort, $iPage, $sLimit)
{
$iCnt = 0;
$aRows = array();
$iSize = 0;
$files = Phpfox::getLib('file')->getAllFiles(PHPFOX_DIR_CACHE);
$iLastFile = 0;
foreach ($files as $file)
{
$iSize += filesize($file);
$iCnt++;
if (filemtime($file) > $iLastFile)
{
$iLastFile = filemtime($file);
}
}
$this->_aStats = array(
'total' => $iCnt,
'size' => $iSize,
'last' => $iLastFile
);
return array($iCnt, $aRows);
}
private function _getName($file)
{
if ($this->_getParam('free'))
{
return $file;
}
else if ($this->_getParam('path'))
{
return $file;
}
return PHPFOX_DIR_CACHE . (Phpfox::getParam('core.cache_add_salt') ? md5(Phpfox::getParam('core.salt') . $file) : $file) . Phpfox::getParam('core.cache_suffix');
}
}
28.07.2018 08:10:26 am
Яркий, код показан от phpFox, и по всей видимости только для примера. Если у вас другой движок, то вам придется попотеть над этим классом, чтобы его подогнать под свой. Тут взаимосвязь с другим классом Phpfox_Cache_Abstract, который вам тоже потребуется, если будете использовать этот класс. Вам проще написать свой с ноля глядя на этот, как образец. В классе будет около 3х методов, проверка наличия шаблона в кеше, создание и получение, все. Если хоть чуть-чуть разбираетесь в php, то при помощи мануала, разберетесь, что к чему.
Что у вас за cms такая без кеша? Может кеш идет отдельным модулем?
Что у вас за cms такая без кеша? Может кеш идет отдельным модулем?