PHP 使用 grpc 的问题

发布于 2022-09-07 16:27:43 字数 3099 浏览 17 评论 0

最近在学习 grpc 发现 V2ray的 API 是使用 grpc 写的,于是上手试试。遇到以下问题

  1. 消息发送后接收到回复处理时,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. 端点调试 找到问题所在文件 /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
    

发现由protoc生成的类 一旦进行 new操作后,调用时就出错。

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

通过这里可以看到这里继承的是 protobuf 的 message 类。
实在找不到错误了,还请大家帮忙出处意见 如何进行调试怎么解决这个问题

环境如下

Installed packages, channel pecl.php.net:
=========================================
Package  Version State
grpc     1.12.0  stable
protobuf 3.6.0   stable
swoole   2.1.3   stable

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

柠檬 2022-09-14 16:27:43

已经解决 原因时这个类包含的内容都是私有的,所以直接调用就会报错

蒗幽 2022-09-14 16:27:43

请问一下,关于v2ray的php grpc您研究的如何了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文