to post messages and comments.

← All posts tagged PHP

Нужна помощь знающих людей по си. Есть php расширение
github.com
оно преобразует массив в dom-документ. Но иногда вылетает "recursion detected", см строку 196. И я не знаю почему это могло бы происходить.
Тут может ещё скил в php расширениях нужен.

В проект artchive.ru нужен php-разработчик. Полная занятость. Удалёнка. (предпочтение Киев)
Опыт, ООП, mysql, читаемый код, jquery, xslt. Опыт solr — большой плюс.
Компенсация от $1300.
Связь — в личку или мыло [email protected]

Рекомендации приветствуются.

пришло письмо от Zend Technologies
we are phasing out the Zend Developer Cloud and we will be shutting down the service on Sunday, September 7, 2014
Говорят, что закрывают своё облако для php проектов. Правильно делают — им всё равно никто не пользовался. И прожило оно в итоге года 2.

PHP

Помощь зала. Очень нужно протестировать скорость работы php скрипта.
Он генерит случайный массив и тремя разными способами делает из него xml. Выводит время генерации xml и версию php.
Ничего не крадёт и письма не шлёт.

Очень нужно. Вот сам скрипт
yadi.sk

Результаты теста можно сюда в коменты.

PHP

Есть в php возможность отдать юзеру весь контент, а потом сделать ещё что-нибудь долгое? Но так чтобы юзер этого долгого действия не заметил.

Декомпозиция сущностей привела к тому, что для того чтобы сделать трансформацию xslt-шаблона страницы нужно подгрузить 10-20 внешних xslt, которые подгружаются через xsl:import. Это привело к долгой загрузке шаблона для его трансформации. Конструкция
$proc = new XSLTProcessor();
$proc->importStyleSheet($xsl);
могла занимать 3 секунды.

От декомпозиции отказываться не хотелось. Уж очень мне нравится идея сделать так
<xsl:call-template name="m_users_show_link"/>
а потом всего в одном месте править, чтобы выводить везде на сайте ФИО или И.О.Ф. В общем много плюшек имеем с этого.

В #2393013 была попытка решить вопрос использованием xsltCache. Но он работает странно. У него долго происходит не только первая загрузка, но и 2,3,4, а потом если повезёт то загрузит шаблон быстро. Не понял я отчего он так себя ведёт.

Там же в #2393013 я высказал идею парсить xsl в единый файл со всеми необходимыми шаблонами и уже без импортов. Сначала я решил сделать это регулярками. Идея показала свою жизнеспособность и возможность такого преобразования. Но идея делать это регулярками не очень хороша, по кучи причин, одна из которых в том, что php иногда валился с неопознаной ошибкой.

Сегодня ночью был реализован вариант с разбором xsl через представление его в виде xml-дерева. В итоге получилось объединить (скомпилировать) необходимые xslt-шаблоны в один за разумное время с последующим его сохранением на диск.
Бенчмарки трансформаций
— некомпиленый вариант — 3.3 сек.
— первая компиляция — 1.1 сек.
— использование уже скомпиленого шаблона — 0.08 сек.
— с включённым xsltcache с использованием скомпиленого шаблона — 0.03 сек.

Как видно, даже вариант "скомпилить все xsl файлы в один, а потом сделать трансформацию" работает в 3 раза быстрее, чем просто "сделать трансформацию на шаблоне с кучей импортов". Не говоря уже о трансформации закешированого скомпиленого шаблона.

А ещё я люблю использовать именованные шаблоны вместо матчей. Т.е. я использую <xsl:template name="m_user"> вместо <xsl:template match="user">. И это дало положительный эффект. После сборки единого xsl-файла, парсер пробегается по нему и ищет, какие именнованые шаблоны вызываются (<xsl:call-template name="..."/>). А затем все неиспользуемые темплейты попросту выбрасываются. Если бы в коде использовались матчи, то невозможно было бы определить вызывется ли этот шаблон или нет, потому что данных ещё нет. Такое выбрасывание ненужных шаблонов уменьшило размер скомпиленого xsl-файла на 30%.

Вот уж не ожидал, но xsltCache нехило так ускоряет импорт xsl файлов.
Есть в проекте разухабистый xsl с кучей импортов (подозреваю что импорты — узкое место) и он импортируется на моей тачке безумные 2 секунды.

$xsl = new DomDocument();
$xsl->load($xsl_file_path);
$proc = new XSLTProcessor();
$proc->importStyleSheet($xsl); //2!!! секунды

Проблема в том, что результат importStyleSheet невозможно закешировать. После установки xsltCache код стал таким

if (class_exists("xsltcache", false)){
$proc = new xsltCache();
$proc->importStyleSheet($xsl_file_path);
}
else{
$xsl = new DomDocument();
$xsl->load($xsl_file_path);

$proc = new XSLTProcessor();
$proc->importStyleSheet($xsl);
}

И импорт стал работать 0.0001 секунды.

Проект pecl.php.net
Установка на php5.4 michaelsanford.com
Расширение xslcache.so нужно загружать после xsl.so, иначе PHP может падать (segmentation fault)
И ещё годная заминусованя статья на хабре habrahabr.ru
В сети упоминается что расширение xslcache достаточно стабильно. Некоторые рекомендуют использовать на боевых серверах.

PS На счёт импортов. Может есть смысл парсить xsl, заменять строки импорта на сами импортируемые файлы и сохранять? Тогда у нас получится один большой xsl файл, но уже без всяких зависимостей. Нужно будет как-нибудь потестить.

PHP

Как-то я здесь juick.com высказывал идею автоматического тестирования в php. На выходных запилил реализацию такого тестирования.
Юскейс такой:
1) кодим страницу
2) когда она готова, отлажена и работает, то ставим флаг $this->is_test=true
3) открываем страницу в браузере, юзаем её (всё что можно) и в это время тесты пишутся самостоятельно — сохраняется окружение и результат.
4) отключаем флаг $this->is_test=false
5) кодим дальше
6) ...
7) когда нужно прогнать тесты открываем админку, жмём тесты
8) в это время система запускает каждый тест, из него восстанавливает окружение и сверяет результаты
9) профит!

На картинке прогон тестов.
s1.ipicture.ru

PHP

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

Смысл автотестов таков. Есть у нас некий обработчик, который при заданных условиях (сессии, куки, посты, геты) возвращает определённый набор данных. В процессе разработки мы видим, что эти данные верны и делаем запись:
тест1 — окружение (посты, геты, сессии, куки) — набор данных

Когда нам нужно протестировать обработчик, мы воссоздаём окружение из теста1 и сравниваем полученные данные с набором данных из теста1. При сравнении нужно учитывать не столько совпадение данных, сколько их соответствие шаблону. Логика сравнения по шаблону должна быть примерно такой:
$data['pictures'] — массив с числовыми индексами. Если в $data['pictures'] не массив или индексы строковые, то тест не пройден.

В иерархии тестирования, такое автотестирование будет находится между юнит-тестами (phpUnit) и функциональным тестированием (selenium).

PHP

Кто заинтересован в проекте на php? По бюджету ~$2000. Сроки — это уже сами согласуете. Знание английского.
Если интересно — пишите в личку дам контакты заказчика.

$this->get('form.factory')
$this->get('request')
За такие строки страшно становится за людей, пишущих на symfony. Ещё называют это удобным. Может вообще весь код запихнём в строку? Тем самым придумав свой крутой язык (или возрадим старый). Например так
$this->jost_do_it('LET k=10: PRINT K:');

PS. Вот ещё прямо в ядре
$this->container->get('router')->generate($route, $parameters, $absolute);
Поди узнай какой и откуда generate вызовется.

HipHop PHP не видит ошибок в файлах. Уже долгое время пытаюсь разобраться в причинах проблемы. Поиск не дал никаких результатов, кроме пары неплохих музыкальных композиций.
Включайте мозг когда даёте название.

PHP

На phpclub.ru сидят какие-то идиоты ей богу. Меня хотят забанить за то, что я написал в тему, которй уже более месяца. А видели бы вы темы которые у них прикреплены: древние и все ссылки неработающие.

PHP

что-то у меня никак не хотят работать флаги для установки метода сжатия ZipArchive
ни ZIPARCHIVE::CM_SHRINK ни даже ZIPARCHIVE::CM_STORE.
Всё жмёт CM_DEFLATE

Есть какая-нибудь достойная альтернатива ZipArchive?