当前位置: 首页 > 后端技术 > PHP

think-swooleextension实现在传统php-fpm环境下调用rpc服务

时间:2023-03-29 19:13:17 PHP

官方项目地址https://github.com/top-think/think-swooletpthink-swooleextension官方提供了一个rpc服务和客户端,但是他的rpcclient只能在swoole环境下运行,但是swoole官方提供了同步client/swoole/client。如果框架的客户端换成官方的同步客户端,应该可以在传统的fpm环境下调用swoole环境下的rpc。app->getBasePath().'rpc.php')){$this->rpcServices=(array)include$rpc;}}}/***执行服务**@returnmixed*/publicfunctionboot(){if(!empty($clients=config('swoole.rpc.client'))&&$this->rpcServices){try{foreach($this->rpcServicesas$name=>$abstracts){$parserClass=config("swoole.rpc.client.{$name}.parser",JsonParser::class);$parser=$this->app->制作($parserClass);$gateway=newGateway($this->createRpcConnector($name),$parser);foreach($abstractsas$abstract){$this->app->bind($abstract,function()use($gateway,$name,$abstract){返回$this->app->invokeClass(Proxy::getClassName($name,$abstract),[$gateway]);});}}}catch(Exception|Throwable$e){}}}protectedfunctioncreateRpcConnector($name){returnnewclass($name)implementsConnector{公共$name;公共函数__construct($name){$this->name=$name;}publicfunctionsendAndRecv($data){if(!$datainstanceofGenerator){$data=[$data];}$config=config('swoole.rpc.client.'.$this->name);$client=newClient(SWOOLE_SOCK_TCP);$host=Arr::pull($config,'host');$port=Arr::pull($config,'port');$timeout=Arr::pull($config,'timeout',5);$client->set(['open_length_check'=>true,'package_length_type'=>Packer::HEADER_PACK,'package_length_offset'=>0,'package_body_offset'=>8,]);$client->connect($host,$port,$timeout);try{foreach($dataas$string){if(!$client->send($string)){$this->onError($client);}}$response=$client->recv();如果($response===false||空($response)){$this->onError($client);}返回$响应;}最后{$client->close();}}受保护函数onError(Client$client){$client->close();抛出新的RpcClientException(swoole_strerror($client->errCode),$client->errCode);}};}}通过在thinkphp框架中注册上述服务,在fpm环境中调用think-swoole的rpc原理是检测当前环境是否在fpm环境中。如果是,请手动注册rpc服务。扩展是在代码中使用phpthinkswoolestart命令启动rpc接口。注册该服务后,可以在fpm环境下使用,不影响其他功能。区别:1官方扩展使用的是连接池,这里去掉了。2官方扩展使用协程客户端,这里使用同步客户端用法:与官方一致