Рубрики
Uncategorized

Использование protobuffer в PHP

Автор оригинала: David Wong.

Введение в Protobuf

Protobuf (буферы протоколов)-это кроссплатформенный, многоязычный, масштабируемый протокол передачи и хранения данных, созданный компанией Google. Это один из эффективных методов кодирования при сжатии данных.

Буферы протоколов являются гибкими и эффективными при сериализации данных. Буферы протоколов меньше, быстрее и проще, чем XML. Как только структура данных обрабатываемых данных определена, инструмент генерации кода буферов протоколов может быть использован для генерации соответствующего кода. Вы даже можете обновить структуру данных без повторного развертывания программы. Вы можете легко читать и записывать структурированные данные на разных языках или из разных потоков данных, используя Protobuf для однократного описания структуры данных.

Буферы протоколов очень подходят для хранения данных или формата обмена данными RPC. Он может использоваться для независимых от языка, независимых от платформы и расширяемых сериализованных структурированных форматов данных в протоколах связи, хранения данных и других областях.

Кроме того, Protobuf широко используется в микросервисах из-за его эффективной эффективности обмена данными в интрасети, которая является основой платформы Google с открытым исходным кодом g rpc .

Установка Php-protobuf

Поскольку protobuf изначально не поддерживает PHP, PHP необходимо устанавливать расширения, если он использует pb.

pecl install protobuf

Экологические потребности протокол Компилятор, загрузка и установка:

$ wget https://github.com/google/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz
$ tar zxvf protobuf-2.5.0.tar.gz
$ cd protobuf-2.5.0
$ ./configure --prefix=/usr/local/protobuf
$ sudo make 
$ sudo  make install

Проверьте успешную установку:

$ /usr/local/protobuf/bin/protoc  --version
libprotoc 2.5.0

Успешная установка php -protobuf

php --ri protobuf

Установка зависимостей lumen и google/protobuf

lumen new rpc

новый rpc lumen Команда соответствует composer create-project laravel /lumen rpc

composer require google/protobuf

оставайтесь composer.json Добавьте карту классов ниже:

{
    "classmap": [
        "protobuf/"
    ]
}

Хорошо, все приготовления были сделаны.

Сделайте свою собственную демо-версию

Создайте папку protobuf в каталоге кода mkdir protobuf

Введите каталог и создайте файл запрос на поиск.протокол

syntax = "proto3";
message SearchRequest {
    string query = 1;
    int32 page_number = 2;
    int32 result_per_page = 3;
    enum Corpus {
        UNIVERSAL = 0;
        WEB = 1;
        IMAGES = 2;
        LOCAL = 3;
        NEWS = 4;
        PRODUCTS = 5;
        VIDEO = 6;
    }
    Corpus corpus = 4;
}

(vii) Это важно здесь (vii)

оставайтесь composer.json Добавьте карту классов ниже, иначе вы не сможете обнаружить соответствующий класс

{
   "classmap": [
       "protobuf/"
   ]
}

Запустите в командной строке: protoc//protobuf/поисковый запрос.дамп proto && composer-автоматическая загрузка

Каталог кода, который вы видите сейчас, должен выглядеть следующим образом:

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

Воспользуйся

Создайте маршрут в web.php

$router->get('testp', '[email protected]');

остаться Пример контроллера Добавить:

    public function testProtobuf()
    {
        // require_once base_path('protobuf/SearchRequest.php');
        $request = new \SearchRequest();
        $request->setPageNumber(67);
        dd($request->getPageNumber());
    }

Если печатается нормально 67 Это число означает, что класс может быть использован. Поздравляем вас с успешным завершением создания класса запросов.

Идите глубже

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

array:16 [▼
  0 => "__construct"
  1 => "getQuery"
  2 => "setQuery"
  3 => "getPageNumber"
  4 => "setPageNumber"
  5 => "getResultPerPage"
  6 => "setResultPerPage"
  7 => "getCorpus"
  8 => "setCorpus"
  9 => "clear"
  10 => "discardUnknownFields"
  11 => "serializeToString"
  12 => "mergeFromString"
  13 => "serializeToJsonString"
  14 => "mergeFromJsonString"
  15 => "mergeFrom"
]

Метод с префиксом set состоит в том, чтобы задать соответствующие поля и получить значения из буферов. СериализеТоСтринг в нем рекомендуется читать официальные документы с разумными объяснениями.

Комбинация с grpc

композитор устанавливает grpc/grpc

Определите службу, которая должна выполняться как на стороне клиента, так и на стороне сервера

service RouteGuide {
   rpc GetFeature(Point) returns (Feature) {}
   rpc RecordRoute(stream Point) returns (RouteSummary) {}
   rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
}

message Point {
  int32 latitude = 1;
  int32 longitude = 2;
}

протокол Создайте соответствующий экземпляр службы.

Создайте клиента

$client = new Routeguide\RouteGuideClient('localhost:50051', [
    'credentials' => Grpc\ChannelCredentials::createInsecure(),
]);

Вызов службы RPC

$point = new Routeguide\Point();
$point->setLatitude(409146138);
$point->setLongitude(-746188906);
list($feature, $status) = $client->GetFeature($point)->wait();

Для получения дополнительной информации о внедрении grpc см. Официальную документацию, Краткие руководства