Я пытаюсь узнать о Protobuf в PHP с помощью https://github.com/google/protobuf/tree/master/php . В настоящее время я застрял в ошибке.
Мои шаги по установке protobuf:
Установите protobuf через pecl с помощью команды:
sudo pecl install protobuf-3.2.0a1
Установите composer.json как показано ниже, затем запустите sudo composer install
{
"require": {
"google/protobuf": "^3.2"}
}
Ниже мой код:
Прото файл:
syntax = "proto3";
message APIReq {
string functionName = 1;
string name = 2;
int32 time = 3;
string type = 4;
}
Команда для генерации PHP класса из .proto файла:
protoc --php_out=/var/www/html/ MsgFormat.proto
Команда protoc привела к двум файлам, APIReq.php и GPBMetadata / MsgFormat.php
После этого я добавил require_once __DIR__ . '/vendor/autoload.php';
а также require_once __DIR__ . '/GPBMetadata/MsgFormat.php';
в сгенерированном файле PHP, потому что, когда я побежал php APIReq.php
это придумал
PHP Fatal error: Class 'Google\Protobuf\Internal\Message' not found in /var/www/html/testing/APIReq.php on line 13
После того, как я добавил эти строки, ошибка исчезла, поэтому я предполагаю, что обе строки решили проблему
мой файл PHP (следующий пример из https://developers.google.com/protocol-buffers/docs/reference/php-generated, раздел Сообщения):
<?php
require __DIR__ . '/vendor/autoload.php';
include_once('APIReq.php');
$param = new APIReq();
$param2 = new APIReq();
$param->setFunctionname('functionname');
$param->setName('name');
$param->setTime(123456);
$param->setType('type');
$dt = $param->encode();
$param2->decode($dt);
?>
Когда я запускаю код PHP, он возвращает сообщение об ошибке:
PHP Fatal error: Call to undefined method APIReq::encode()
Как я могу это исправить?
Изменить: Попробовал это также с protobuf 3.3.0, с тем же результатом.
шифровать & Декодирование не существует в кодовой базе, как я проследил.
Это изменение было введено в 3.3.0
//to encode message
$data = $param->serializeToString();
//to decode message
$param2 = new APIReq();
$param2->mergeFromString($data);
Других решений пока нет …