CrashX
В прошлом XSiteCMS
- Регистрация
- 6 Июн 2008
- Сообщения
- 681
- Реакции
- 114
- Автор темы
- #1
есть загвоздка при включении Safe_mode=on
скрипт притормаживает выполнение на компе
#1 было 0,31 стало 2,52
#2 было 0,12 стало 0,83
в отладчике нашел наиболее долго выполняемые функции
~ 30-40% задержки
это ob_get_contents(); но замена на file_get_contents($tpl);
нерешает проблемы...с
~ 20-26% задержки
file_exists() нужно делать
расход памяти не увеличивается. только время выполнения,
код меню в том виде в котором попутает в функцию
шаблоны
шаблонизатор
код герерации меню
меню которое на выходе генерится
есть ли идеи как или что сделать что бы в сейф моде было тоже быстро ?!
скрипт притормаживает выполнение на компе
#1 было 0,31 стало 2,52
#2 было 0,12 стало 0,83
в отладчике нашел наиболее долго выполняемые функции
~ 30-40% задержки
это ob_get_contents(); но замена на file_get_contents($tpl);
нерешает проблемы...с
~ 20-26% задержки
file_exists() нужно делать
расход памяти не увеличивается. только время выполнения,
код меню в том виде в котором попутает в функцию
Код:
$menu = array(
array('name' => 'Новости', 'link' => WWW . 'news.html', 'image' => '01.png', 'block' =>
array(
array('name' => 'Добавить', 'link' => WWW . 'news/add.html', 'image' => '03.png', 'block' => ''),
array('name' => 'Категории', 'link' => WWW . '#', 'image' => '04.png', 'block' => ''),
array('name' => 'Комментарии', 'link' => WWW . '#', 'image' => '05.png', 'block' => ''),
)
),
array('name' => 'Новый 2', 'link' => WWW . '#', 'image' => '02.png', 'block' =>
array(
array('name' => 'Новый 3', 'link' => WWW . '#', 'image' => '03.png', 'block' => ''),
array('name' => 'Новый 4', 'link' => WWW . '#', 'image' => '04.png', 'block' => ''),
array('name' => 'Новый 51', 'link' => WWW . '#', 'image' => '05.png', 'block' =>
array(
array('name' => 'Новый 3', 'link' => WWW . '#', 'image' => '03.png', 'block' => ''),
array('name' => 'Новый 4', 'link' => WWW . '#', 'image' => '04.png', 'block' => ''),
array('name' => 'Новый 52', 'link' => WWW . '#', 'image' => '05.png', 'block' =>
array(
array('name' => 'Новый 3', 'link' => WWW . '#', 'image' => '03.png', 'block' => ''),
array('name' => 'Новый 4', 'link' => WWW . '#', 'image' => '04.png', 'block' => ''),
array('name' => 'Новый 53', 'link' => WWW . '#', 'image' => '05.png', 'block' =>
array(
array('name' => 'Новый 3', 'link' => WWW . '#', 'image' => '03.png', 'block' => ''),
array('name' => 'Новый 4', 'link' => WWW . '#', 'image' => '04.png', 'block' => ''),
array('name' => 'Новый 54', 'link' => WWW . '#', 'image' => '05.png', 'block' => ''),
)
)
)
)
)
)
),
),
array('name' => 'Новый 3', 'link' => WWW . '#', 'image' => '03.png', 'block' => ''),
array('name' => 'Новый 4', 'link' => WWW . '#', 'image' => '04.png', 'block' => ''),
array('name' => 'Новый 5', 'link' => WWW . '#', 'image' => '05.png', 'block' =>
array(
array('name' => 'Новый 3', 'link' => WWW . '#', 'image' => '03.png', 'block' => ''),
array('name' => 'Новый 4', 'link' => WWW . '#', 'image' => '04.png', 'block' => ''),
array('name' => 'Новый 51', 'link' => WWW . '#', 'image' => '05.png', 'block' =>
array(
array('name' => 'Новый 3', 'link' => WWW . '#', 'image' => '03.png', 'block' => ''),
array('name' => 'Новый 4', 'link' => WWW . '#', 'image' => '04.png', 'block' => ''),
array('name' => 'Новый 52', 'link' => WWW . '#', 'image' => '05.png', 'block' =>
array(
array('name' => 'Новый 3', 'link' => WWW . '#', 'image' => '03.png', 'block' => ''),
array('name' => 'Новый 4', 'link' => WWW . '#', 'image' => '04.png', 'block' => ''),
array('name' => 'Новый 53', 'link' => WWW . '#', 'image' => '05.png', 'block' =>
array(
array('name' => 'Новый 3', 'link' => WWW . '#', 'image' => '03.png', 'block' => ''),
array('name' => 'Новый 4', 'link' => WWW . '#', 'image' => '04.png', 'block' => ''),
array('name' => 'Новый 54', 'link' => WWW . '#', 'image' => '05.png', 'block' => ''),
)
)
)
)
)
)
)
)
);
Код:
menu.block.tpl.php
<div class='menupanel'>
{menu}
</div>
menu.items.tpl.php
<li {class}><a href='{link}'><img src='{image}' alt='{name}' align='middle' border='0' />{name}</a>{block}</li>
menu.union.tpl.php
<ul {class}>
{union}
</ul>
шаблонизатор
Код:
<?
class Template {
var $version = 0.01;
var $template = null;
var $module = null;
var $panel = null;
var $block = null;
var $backup = array();
var $data = array();
var $result = array();
var $standard = array();
function generator() {
global $engine;
if (!defined('__DATA')):
$this->standard = array(
'{_doctype_}' => $engine->doctype(DOCTYPE),
'{_meta_}' => $engine->meta(),
'{_doctype_}' => $engine->doctype(DOCTYPE),
'{_title_}' => $engine->config['title'],
'{_style_}' => STYLE_DIR . $engine->config['template'],
'{_welcome_}' => $engine->module->load('bar', 'panel', 'welcome', null, null, null, false),
'{_menu_}' => $engine->module->load('bar', 'panel', 'menu', null, null, null, false),
'{_userbar_}' => $engine->module->load('bar', 'panel', 'userbar', null, null, null, false),
'{_pathway_}' => $engine->module->load('bar', 'panel', 'pathway', null, null, null, false),
'{_copyright_}' => COPYRIGHT . " " . sprintf(_WORKS, PRODUCT),
'{_product_}' => PRODUCT,
'{_time_}' => $engine->debug->pagetime('off')
);
endif;
if (defined('__PRINT')):
$this->standard = array(
'{_doctype_}' => $engine->doctype(DOCTYPE),
'{_meta_}' => $engine->meta(),
'{_doctype_}' => $engine->doctype(DOCTYPE),
'{_title_}' => $engine->config['title'],
'{_style_}' => STYLE_DIR . $engine->config['template'],
'{_copyright_}' => COPYRIGHT . " " . sprintf(_WORKS, PRODUCT),
'{_product_}' => PRODUCT,
'{_time_}' => $engine->debug->pagetime('off')
);
endif;
$this->set(null, $this->standard);
$this->load() ? $this->compile() : die('Not Found Template');
}
function set($key, $value) {
if (is_array($value) && count($value)):
foreach ($value as $index => $string):
$this->set($index, $string);
endforeach;
else: $this->data[$key] = $value;
endif;
}
function load($config=false) {
global $engine;
$tpl = null;
if (is_array($config)):
if ($config['module'] != ''): $tpl = TEMPLATES_DIR . "modules/" . $config['module'] . "/" . ($config['prefix'] ? $config['prefix'] . '.' . $config['name'] : $config['name']) . ".tpl.php";
else: $tpl = TEMPLATES_DIR . "modules/" . ((isset($config['prefix']) && !empty($config['prefix'])) ? $config['prefix'] . '.' . $config['name'] : $config['name']) . ".tpl.php";
endif;
else:
if (defined('_CONTROL')):
$tpl = TEMPLATES_DIR . $engine->config['template'] . "/admin.php";
elseif (defined('__DATA')):
$tpl = TEMPLATES_DIR . $engine->config['template'] . "/data.php";
elseif (defined('__PRINT')):
$tpl = TEMPLATES_DIR . $engine->config['template'] . "/print.php";
else:
$tpl = TEMPLATES_DIR . $engine->config['template'] . "/template.php";
endif;
endif;
if (!file_exists($tpl)): return false;
endif;
switch ($config['mode']):
case "block":
$this->block = file_get_contents($tpl);
break;
case "panel":
ob_start();
require_once($tpl);
$this->panel = ob_get_contents();
ob_end_clean();
case "module":
ob_start();
require_once($tpl);
$this->module = ob_get_contents();
ob_end_clean();
break;
case "template":
default:
ob_start();
require_once($tpl);
$this->template = ob_get_contents();
ob_end_clean();
//$this->template = file_get_contents($tpl);
break;
endswitch;
$this->template = preg_replace('/<!--.*-->/Uis', '', $this->template);
return true;
}
function compile($config=false) {
if (!empty($this->data)):
$find = array();
$replace = array();
$result = null;
$tpl = null;
foreach ($this->data as $key_find => $key_replace):
$find[] = $key_find;
$replace[] = $key_replace;
endforeach;
switch ($config['mode']):
case "block":
$result = str_replace($find, $replace, $this->block);
break;
case "panel":
$result = str_replace($find, $replace, $this->panel);
break;
case "module":
$result = str_replace($find, $replace, $this->module);
break;
case "template":
default:
$result = str_replace($find, $replace, $this->template);
break;
endswitch;
$find = array();
$replace = array();
unset($find);
unset($replace);
else:
$result = $this->template;
endif;
$tpl = isset($config['name']) ? $config['name'] : "template";
isset($this->result[$tpl]) ? $this->result[$tpl].=$result : $this->result[$tpl] = $result;
$tpl = null;
$result = null;
unset($tpl);
unset($result);
}
function clear($config=null) {
switch ($config['mode']):
case "panel":
$this->panel = null;
break;
case "block":
$this->block = null;
//$this->data=null;
//$this->data=array();
break;
case "module":
$this->module = null;
$this->data = null;
$this->data = array();
break;
case "template":
$this->template = null;
$this->data = null;
$this->data = array();
$this->unload();
break;
endswitch;
if ($config['name']):
if (isset($this->result[$config['name']])):
$this->result[$config['name']] = null;
unset($this->result[$config['name']]);
endif;
endif;
}
function unload() {
$this->template = null;
$this->module = null;
$this->panel = null;
$this->block = null;
$this->backup = null;
$this->data = null;
$this->result = null;
}
function backup($key='backup') {
$this->backup[$key]['data'] = $this->data;
$this->backup[$key]['result'] = $this->result;
$this->data = null;
$this->result = null;
}
function restore($key='backup') {
$this->data = $this->backup[$key]['data'];
$this->result = $this->backup[$key]['result'];
$this->backup[$key] = null;
unset($this->backup[$key]);
}
}
?>
код герерации меню
Код:
/**
* Вспомлгательная рекурсивная функция для генерации выпадающего меню
*
* @param $data=array('name' => '', 'link' => '#', 'image' => '', 'block' => '')
*/
function items(&$data=array(), $last=null, $level=0) {
global $engine;
foreach ($data as $id => $group):
foreach ($group as $column => $value):
if ($column === 'image'):
$value = (is_file(IMAGES_DIR . $this->config['prefix'] . '/' . $value) && file_exists(IMAGES_DIR . $this->config['prefix'] . '/' . $value)) ? WWW.IMAGES_DIR . $this->config['prefix'] . '/' . $value : WWW.IMAGES_DIR . $this->config['prefix'] . '/' . 'default.png';
endif;
// если есть сложеный блок менюрекурсивно углубляемся и герерируем меню затем выходя и возвращая управление
if ($column === 'block'):
if (is_array($value)):
$id++;
$engine->template->set('{class}', ( ($id != $last || $last <= 1 ) ? "class='block'" : "class='block right'"));
$engine->template->backup($level . $id . $column);
// вложеных групп нужно хратить ключ шаблона, он является уровнем, тем самым не может пересечся
$level++; // углубляемся на 1 уровень
$this->items($value, null, $level);
$level--; // возвращаемся на свой уровень
$engine->template->restore($level . $id . $column);
else:
// если нет под уровня удалем возможность создания
$engine->template->set('{class}', '');
endif;
endif;
$this->config['name'] = 'items';
$engine->template->load($this->config);
$engine->template->set('{' . $column . '}', $value);
endforeach;
$engine->template->compile($this->config);
endforeach;
$engine->template->set('{union}', $engine->template->result[$this->config['name']]);
// очитска старого шаблона
$engine->template->clear($this->config);
$this->config['name'] = 'union';
// избавление от дублирование class=menu в подуровневых меню
$engine->template->set('{class}', ( ($level != 0 ) ? '' : "class='menu'"));
$engine->template->load($this->config);
$engine->template->compile($this->config);
$data = $engine->template->result[$this->config['name']];
$engine->template->clear($this->config);
}
/**
* Выпадающее меню
*
* @param $data=array('name' => '', 'link' => '#', 'image' => '', 'block' => '')
*
$menu = array(
array('name' => 'Новый 1', 'link' => '#', 'image' => '01.png', 'block' => ''),
array('name' => 'Новый 2', 'link' => '#', 'image' => '02.png', 'block' => ''),
array('name' => 'Новый 3', 'link' => '#', 'image' => '03.png', 'block' => ''),
array('name' => 'Новый 4', 'link' => '#', 'image' => '04.png', 'block' => ''),
array('name' => 'Новый 5', 'link' => '#', 'image' => '05.png', 'block' =>
array(
array('name' => 'Новый 3', 'link' => '#', 'image' => '03.png', 'block' => ''),
array('name' => 'Новый 4', 'link' => '#', 'image' => '04.png', 'block' => ''),
array('name' => 'Новый 51', 'link' => '#', 'image' => '05.png', 'block' => '')
)
)
);
*/
function menu(array $data=array()) {
global $engine;
$this->config['module'] = 'element';
$this->config['prefix'] = 'menu';
$this->config['name'] = 'items';
$this->config['mode'] = 'block';
$this->items($data, count($data));
$engine->template->set('{menu}', $data);
$engine->template->clear($this->config);
$this->config['name'] = 'block';
$this->config['mode'] = 'module';
$engine->template->load($this->config);
$engine->template->compile($this->config);
return $engine->template->result[$this->config['name']];
$engine->template->clear($this->config);
}
меню которое на выходе генерится
Для просмотра скрытого содержимого вы должны войти или зарегистрироваться.
есть ли идеи как или что сделать что бы в сейф моде было тоже быстро ?!