Асинхронный Php extension для работы с бд Cassandra без Thrift

Приветствую, хабрасообщество!
Думаю многие кто работал с базой Cassandra из php знают, что все существующие драйвера используют в себе Thrift интерфейс, который объявлен как deprecated ещё в версии 0.8.
Вместо него разработчики рекомендуют использовать новый интерфейс доступа к базе CQL (Cassandra Query Language), но драйвера под php для нового протокола уже очень длительное время нет. В официальном репозитории Datastax существуют драйвера для C++, Java, C# и Python. Как известно сам Php написан на Си, а значит, закатав рукава мы можем подружить официальный асинхронный драйвер C++ с Php. Кому интересно что из этого получилось — прошу под кат.

Как подружить плюсовый код с Php достаточно подробно описано на девзоне зенда. Вероятно многим эта ссылка уже попадалась, если вы хоть как-то интересовались разработкой расширений под Php. Следует обратить внимание на макрос PHP_REQUIRE_CXX() в config.m4, а также на необходимость ручного добавления библиотеки stdc++, если, конечно, вы её использовали при разработке своего модуля.

Сборка C++ библиотеки Datastax'а достаточно тривиальна и все что вам необходимо это скачать официальный драйвер

git clone https://github.com/datastax/cpp-driver.git

Установить Boost, Openssl и Cmake для сборки, если они у вас ещё не установлены и скомпилировать драйвер

cd cpp-driver
cmake . && make && make install

Хинт: make install необязательно делать, т. к. все что нам необходимо это библиотека libcql.so.0.7.0 на которую можно сделать симлинк

ln -s libcql.so.0.7.0 /usr/lib/libcql.so.0
ln -s /usr/lib/libcql.so.0 /usr/lib/libcql.so

После установки официального драйвера мы можем использовать наш wrapper:

git clone https://github.com/aparkhomenko/php-cassandra.git
cd php-cassandra
phpize && ./configure && make

Если не возникло ошибок в папке modules можно будет увидеть extension для Php cassandra.so
Можем проверить, что он у нас работает корректно:

php -d="extension=modules/cassandra.so" -m

В списке модулей должна быть надпись cassandra. Если все получилось — поздравляю; если нет — прошу в комментарии :)

Интерфейс модуля повторяет интерфейс оригинального драйвера и содержит в себе классы: CqlBuilder, CqlCluster, CqlError, CqlFutureResult, CqlQuery, CqlSession, CqlResult.

Пример взаимодействия модуля:

// Suppose you have the Cassandra cluster at 127.0.0.1, 
// listening at default port (9042).
$builder  = new CqlBuilder();
$builder->addContactPoint("127.0.0.1");

// Now build a model of cluster and connect it to DB.
$cluster  = $builder->build();
$session  = $cluster->connect();

// Write a query, switch keyspaces.
$query    = new CqlQuery('SELECT * FROM system.schema_keyspaces');

// Send the query.
$future   = $session->query($query);

// Wait for the query to execute; retrieve the result.
$future->wait();
$result   = $future->getResult();

if (null === $future->getError()) {

    echo "rowCount: {$result->getRowCount()}\n";

    while ($result->next()) {
        echo "strategy_options: " . $result->get("strategy_options") . "\n";
    }

}

// Boilerplate: close the connection session and perform the cleanup.
$session->close();
$cluster->shutdown();
Поделиться публикацией
Похожие публикации
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 12
  • 0
    Я как раз сегодня этот прикрутил.
    github.com/Orange-OpenSource/YACassandraPDO

    завёлся и даже работает, но поля типа date не правильно отображает.

    сейчас ваш модуль попробую
    • 0
      У меня собралось только с

      #ifdef array_init
      #undef array_init
      #endif

      перед #include <boost/asio.hpp>
      • 0
        Ваша версия php и boost'а?
        Тесты проводились на версии PHP 5.4.4-14+deb7u9 и boost 1.49
        • 0
          php 5.4.20
          boost 1.53

          заработало. текст показывает нормально

          Вместо uuid показывает кракозяблы
          конструкция dateOf(time) as htime похоже не работает, $result->get(«htime») не показывает ни чего

          PS
          Сам я не програмист и залесть в недра cpp мне сложновато
          • 0
            Добавил патч для выбора типа колонки

            $date = $result->get("dateOf(time)", $result::TYPE_BIG_INT);
            echo date('Y-m-d H:i:s', $date/1000);
            
            • 0
              Да. Так заработало. А как можно uuid вывести? Я так понимаю его надо в string преобразовать.
              • 0
                $uuid = $result->get("uuid_column", $result::TYPE_UUID);
                echo $uuid;
                
                • 0
                  спасибо
                  • 0
                    Добавил автоопределение типов столбца. Для примеров выше теперь достаточно одного аргумента функции:

                    echo $result->get("timeuuid_column");
                    echo $result->get("uuid_column");
                    echo $result->get("string_column");
                    
      • 0
        Автор, вы про PHP-CPP слышали? Попробуйте на нем переписать.
        Расширения написаные Зендовскими макросами категорически невозможно читать. Особенно, когда код без комментариев.
        К тому же писать расширение на PHP-CPP для обертки C++ библиотек — тривиальная задача.
        • 0
          Спасибо за ваш отзыв. Да, слышал / читал. Комментарии в коде появятся, обязательно :)
          Выбор в пользу зендовский макросов был сделан исключительно потому что с ними уже был знаком раннее. В ядре php достаточно много расширений где можно что-то подсмотреть, а вот используется ли в продакшене PHP-CPP, к сожалению не владею информацией.
          • 0
            Последняя версия (1.1) действительно стабильна, в отличии от 1.0 и ей можно пользоваться в продакшене. Насколько мне известно, в прродакшене ее используют в компании автора библиотеки.
            В любом случае после компиляции нужно запускать тесты. Я сам, к сожалению, так и не установил ее у себя на серверах из-за старого дебиана (старый gcc без c++11) — все руки никак не дойдут обновить. Как только обновлю буду использовать без сомнений.

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