Главная > Java - язык и технологии, PHP, Высокопроизводительная архитектура > Технологии инакомыслия: исследуем работу с СУБД через JDBC не выходя из РНР

Технологии инакомыслия: исследуем работу с СУБД через JDBC не выходя из РНР

27 января 2008

php_jdbc.jpgПриветствуем наших читателей. Сегодня у нас нетривиальная статья-исследование. Честно говоря,  я ещё сам не знаю, выйдет ли из него что-то стоящее и рабочее, но попытаться стоит. Спросите почему? Сейчас. Начнём с основных понятий. И так, JDBC - это, если расшифровать, Java Database Connectivity, то есть, специальный API для Java, который позволяет унифицировать доступ к различным базам данных, вне зависимости от типа СУБД. Концепция JDBC основана на понятии "драйвера", который может загружаться в во время выполнения и отвечает за унификацию доступа к СУБД. Этот API входит в стандартную поставку Java (в пакете java.sql). Расшифровывать PHP мы не будем, надеюсь всем понятно. Но открыт вопрос "зачем?". Если вы постоянный читатель нашего блога, вы могли заметить несколько статей о различных JDBC драйверах, позволяющих организовать пулы коннектов, кластеризацию и отказоустойчивость соединения с базой данных, таким образом организовать высокопроизводительный интерфейс для доступа к СУБД, причём, не привязываясь к определённым особенностям базы данных. Но вот для РНР такого, к сожалению нет, из встроенных интерфейсов доступа есть только mysqli и PDO, теперь ещё появился вариант mysqlnd (это то, что касается СУБД MySQL). Таким образом, для построения отказоустойчивой архитектуры на базе РНР и MySQL необходимо применять сторонние решение - систему кластеризации MySQL, MySQL Proxy или ещё что-то. Но ведь наши друзья-разработчики из мира Java могут иметь это все (в первую очередь, пул коннектов и кластеризацию) прямо "out of the box", применяя просто нужный JDBC драйвер (например, описанный нами HA-JDBC). Непорядок, сказал себе я вчера, и пошёл исследовать тему взаимодействия приложений на РНР и баз данных через JDBC.

Оказалось, в этой области есть достаточно много интересных разработок, так что исследование обещает быть интереснейшим.

Первым из найденных проектов оказался концептуальное решение PHP-DBC, в основе которого лежит идея написать прокси для связи JDBC и РНР скрипта.  Правда, в нем упор был сделан на закрытость, то есть там обмен между частями производится шифрованными пакетами, которые передаются стандартно через НТТР. Кроме того, как то из описания не очень понятно, это РНР скрипт получает доступ через JDBC или же наоборот, Java приложение может получить доступ к базе, не оставляя ничего в логе, так как все запросы шифруются и передаются по HTTP в удалённый РНР скрипт, который этот запрос выполняет и возвращает назад ответ, который расшифровывает специальный JDBC-прокси-драйвер. В общем, проект очень концептуальный и направленный, скорее, на исследование возможности реализации такого многозвённого взаимодействия. Сам автор именно так его и позиционирует, оговаривая, что такой подход показывает примерно стократное уменьшение производительности по сравнению с прямым доступом к базе. Но вариант интересный.

На просторах ресурса SourceForge.net нашёлся ещё проект  PJBS - который, по описанию, имеет цель создать мост между РНР и JDBC, а это именно то, что я искал. Но проект не подаёт признаков жизни, находясь в первой стадии развития, не имея ни сайта ни хоть бы одного файла, так что это пока что просто не более, чем декларация о намерениях, хотя и это хорошо, так как говорит, что не только мне одному такая идея пришла в голову и что она востребована.

Ещё один концептуальный проект,  WebDatabase, предусматривает разработку своего JDBC драйвера с доступом по протоколу HTTP, что позволяет обойти ограничение СУБД, которые работают только с localhost. В принципе, если вместо HTTP применять, например, сокеты, то это можно все организовать на одном сервере и получить таким образом такой себе прокси для доступа к базе, а коммуникация через сокеты или pipes возможно нивелировала бы уменьшение производительности. Но пока проект ещё не имеет воплощения в коде, это только размышления. Подождём.

Сказать честно, похоже это все доступные варианты. Перейдём к  следующим приемам.

Исходя из данных википедии, оказывается, реализованы кросс-интерфейсы JDBC<>ODBC и  обратные, ODBC <> JDBC, что позволяет из приложения java получить доступ к СУБД, которая не имеет JDBC драйвера, а только OBDC. Теоретически, можно попытаться использовать такой мост, так как РНР поддерживает ODBС. Но пока на практике я не нашёл способа, как же это сделать. Везде есть примеры обратного, как с java при помощи JDBC получить доступ к ODBC интерфейсу. Так что вопрос остаётся открытым.

Далее вспоминаем, что в последнее время Zend, как главный разработчик и коммерческий представитель мира PHP, рассказывала о механизме взаимодействия РНР и Java - Java bridge. То есть, мы можем напрямую взаимодействовать с пакетами и классами Java из приложений на РНР. Да, такой пакет есть в составе последних версий РНР, даже соответствующий раздел в документации.  Исходя из документации, можно будет попробовать напрямую вызвать классы java.sql, так что такой пусть кажется наиболее родным. После начала экспериментов я столкнулся со сложностями настройки и конфигурации, так что сейчас ничего сказать не смогу, но обещаю в следующей статье рассказать, если у меня все получится. Все же тема взаимодействия РНР и Java не самая популярная и раскрытая в других источниках.

Кстати, кроме официального бриджа есть и другие проекты, преследующие ту же цель. Например,  PHP/Java Bridge, который предназначен для обеспечения двухсторонней коммуникации с J2EE приложениями (а также .NET бек-ендами). Проект, в отличие от остальных, достаточно проработанный, имеется много документации и описаний, реализован как в виде чистого РНР-скрипта, так и как подключаемый модуль на С. Он использует XML протокол для связи с JVM и, по заверениям разработчиков, в 50 раз быстрее работы через RPC или SOAP-протокол. Хотя судя по последним новостям, проект давно не обновлялся, но вроде все нужные возможности реализованы, так что этот пакет следующий в очереди на тестирование.

Похоже, наше исследование на этот момент завершено,  намечено два проекта для более детального исследования, также мы узнали, что и другие разработчики задумываются над такой проблемой и начинают какие-то проекты, решающие эти проблемы. К сожалению дальше деклараций о намерениях или концептуальных примеров дело ни у кого пока не пошло, так что по сути, вопрос все же открытый. Ну а мы будем тестировать взаимодействие РНР и Java. До свидания!

  • А зачем эти вещи вообще скрещивать-то?

  • Специально для вас процитирую первый же абзац статьи выше:
    «Но открыт вопрос «зачем?». Если вы постоянный читатель нашего блога, вы могли заметить несколько статей о различных JDBC драйверах, позволяющих организовать пулы коннектов, кластеризацию и отказоустойчивость соединения с базой данных, таким образом организовать высокопроизводительный интерфейс для доступа к СУБД, причём, не привязываясь к определённым особенностям базы данных. Но вот для РНР такого, к сожалению нет, из встроенных интерфейсов доступа есть только mysqli и PDO, теперь ещё появился вариант mysqlnd (это то, что касается СУБД MySQL). Таким образом, для построения отказоустойчивой архитектуры на базе РНР и MySQL необходимо применять сторонние решение — систему кластеризации MySQL, MySQL Proxy или ещё что-то. Но ведь наши друзья-разработчики из мира Java могут иметь это все (в первую очередь, пул коннектов и кластеризацию) прямо «out of the box», применяя просто нужный JDBC драйвер (например, описанный нами HA-JDBC). Непорядок, сказал себе я вчера, и пошёл исследовать тему взаимодействия приложений на РНР и баз данных через JDBC.»

  • Возможно, но зачем такое делать не пойму? 🙄

  • для тех, кто в танке, ответ был неоднократно выше.

  • Я не в танке, я в бронепоезде 😆 Если нетрудно обьясните для начинающих 😳

  • Cardinal

    для начинающих надо бы для начала просто пхп изучить 🙂

Developers.org.ua