Результаты циклических шаблонов PHP - PullRequest
0 голосов
/ 04 июня 2009

Так что здесь, на работе, у нас есть домашняя система шаблонов, которая легка и отлично работает для нас.

Стена, на которую мы попадаем, заключается в том, что мы хотим иметь возможность перебирать шаблон. Вариант использования - это что-то вроде результатов поиска. Мы пытаемся придумать, как мы могли бы это сделать. Мы придумали три способа прямо сейчас. Во-первых, это старый добрый файл, который хранит html внутри цикла, а затем зацикливает его и использует concat для помещения переменных в html. Вторым способом, который мы придумали, было включение файла повторно. И третий способ заключался в том, чтобы включить файл один раз, использовать выходной буфер для захвата его вывода, добавить к нему текстовое эхо «, а затем использовать для него eval (мой начальник хотел, чтобы мы придумали творческие способы сделать это).

Хорошо, я предпочитаю метод многократного включения, поскольку он позволяет полностью отделить html от логики. Метод eval также делает это, но кажется немного более хакерским. Что ж, мы сделали несколько тестов времени на это и обнаружили, что наличие html прямо внутри цикла (метод один) было самым быстрым, и за ним последовал метод eval, и несколько раз включалось последним. Включение было на самом деле примерно в 5-6 раз медленнее, чем метод eval. (Мы включили файл / оценили файл 1000 раз, сделали это 100 раз и усреднили их, чтобы получить наши результаты).

Есть ли способ ускорить множественное включение? (Похоже, что каждый раз, когда мы выполняем, include php снова запускает файловую систему.)

Или у кого-нибудь есть способ выполнить этот тип вещи?

Ответы [ 3 ]

2 голосов
/ 10 ноября 2009

Как показали ваши тесты, лучший способ оптимизировать скрипт - это циклически перебирать уже включенный HTML-код в ваш скрипт.

Время удара исходит из:

  • eval () вызывает синтаксический анализатор PHP для проверки кода
  • include () использует доступ к диску

Каждый include () затем снижает производительность при чтении с диска неизмененного файла. Для оптимизации этого доступа к диску будет тогда ваша опция eval ():

  • include (): intial-parser + [доступ к диску + parser] * N циклов;
  • eval (): начальный анализатор + доступ к диску + анализатор * N циклов
  • встроенный HTML: начальный парсер

Чтобы сохранить код в чистоте, вы можете создавать функции, содержащие HTML, использовать глобальные переменные или одну переменную Object или Array, содержащую все данные, необходимые для отображения в вашем HTML, что-то вроде

function html_comment ($comment)
{
    //global $comment;

    ?>
    <div class="comment">
        <div class="author"><?php echo $comment['author'] ?></div>
        <div class="date"><?php echo $comment['date'] ?></div>
        <div class="date"><?php echo $comment['content'] ?></div>
    </div>
    <?php
}

...
foreach ($comments as $comment)
    html_comment($comment);
0 голосов
/ 09 ноября 2009

Старый вопрос, я знаю.

В любом случае, я бы предложил использовать простой цикл for или foreach внутри шаблона. Там нет ничего плохого. Во-первых, поскольку циклический просмотр некоторого кода представления все еще остается логикой представления (поскольку это также облегчает изменение вывода, скажем, вывода в столбцах для вывода в строках - глупый пример). Во-вторых, PHP все еще является языком шаблонов. Нет ничего плохого в использовании простых структур управления в шаблоне. Использование таких систем, как Smartys, - это просто добавление еще одного уровня абстракции (с другим синтаксисом для изучения), который обладает большой мощью PHP (и, следовательно, создает довольно много накладных расходов). Это чепуха в моих глазах (на заметку: для меня это эффект внутренней платформы , анти-паттерн).

0 голосов
/ 04 июня 2009

Кэшируйте последнюю страницу. Я имею в виду, что вы берете все свои «блоки» (циклы, фрагменты, как хотите, чтобы они назывались) и объединяете их в один файл PHP в своем кэше и просто включаете его с тех пор. Таким образом, вы обращаетесь к файловой системе только один раз за запрос, а не, скажем, 25 раз.

...