PHP

индекс
206,76

Исследование совместимости Zend Framework и Quercus PHP

caucho-whiteЯ давно уже заинтересовался объединением мира Java и PHP, в частности, при помощи замечательного продукта Quercus PHP — порта PHP-интерпретатора вместе с библиотеками на Java. И вот, очередной раз просматривая уже почти готовый архитектурный макет своего движка для браузерных онлайн игр, я обратил внимание на ускользнувшую от меня деталь. Ведь я собирался использовать популярный и мощный фреймворк Zend Framework, запуская его, конечно же, поверх QuercusPHP (детальнее про архитектуру движка я начну рассказывать после нового года). А он, как известно, достаточно требователен к различным расширениям и модулям — в одном проекте, что я сейчас делаю, используя только Zend_Search_Lucene, я встретился с необходимостью подключения ранее не используемых расширений. А значит вполне может быть ситуация, что эта платформа не будет поддерживать все необходимые функции для работы Zend Framework-а. Просмотр Google по поводу совместимости ничего определенного не дал, так что было решено посвятить пару часов собственному исследованию.

Сначала о Zend Framework. В специальном разделе мануала перечислены все необходимые модули и указаны конкретные зависимости между модулями и классами фреймворка. Существует два вида зависимостей — Hard, когда некоторые классы или весь фреймворк жестко зависит от расширения и не будет работать без него, и Soft, когда расширение используется только для увеличения производительности, если же функции недоступны, она эмулируются при помощи РНР-кода.

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

Да, для проверки на совместимость я решил использовать некоторый тестовый скрипт, который, будучи запущенным в окружении QuercusPHP, собирает всю информацию о доступных функциях и установленных модулях, и сравнивает ее с необходимым для ZF списком.

Используя PHP функцию get_defined_functions я получил сначала полный список реализованных функций PHP, которых в Quercus-е оказалось 1342, вместе с несколькими служебными и специфическими только для него, например, Java и несколькими с префиксом resin, а также модуль Quercus. Кстати, аналогично надо бы собрать РНР с теми же модулями и проверить полноту реализации всех функций, но это уже задача следующего теста.

Далее надо было получить список именно модулей (расширений) реализованных в среде, ведь вручную сопоставлять функции и модули это, скажем так, занятие ещё то. В мануале нашлась функция, get_loaded_extensions, которая аналогично описанной выше, выводит массив модулей, доступных скриптам. Оказалось, что список расширений в QuercusPHP достаточно большой — 31 модуль. Поскольку в официальной документации о реализованных расширениях написано лишь в общих чертах, я приведу полный список (для последней версии, 3.2.1), возможно, пригодится:

mcrypt, SPL, curl, gd, mysqli, mhash, gettext, json, apc, mbstring, tokenizer, pgsql, memcache, zip, standard, hash, XMLWriter, ctype, xml, bcmath, postgres, PDO, pcre, zlib, session, SimpleXML, Reflection, ereg, iconv, oci8, mysql

Детально исследование по степени реализованности всех функций каждого модуля я ещё не проводил, наверное, это будет следующим тестом, однако на первый взгляд смутил только модуль SPL, для которого в списке функций есть только пять — spl_autoload, spl_autoload_register, spl_autoload_unregister, spl_autoload_extensions, spl_autoload_functions. Так что вопрос о полной реализации этого модуля пока остается открытым (пока писал, решил исследовать исходный код, вопрос снят — вроде весь функционал там реализован). Приятно порадовало, что «с коробки» реализован кеш APC, впрочем это особо подчеркивалось и на сайте (размечтаюсь — вот бы туда внедрить поддержку серьезного кеша, да еще распределенного и персистентного, типа EHCache или JBoss cache). Присутствует модуль mb_string, хотя практическая ценность его, мне кажется, только в совместимости API, ведь в отличие от обычного РНР, в QuercusPHP изначально полная поддержка UTF внутри есть уже сейчас, в данном случае там уже реализовано то, что ожидается в РНР 6. Но для включения необходимо установить опции в конфиге (а точнее — unicode.semantics и script-encoding). Порадовало, что в списке модулей есть Memcached расширение, однако при детальном просмотре не оказалось списка функций — возможно, странности работы именно самой функции получения списка реализованных методов, так как в исходном коде API присутствует.

Теперь осталось выяснить, что есть и чего не хватает по списку зависимостей для Zend Framework-а. В тестовом скрипте у меня есть два массива, в одном — список модулей, которые есть в QuercusPHP, в другом — список тех, что требуются для ZF. Сравнить их дело тривиальное, а на выходе получаем пять модулей, которые отсутствуют:
  • Модуль bitset, который предназначен для побитовых операций над двоичными данными. На самом деле потеря этого модуля не самое страшное, от него зависят только Zend_Search_Lucene, да и то Soft, то есть класс самостоятельно реализует функционал. Да и вообще — если у вас уже есть Java-платформа, используйте родной Java Lucene, в нем больше функционала, да и по скорости работы будет существенный выигрыш.
  • Модуль Dom, от которого уже зависит множество классов, в том числе и очень полезные, например, Zend_Feed, Zend_Rest_Server, Zend_XmlRpc и несколько модулей Zend_Service. Вот здесь первая сложность, так как все эти модули достаточно важны, без них привлекательность ZF вообще сильно снижается. Вместе с стем выход есть — судя по ссылке, где описание этого модуля, там всего лишь одна функция, dom_import_simplexml, которая получает Dom объект из SimpleXMLElement. А ведь модуль SimpleXML вполне реализован и поддерживается. Думаю, вручную написать эту функцию на РНР не составит особого труда, таким образом, избавившись от зависимости. А знающие Java могут пойти ещё дальше и добавить в сам движок этот модуль, благо и исходный текст есть и его структура достаточно проста и понятная.
  • Библиотека libxml — это уже сложнее, от нее зависит и ряд системных функций, тот же модуль Dom и SimpleXML, хотя как он реализован без этого модуля, это интересно. Но есть порт LibxmlJ, либо использовать другие парсеры, написав враппер для недостающих функций, тем более, что, судя по всему, все для работы с XML уже есть, разнича только в конкретных API. Уж с чем-чем, а с XML то в Java вроде никаких проблем нет. Но здесь уже требуется некоторая ручная работа и привлечение внешних библиотек. Так что первый модуль, который реально нужен для ZF, но отсутствует, обнаружен.
  • Модуль mime_magic для определения MIME-типа данных из HTTP-запроса, требуется только модулю Zend_Http_Client, который достаточно специфичный и, думаю, редко серьезно используется. Да и в модуле всего одна функция, думаю, написать враппер, используя исходники QuercusPHP будет несложно.
  • Модуль posix требуется для Zend_Mail и, наверное, единственное, что сложно перенести в java, однако… Если хорошо поискать, то есть несколько проектов, переносящих POSIX-API в Java (например, вот этот или Easy Posix Toolkit), тем более, что нам не надо все, а только то, что требует Zend_Mail. Хотя, наверное, лучшим вариантом будет переписать модуль Zend_Mail для того, чтобы избавиться от зависимости или даже просто не использовать его вовсе. И, кстати, переписать его не так и сложно — зависимость там только от функции posix_getpid, да и в коде есть обходной код, если такой функции нет.

И так, исходят из всего этого, можно сделать вывод, что из серьезных препятствий у нас только Dom/libxml, остальное либо автоматически обходится самим фреймворком или же просто можно заменить более продвинутыми аналогами, благо у нас есть возможность напрямую работать с Java классами. В первую очередь я рекомендую выбросить Zend_Search_Lucene и использовать напрямую API из Java Lucene, а еще лучше — написать компонент, реализующий интерфейс из ZF, а внутри использующий Java Lucene. Но это уже серьезная работа, иногда лучше использовать что-то на подобии Solr.

В принципе, ничего невозможного в запуске на QuercusPHP любых сторонних приложений и фреймворков, даже таких мощных и сложных, как Zend Framework, нет, однако требует взвешенного подхода и анализа зависимостей. Покопавшись в исходниках QuercusPHP, даже я, обладая посредственными знаниями в Java, сделал вывод, что в случае необходимости, расширить API достаточно просто, поэтому во многих случаях, если вам не хватает одно-двух, часто тривиальных функций, есть смысл написать их самостоятельно.

Думаю, в следующем исследовании я подробнее рассмотрю полноту реализации функций и сравню QuercusPHP и бинарную версию PHP 5.2.8 с тем же набором расширений.
+6
28 декабря 2008, 17:43
4

комментарии (34)

0
crash #
Запустить можно, но зачем?
0
aleks_raiden #
надо. чтобы получить то, что есть в java, но нет в PHP, при этом еще и избавившись частично от некоторых недостатков РНР, не переписывая и не переучиваясь.
0
PavelRadaev #
Расскажите пожалуйста что именно вы хотите получить такого, что есть в Java, но нет в PHP?
На самом деле я совсем не понимаю зачем вы пытаетесь «заправить фуфайку в трусы».
Возможно я ошибаюсь, и в этом есть смысл — поясните пожалуйста.
0
aleks_raiden #
например использовать JDBC, кеширование, кластеризацию. и просто повышение скорости. jabber, подержку хороших мейловых платформ, конекшин пул к базе и т.д.
0
PavelRadaev #
Я считаю, что для того, чтобы в полной мере насладиться тем что вы перечислили, вам нужно изучить java и использовать один из java фреймворков (их навалом). Я по диагонали почитал про quercus. Предполагаю, что у вас возникнут проблемы как минимум с хинтингом в IDE.
0
aleks_raiden #
простите, вы о чем??? какием хинтингом в кокой IDE? почему мне надо java Если мне надо только например получить конект к базе через pool и jdbc какойто?
0
aleks_raiden #
мне не надо никакого наслаждения от java :) мне хватает его от любимого языка. мне надо та ее часть которая хорошо отвечает за инфраструктуру нижнего уровня
0
norguhtar #
Затем что на самом деле php так же как и jsp транслируется в java servlet. По моим тестам java сервер ведет себя не хуже apache+mod_php а при большом количестве коннектов даже лучше. Причем если спользовать php без акселератора это усугубляется.
+2
axshavan #
А как дела обстоят со скоростью работы, вы не сравнивали?
0
aleks_raiden #
нет, пока до сравнения скорости не дошел, но, как минимум, не медленнее, это точно. судя по описаниям в сети — быстрее, иногда намного. как только построю испытательный стенд, попробую.
0
EugeneVC #
Я тоже делаю браузерные игры! Но использовать Zend Framework — это же тормоза. Мне вот пришлось даже от blitz отказался. Все на голом PHP пишу.
0
aleks_raiden #
где именно и в чем тормоза? Вы руками все реализуете? Ну-ну :) Конечно, в зенде есть сложные и медленные вещи, я не использую его весь, а часть функционала заменил на другие библиотеки. И никак не призываю экономить на серверах.
0
EugeneVC #
да я тоже пробовал использовать Smarty, ZF, Kohana и Codeiniter — но слишком медленно. В основном все браузерки используют чистый php. А сервера тоже не бесконечны. )
–1
aleks_raiden #
что значит слишком медленно? что именно, какие операции/функции и т.п. Понимаете же, что без конкретики все это сферический конь в вакууме
–1
EugeneVC #
Ну тут 2 составляющие:

1 — это база данных, тут ничего не сделаем кроме, что закешируем повторяющиеся запросы ( к примеру описание местности) — mеmcached нужно использовать. Какой у нас из Framework пользует memcache + ORM — да никакой. Плюс в ORM смотришь как они запрос составляют — такая куча кода.
2 — Сам фреймворк — используем MVC — приложение типа Hello Word жрет 2 M памяти, заместо echo(«Hello Word») 60к.

Конечно, в ZF полно хороших функции типа валидаторов емейлов. Но использовать его рекомендую как как либу, а не как MVC фреймворк.
>>Ведь я собирался использовать популярный и мощный фреймворк Zend Framework, запуская его, конечно же, поверх QuercusPHP
так будет тяжеловато
+1
aleks_raiden #
вот это уже конкретика.

1. Здарсте :) именно, в основном из-за БД и выбрана вообще схема на Java. И никакого ORM не надо, вот это да, реально замедляет работу. Кстати, мемкеш не лучший выбор, когда буду описывать выбор конкретных компонент своей архитектуры, опишу подробнее. Достаточно всего лишь обычных средств JDBC.

2. Почему используем фреймворк сразу равно MVC? если я использую только Zend_Feed, Zend_Cache и еще пару компонент — никто не обязывает меня использовать все из фреймворка. Да и вообще сама MVC она очень разной бывает, epiCode так вообще ее за 10 строк делает, ну почти. Это же архитектурный прием, а не догма и не ZF единым. Именно реализация MVC в зенде мне очень не нравиться и категорически не подходит, потому нигде и не использую.

не тяжеловато. на сравнимых системах должно быть быстрее, а даже если и так же, то получая в дополнение столько «вкусностей», это достойная плата.
0
EugeneVC #
тогда вопросы по 1 пункту а почему тогда все не на JAVA? как я понял по рейтингам JAVA где то посередине между питоном и C++
насчет библиотек полностью за!

0
aleks_raiden #
а зачем? Зачем менять знакомую платформу и язык, удобный и понятный на совершенно новое что-то? если надо только небольшая часть возможностей, да и то не языка, а самой платформы или стека технологий, не знаю как java в этом контексте описать. да и просто, стоимость Java-разработки намного выше. нет надобности в общем :)
–1
EugeneVC #
я только одну проблему вижу — разработчику придеться знать 2 языка PHP и JAVA, а таких не очень много.
+1
aleks_raiden #
зачем? разработчик пишет все на PHP, Java отвечает только за инфраструктуру. Да, плюс ему дается еще структура классов, на РНР, в которых скрыта та часть java-библиотек, которые все же нужны. Это и есть та часть платформы, что видна конечному разработчику игры. в принципе, он вообще может не знать ни Java, ни на чем оно там исполняется. Это надо только тому, кто будет писать сам фреймворк, но это уже другой вопрос :)
НЛО прилетело и опубликовало эту надпись здесь
0
aleks_raiden #
а в чем проблема? где здесь маразм?
НЛО прилетело и опубликовало эту надпись здесь
–1
aleks_raiden #
то есть, фреймворки придумали просто так, от нечего делать? Возможно. У Java есть, но зачем мне java если ее не знают те, кто должен писать? И есть все есть в java и все там так быстрее работает, то зачем другие языки? А конкретику можно, что и как будет работать гораздо быстрее, по времени и сложности разработки будет тоже меньше и стоимость решения также будет ниже.

Снова таки — я предлагаю (а, вернее, хочу) использовать то от мира java, что там есть хорошего, легкого и нужного мне, остальное все не трогаю, не больше и не меньше.
0
dimas09 #
вот если бы еще кто внедрил php в .net среду
0
aleks_raiden #
www.codeplex.com/Phalanger вот вам на дотнете
0
EugeneVC #
Любителям флейм развести про питон и рельсы — велком в соответствующие топики.
0
crocodile2u #
Мне кажется, вам несколько рановато писать серьезные исследования.

> Модуль Dom, от которого уже зависит множество классов… Вместе с стем выход есть — судя по ссылке, где описание этого модуля, там всего лишь
> одна функция, dom_import_simplexml, которая получает Dom объект из SimpleXMLElement.

www.php.net/manual/en/book.dom.php — посмотрите, там ведь еще приличное количество классов реализовано — это довольно полноценная реализация Document Object Model…
0
aleks_raiden #
а мне кажется, что рано вот так критиковать, не разобравшись. По ссылке с Zend Manual идет на вполне конкретный раздел — DOM Functions, где указана 1 (Одна) функция. Далее, я не поленился и проверил, взяв последнюю версию фреймворка и проведя по ней поиск — и везде зависимость от этой одной функции — dom_import_simplexml
0
crocodile2u #
Надо же, как странно. А у меня вот, например, еще и поиск по слову «DOMDocument» выдает целую гору совпадений :)

Вы вот пишете: «Думаю, вручную написать эту функцию на РНР не составит особого труда, таким образом, избавившись от зависимости.»

Не поленитесь таки посмотреть, что возвращает dom_import_simplexml(). А возвращет она объект DOMDocument. Таким образом, дело из написания одной функции вырастает в написание полноценной реализации DOM на PHP.
0
roller #
гм, и что вы ЭТО выпустите в продакшн?

вы можете быть каким угодно мастером удаления гланд через жопу, но… тут аналогия с шаблонизатором: лучший шаблонизатор — это сам php! так зачем под php подкладывать еще один слой, тем более в условиях общемирового кризиса (fuck the crisis!!), когда железо уже не настолько дешево??
0
aleks_raiden #
ээ… и где это сервера так подорожали? гугл и яндекс распродает сервера уже?
Если вы не можете сами ответить себе зачем, то значит не понимаете сути и все. Действитель, лохи и убогие идиоты придумали шаблонизаторы — давайте напишем это разработчикам начиная от сматри, заканчивая Apache Velocity
0
developer #
автору, предлагаю с людьми, которые рассуждают о пхп как о шаблонизаторе, не вступать в палемику
0
developer #
как минимум этот проект будет хорошим исследованием, жду очень результатов, мне например сильно интересно как он будет развиваться.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.