Twig очень долго грузит render()

fairy-wilbury

Новичок
Только подключила шаблонизатор Twig, все бы с ним хорошо, но он страшно долго загружает render(). Между 20 и 30 секундами грузит. Понятно, что что-то сильно не так, но нет никаких идей в чем может быть дело. Не зависимо от того, какой Loader используется (даже просто String Loader грузит одну строку столько же, сколько кастомный Loader из базы данных).

Я чего-то не знаю о настройках?

Twig используется не как часть symfony, а сам по себе.

Тормозит именно вызов render()

Активация:
PHP:
$loader=new Twig_Loader_DB();           
$cache=$_SERVER['DOCUMENT_ROOT'].'/cache/';
$twig=new Twig_Environment($loader,array(
    'cache'=>$cache,
    ));
Рендер:
PHP:
$template=$this->twig->render('index.twig', $replace);
Заранее спасибо за помощь = )
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Во-первых, для получения достоверных данных нужно не использовать кеш - может оказатся, что тормозит запись или чтение в него. Пример надо свести к максимальному минимуму, при котором происходят тормоза.
Если пальцем в небо - такое бывает, если по каким-то причинам случается рекурсивная обработка - например, рендеринг страницы ошибки вызывает ошибку.

У нас твиговские шаблоны даже очень сложные и с вложенностью обрабатываются за десятые доли секунды, так что проблема не в твиге.
 

fairy-wilbury

Новичок
Да, спасибо! Путем проверки в минимальной конфигурации выяснилось, что проблема в autoload - почему-то Twig (так же как и Doctrine класс абстракции базы данных) надо подключать до моих классов - spl_autoload_register()
Это нормально, или надо искать какую-то проблему в моем методе подключения классов?
То есть теперь вот так:
PHP:
#include Twig
        require_once $_SERVER['DOCUMENT_ROOT'].'/php/external/twig/Autoloader.php';
        Twig_Autoloader::register();
        # Doctrine       
        require $_SERVER['DOCUMENT_ROOT'].'/php/external/Doctrine/Common/ClassLoader.php';
        $classLoader = new ClassLoader('Doctrine', $_SERVER['DOCUMENT_ROOT'].'/php/external/');
        $classLoader->register();
        require_once $_SERVER['DOCUMENT_ROOT'].'/php/external/htmlpurify/HTMLPurifier.auto.php';
        require_once $_SERVER['DOCUMENT_ROOT'].'/config.php';
        #main classes
        spl_autoload_register('self::load_classes');
А если поменять местами spl_autoload_register с Твигом и Доктрин, то render() начинает занимать от 20 секунд и больше... И Доктрин добавляет тормозов, хоть и не столь значительных...
 

hell0w0rd

Продвинутый новичок
Нормально, но для этого есть более удобный метод - composer.
Один раз подключаешь его автолоадер и он и твои, и вендорские классы грузит.

И тут уже было обсуждение - плясать от DOCUMENT_ROOT не хорошо.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
надо искать какую-то проблему в моем методе подключения классов?
прозреваю, что self::load_classes - неполноценный автолоадер, скорее всего, не учитывается то, что автолоадеры в чейне должны возвращать true/false для успешного/неудачного подключения файла с классом.
 

fairy-wilbury

Новичок
hell0w0rd, Спасибо за информацию, посмотрю на Composer. Я так понимаю, он требует установки? Его надо будет и на сервер хостинга устанавливать, при запуске проекта? (Простите, если вопрос дурацкий - не сталкивалась с этим). Все что у меня подключенно, не требует никакой дополнительной установки кроме подключения файлов...
А нет ли ссылки на обсуждение про Document Root, а то в поиске не легко найти, с учетом частоты данного словосочетания? =)

флоппик, Спасибо, ценная информация, будем разбираться = )

Absinthe, в данном случае, это на локальном сервере...
 

keltanas

marty cats
Я так понимаю, он требует установки? Его надо будет и на сервер хостинга устанавливать, при запуске проекта? (Простите, если вопрос дурацкий - не сталкивалась с этим).
О даааа!))) Вообще говоря, у многих хостеров проблемы с запуском композера. У одних в консоли PHP 5.2, у других ограничение на использование ресурсов. Так что composer install/update не успевает отрабатывать.
Другой вариант - паковать папку vendors в архив, отправлять на хослинг и там распаковывать. Но, как казывает практика, при распаковке архива у многих так же действую ограничения, и он может просто не успевать распаковаться, прежде чем процесс распаковки будет убит.
Третий вариант - закачивать все зависимости по одному файлику. Но, в этому случае проще убица ап стену, чем дождаться завершения копирования.
 

keltanas

marty cats
keltanas, Вот этого я и боялась = ) При таком раскладе лучше с этим не связываться...
Совершенно верно. При таком раскладе лучше не связываться с гавнохостингами, у которых по 100500 сайтов на одном сервере и никаких условий для труда :)
 
Сверху