+10.35
Рейтинг
25.74
Сила

Оптимизация некоторых методов ядра

UPD: Недавно выяснил, что все эти оптимизации уже сделаны в AltoCMS.
UPD2: Добавил буфер значений для метода ядра GetEntity().
UPD3: Немного переписал класс Config.class.php.

С ЛС я знаком уже больше 3 лет. В течение этого времени следил за развитием движка, а также за быстродействием версий с 0.4* до 1.0*. Поэтому решил проверить, куда уходит процессорное время.
Поставил на тестовый сервер версию 1.0.3.

Параметры сервера:
Intel® Xeon(TM) CPU 3.00GHz 4GB RAM
GNU/Linux 8.5
nginx/1.1.14
Apache/2.2.22
PHP 5.3.23 + APC (на момент теста оказывается, что не работало) + Memcache


Читать дальше →

Отключение автогенерации ссылок из урлов в тексте

Для того чтобы при публикации статьи текст вида something.com не преобразовывался в something.com необходимо в конфиг jefix вставить:
    // автоматическое преобразование URL в ссылку
    'cfgSetAutoLinkMode' => array(
          array(false)
     ),    

Дублирование ajax-запроса

Недавно заметил у себя, что при регистрации, авторизации и прочих действий из модальных окон на сервер следует два запроса подряд с одинаковыми параметрами (см. скриншот). На livestreet.ru ровно точно также.



Расстановка брекпойнтов в скриптах с целью выяснить, почему же второй раз идет запрос, ничего не прояснила.
Функция, которая биндится на submit формы (в которой, например, вызывается ls.user.login()) вызывается один (первый) раз. А сам ls.user.login() два раза. При чем, даже если очистить код функции ls.user.login(), то она все равно вызовется два раза. Следовательно, дело не в ней.
Будем копать дальше.

Как правильно сделать наследование экшена?

Требуется сделать ActionVideo для своего типа топика, который будет почти полностью повторять ActionTopic.
Логично сделать от него наследование. Но тогда, если другие плагины переопределят методы ActionTopic, эти изменения не коснутся наследуемого ActionVideo. Есть идеи, как реализовать наследование с учетом изменений от плагинов?

Идея плагина "Расширенные теги"

Захотелось сделать что-то подобное кинопоиску. Где навигация идет по разного рода тегам.

Плагин должен
— добавлять возможность создавать группы тегов,
— определять принадлежность к разным типам топиков или блогов.
— задавать параметры валидации.

В общем в скриншотах то, что получилось.

Читать дальше →

Full Cache. Простое Frontend кеширование без Nginx

Цель. Снизить нагрузку при большом потоке незарегистрированных пользователей.
Причины нагрузки.
1) Даже при включении бэкенд кеша любого вида(memcache, file, xcache) движок все же ест память, так как структуру данных он выстраивает в любом случае. При большом количестве плагинов растет количество классов и экземпляров этих классов, которые загружаются в память. В данном случае использование бэкенд кеша увеличивает скорость работы за счет кеширования результатов запросов в базу данных. Но размер потребляемой памяти остается тот же. Например, у меня страница топика ела 19 Мб, а список — 30мБ. При этом частично помогает, например, использование ссылок на объекты с помощью & при переборе, а не их копий. Но все же это крошки.
2) Даже при полном кеше БД все же выполняются несколько запросов, таких как получение данных о сессии или update таблицы просмотров. Под нагрузкой и при использовании InnoDb базы «update запрос» может очень сильно тормозить.
Ресурсы и методы
Собственно смысл прост. Он состоит в том, чтобы один раз генерировать страницу, а потом отдавать ее сразу.
Проверять на существование и отдавать кеш надо будет перед запуском движка, что разгрузит потребляемую память.

Читать дальше →

ORM для встроенных модулей

Пока еще модули Topic, Comment, User… не являются наследниками ORM классов, а зачастую хочется использовать преимущества ORM в плагинах, дополняющих данные модули. Скажем релейшены.

Конечно, можно отредактировать класс модуля жестко:
заменить
extends Module

на
extends ModuleORM

Только придется прописывать еще в методе Init():
parent::Init();

+ сделать тоже самое для сущностей.
Согласитесь, каждый раз при развертывании проекта выполнять эти манипуляции совсем неинтересно. Да и в итоге можно забыть, где и что менять. При чем, при обновлении модуля придется все вставлять заново.

Читать дальше →

Разработчики. Будьте внимательнее.

Вчера на одном из сайтов, сделанных на livestreet, столкнулся с проблемой.

При заходе по адресу sitename/blog/blogurl/1.html вываливался Exception о ненахождении шаблона «blogurl.tpl»

Fatal error: Uncaught exception 'Exception' with message 'Can not find the template: 
actions/ActionBlog/blogurl.tpl' in sitename/engine/modules/viewer/Viewer.class.php:321 
Stack trace: #0 [internal function]: ModuleViewer->Display('actions/ActionB...') 
#1 sitename/engine/classes/Engine.class.php(481): call_user_func_array(Array, Array) 
#2 sitename/engine/classes/Router.class.php(368): Engine->_CallModule('Viewer_Display', Array) 
#3 sitename/engine/classes/Router.class.php(70): Router->__call('Viewer_Display', Array) 
#4 sitename/engine/classes/Router.class.php(70): Router->Viewer_Display('actions/ActionB...') 
#5 sitename/index.php(35): Router->Exec() 
#6 {main} thrown in sitename/engine/modules/viewer/Viewer.class.php on line 321


Читать дальше →

Как подключить генерированный скрипт через AppendScript?

Например в теле шаблона имеется скрипт с элементами Smarty, например:

var DIR_WEB_ROOT='{cfg name="path.root.web"}';
var DIR_STATIC_SKIN='{cfg name="path.static.skin"}';
var BLOG_USE_TINYMCE='{cfg name="view.tinymce"}';
var TALK_RELOAD_PERIOD='{cfg name="module.talk.period"}';
var TALK_RELOAD_REQUEST='{cfg name="module.talk.request"}'; 
var TALK_RELOAD_MAX_ERRORS='{cfg name="module.talk.max_errors"}';
var LIVESTREET_SECURITY_KEY = '{$LIVESTREET_SECURITY_KEY}';

var TINYMCE_LANG='en';
{if $oConfig->GetValue('lang.current')=='russian'}
TINYMCE_LANG='ru';
{/if}

var aRouter=new Array();
{foreach from=$aRouter key=sPage item=sPath}
aRouter['{$sPage}']='{$sPath}';
{/foreach}


Хотелось бы его приобщить к массиву скриптов и сжать в один файл со всеми.
Можно было бы сгенерировать данный скрипт отдельным файлом через Fetch (как это делается в ajax запросах), но
метод AppendScript() во Viewer работает только с путями к скриптам. Как передать туда само тело скрипта или есть какая-то другая возможность?

Миниплагин "Remember Me".

В общем меня всегда мучило то, что если работа над сайтом происходит на нескольких компьютерах или браузерах под одним юзером, то активной остается только текущая сессия, а с остальных выкидывает. И приходя, допустим, домой, приходится логиниться повторно.

Хотелось сделать, как в соцсетях, и хранить каждую сессию отдельной строкой в БД.

Читать дальше →