V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
MyEevy
V2EX  ›  程序员

请教一个 Hprose- PHP 问题

  •  
  •   MyEevy · 2022-06-28 10:49:41 +08:00 · 1107 次点击
    这是一个创建于 913 天前的主题,其中的信息可能已经有所发展或是发生改变。

    服务端 rpc 启动后,如果保持过长时间,客户端请求会读到一个历史的值,如何实时读取到最新值

    • 例如,4 天前用户余额为 A 值,今日被更新为 B ,rpc 客户端请求还是读取的 A ,实际不走 rpc 查询为 B
    • 服务端
    $server = new Server("tcp://0.0.0.0:1111");
    $server->addMethod('test', $this);
    $server->start();
    
    • 客户端
    $user = TcpClient::create('tcp://0.0.0.0:1111/', false);
    $response = $user->test($this->token, ['code' => 'CNY']);
    
    第 1 条附言  ·  2022-06-28 16:15:13 +08:00
    public function handle()
    {
        $server = new Server("tcp://0.0.0.0:1111");
        $server->addMethod('test', $this);
        $server->start();
    }
    
    public function test($token, $param)
    {
        return (new RpcUserService())->test($token, $param);
    }
    
    public function test($token, array $param)
    {
        if (!JWTAuth::setToken($token)->check()) {
            return ['code' => 401, 'msg' => __('messages.登录过期'), 'data' => []];
        }
    
        if (!isset($param['currency_code'])) {
            return ['code' => 402, 'msg' => __('messages.参数错误'), 'data' => []];
        }
    
        $user       =   JWTAuth::setToken($token)->authenticate();
    
        $user       =   (new UserBalance())
                        ->where(['id' => $user->id])
                        ->where(['code' => $param['code']])
                        ->select('balance')
                        ->first();
        return ['code' => 200, 'msg' => __('messages.成功'), 'data' => $user];
    }
    
    reneiw
        1
    reneiw  
       2022-06-28 11:56:53 +08:00
    你是不是用了单例?直接返回静态变量
    MyEevy
        2
    MyEevy  
    OP
       2022-06-28 13:39:58 +08:00
    @reneiw 不是,工厂模式,奇怪的是,服务端重启后,可以正常。问题总是出现在一段时间后。文档中并没有说存在自动缓存策略
    reneiw
        3
    reneiw  
       2022-06-28 13:51:34 +08:00
    你的 test 方法能不能贴下
    MyEevy
        4
    MyEevy  
    OP
       2022-06-28 16:17:25 +08:00
    @reneiw 服务端方法已贴,麻烦看下,是不是存在服务端设置返回值的问题
    reneiw
        5
    reneiw  
       2022-06-28 17:03:37 +08:00
    ```
    $user = (new UserBalance())
    ->where(['id' => $user->id])
    ->where(['code' => $param['code']])
    ->select('balance')
    ->first();
    ```

    不知道你这个有没有缓存
    MyEevy
        6
    MyEevy  
    OP
       2022-06-28 17:13:18 +08:00
    @reneiw db 这块没做缓存,我尝试过直接 http 请求这个 service ,可以正常读取到最新值。rpc 重启前后读取值不一样。会与这些设置有关系吗,或者 linux 启动方式
    Hprose\ResultMode::Normal
    Hprose\ResultMode::Serialized
    Hprose\ResultMode::Raw
    Hprose\ResultMode::RawWithEndTag
    reneiw
        7
    reneiw  
       2022-06-28 17:19:25 +08:00
    另谋高就吧,我承认我不行了
    MyEevy
        8
    MyEevy  
    OP
       2022-06-28 17:21:43 +08:00
    @reneiw 没事。麻烦了,现在的作法就是定时重启,只是很奇怪产生问题的原因,加载到内存也不是数据到内存,可能需要加个日志查看监控下了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5429 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 150ms · UTC 08:00 · PVG 16:00 · LAX 00:00 · JFK 03:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.