鍍金池/ 問答/人工智能  PHP  網(wǎng)絡(luò)安全/ PHP 使用 grpc 的問題

PHP 使用 grpc 的問題

最近在學(xué)習(xí) grpc 發(fā)現(xiàn) V2ray的 API 是使用 grpc 寫的,于是上手試試。遇到以下問題

  1. 消息發(fā)送后接收到回復(fù)處理時,php 拋出 fatalerror
<?php
require_once __DIR__ . '/vendor/autoload.php';
try {
    $client = new V2ray\Core\App\Stats\Command\StatsServiceClient('1.1.1.1:8080', [
        'credentials' => Grpc\ChannelCredentials::createInsecure(),
    ]);
    $request = new V2ray\Core\App\Stats\Command\GetStatsRequest();
    $request->setName('user>>>10000@aaa.net>>>traffic>>>downlink');
    $obj = $client->GetStats($request);
   $obj2 =  $obj->wait();
    var_dump($obj2);
}catch (Throwable $e){
  echo   $e->getMessage();
  var_dump($e->getTrace());
}
?>
output
string(46) "\V2ray\Core\App\Stats\Command\GetStatsResponse"
bool(true)
PHP Fatal error:  Cannot access private properties. in /Users/v2ray/vendor/grpc/grpc/src/lib/AbstractCall.php on line 147

Fatal error: Cannot access private properties. in /Users/v2ray/vendor/grpc/grpc/src/lib/AbstractCall.php on line 147
  1. 端點(diǎn)調(diào)試 找到問題所在文件 /Users/v2ray/vendor/grpc/grpc/src/lib/AbstractCall.php 出錯位置 為 第134行附近的_deserializeResponse()方法
protected function _deserializeResponse($value)
    {
        if ($value === null) {
            return;
        }
//        var_dump('fsdfasdfsdfsdf');
//        var_dump($this->deserialize);
        // Proto3 implementation
        if (is_array($this->deserialize)) {
            list($className, $deserializeFunc) = $this->deserialize;
            var_dump($className);
            var_dump(class_exists($className));
            $obj = new $className();
            var_dump($obj); //這里開始拋出錯誤
            var_dump('方法存不存在!');
            var_dump(get_class_methods($obj, $deserializeFunc));
//            exit;
//            sleep(2);
            if (method_exists($obj, $deserializeFunc)) {
                $obj->$deserializeFunc($value);
            } else {
                $obj->mergeFromString($value);
            }

            return $obj;
        }

        // Protobuf-PHP implementation
        return call_user_func($this->deserialize, $value);
    }
output:
string(46) "\V2ray\Core\App\Stats\Command\GetStatsResponse"
bool(true)
PHP Fatal error:  Cannot access private properties. in /Users/hainuo/Downloads/Shadowsocks/vendor/grpc/grpc/src/lib/AbstractCall.php on line 147

Fatal error: Cannot access private properties. in /Users/hainuo/Downloads/Shadowsocks/vendor/grpc/grpc/src/lib/AbstractCall.php on line 147
    

發(fā)現(xiàn)由protoc生成的類 一旦進(jìn)行 new操作后,調(diào)用時就出錯。

/**
 * Generated from protobuf message <code>v2ray.core.app.stats.command.GetStatsResponse</code>
 */
class GetStatsResponse extends \Google\Protobuf\Internal\Message

通過這里可以看到這里繼承的是 protobuf 的 message 類。
實(shí)在找不到錯誤了,還請大家?guī)兔Τ鎏幰庖?如何進(jìn)行調(diào)試怎么解決這個問題

環(huán)境如下

Installed packages, channel pecl.php.net:
=========================================
Package  Version State
grpc     1.12.0  stable
protobuf 3.6.0   stable
swoole   2.1.3   stable
回答
編輯回答
柒槿年

已經(jīng)解決 原因時這個類包含的內(nèi)容都是私有的,所以直接調(diào)用就會報錯

2018年2月2日 08:34