Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

PHP-растяжение dom_varimport: стремительное реформирования вложенных массивов в DOMDocument

Anna | 29.05.2014 | нет комментариев

Некоторые планы применяют XSLT в качестве основного «движка» образцов. Помимо знаменитых недостатков XSLT (скажем, его многословности, относительной медлительности и т.д.) у него есть и превосходства: «стандартность» языка, его идеология отсутствия «побочных результатов» и pattern matching, вероятность при необходимости вызывать способы helper-классов из образцов (через exslt-растяжение). Какое-то время назад я выкладывал библиотеку ShortXSLT, дозволяющую взамен массивных <xsl:value-of select=”/root/abc”/> и <xsl:choose>…</xsl:choose> писать легко {/root/abc} и {if…}…{elseif}…{/if} без потери продуктивности, так что задача многословности отчасти решается.

Но теперь речь не о превосходствах и недостатках XSLT (я уверен, и противники, и последователи этой спецтехнологии найдутся в изобилии). Я бы хотел описать один прием, тот, что комфортно использовать всуществующих планах с XSLT-образцами, и привести ссылку на библиотеку, реализующую данный прием с отличной продуктивностью.

Передаем данные в XSLT, минуя генерацию текстового представления XML

Представьте, что у нас есть контроллер, генерирующий определенный вложенный PHP-список объектов для отображения на странице. Он должен данный массив преобразовать в XML, тот, что потом пойдет на вход XSLT-образцу. Отлично бы, Дабы данное реформирование из конструкций PHP в XML выполнялось не вручную в всяком контроллере, а был определенный промежуточный слой абстракции, тот, что может использовать XSLT-образец прямо к PHP-данным, минуя текстовое XML-представление. Так мы уменьшим вероятность ошибок, да и письмо сократится. Мы сумеем трудиться с XSLT-образцами напрямую, минуя XML-представление данных.

Некоторое время назад я написал на Си PHP-растяжение dom_varimport (также выложено на GitHub). Оно содержит одноименную функцию, на вход которой подается объект DOMDocument и PHP-массив всякий вложенности. Функция заполняет переданный ей DOMDocument XML-представлением входного массива, и делает она это дюже стремительно — приблизительно в 20 раз стремительней, чем делал бы код, написанный на чистом PHP. Огромный документ размером около 1 МБ с тысячами вложенных свойств и объектов формируется приблизительно за 1-2 миллисекунды.

Скажем, вызов:

$doc = new DOMDocument();
dom_varimport(
    $doc,
    array(
        "some_key" => 111,
        123,
        0.5,
        "arr" => array("1a" => "1a"),
        "obj" => (object)array("prop" => "val"),
        true,
        false,
        "b" => null,
        "empty" => array(),
    ),
    "root" // optional, defaults to "root"
);
$doc->formatOutput = true;
echo $doc->saveXML(); // это только для отладки: на практике вам не необходимо будет вызывать saveXML()

напечатает вот такой XML-документ:

<?xml version="1.0"?>
<root>
    <some_key key="some_key">111</some_key>   <!-- plain key=value -->
    <item key="0">123</item>         <!-- numeric keys are "item" tags -->
    <item key="1">0.5</item>         <!-- double -->
    <arr key="arr">                  <!-- nested array -->
        <item key="1a">1a</item>         <!-- invalid tag names are converted to "item" -->
    </arr>
    <obj key="obj">                  <!-- nested object -->
        <prop key="prop">val</prop>
    </obj>
    <item key="2">1</item>           <!-- true converts to 1 -->
    <item key="3"/>                  <!-- false converts to an empty string -->
    <b key="b"/>                     <!-- null also converts to an empty string -->
    <empty key="empty"/>             <!-- empty array is an empty element -->
</root>

Все довольно прозрачно: ключи массива и свойства объектов становятся XML-элементами, по вероятности с теми же именами (но если имя неприемлемо для XML-элемента, то взамен него применяется «item»). Такой XML-документ дюже легко читать при отладке, он крайне суперкомпактен. Выходит, мы получаем на выходе объект DOMDocument, тот, что теснее можем передать XSLTProcessor-у. Текстовое представление XML нигде не фигурирует, нигде не парсится.

Как установить растяжение

Растяжение написано на Си, следственно его необходимо откомпилировать на машине, на которой установлены GCC и пакеты типа php5-src (либо php5-devel). Это вовсе не ужасно:

git clone https://github.com/DmitryKoterov/dom_varimport.git
cd dom_varimport
phpize
./configure
make
make test
make install  # or copy modules/dom_varimport.so manually
phpize --clean

Этап «make install» дозволено и не делать: довольно взять бинарный файл modules/dom_varimport.so и скопировать его в директорию с растяжениями PHP (скажем, /usr/lib/php5), в том числе и на других машинах. Наконец, необходимо подключить растяжение в /etc/php5/conf.d/dom_varimport.ini и перезапустить php5-fpm либо apache:

extension = /usr/lib/php5/dom_varimport.so

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB