amphp / rpc
基于Amp的PHP远程过程调用
v2.0.0
2024-03-19 19:37 UTC
Requires
- php: >=8.1
- amphp/amp: ^3
- amphp/byte-stream: ^2
- amphp/http-client: ^5
- amphp/http-server: ^3
- amphp/serialization: ^1
- amphp/sync: ^2
- friendsofphp/proxy-manager-lts: ^1.0.17
Requires (Dev)
- amphp/log: ^2
- amphp/php-cs-fixer-config: ^2
- amphp/phpunit-util: ^3
- phpunit/phpunit: ^9.6
This package is auto-updated.
Last update: 2024-09-19 20:53:51 UTC
README
此包允许创建基于接口的代理对象,以在远程服务中调用对象的方法。
身份验证不是内置的,但可以使用中间件/拦截器实现。
安装
composer require amphp/rpc
使用
服务器
<?php declare(strict_types=1); require __DIR__ . '/vendor/autoload.php'; use Amp\Http\Server\DefaultErrorHandler; use Amp\Http\Server\SocketHttpServer; use Amp\Log\ConsoleFormatter; use Amp\Log\StreamHandler; use Amp\Rpc\Server\RpcRequestHandler; use Amp\Serialization\NativeSerializer; use Amp\Socket; use Monolog\Logger; use function Amp\async; use function Amp\ByteStream\getStdout; use function Amp\Future\await; use function Amp\Rpc\Examples\createRegistry; use function Amp\trapSignal; $logHandler = new StreamHandler(getStdout()); $logHandler->setFormatter(new ConsoleFormatter); $logger = new Logger('server'); $logger->pushHandler($logHandler); $registry = new RpcRegistry(); $registry->register(TimeService::class, new class($id) implements TimeService { public function getCurrentTime(): float { return now(); } }); $serializer = new NativeSerializer; $server = SocketHttpServer::createForDirectAccess($logger); $server->expose('0.0.0.0:1337'); $server->expose('[::]:1337'); $server->start(new RpcRequestHandler($serializer, $registry), new DefaultErrorHandler()); // Stop the server when SIGINT is received (this is technically optional, but it is best to call Server::stop()). trapSignal(\SIGINT); $server->stop();
客户端
<?php declare(strict_types=1); require __DIR__ . '/../vendor/autoload.php'; use Amp\Log\ConsoleFormatter; use Amp\Log\StreamHandler; use Amp\Rpc\Client\RpcClient; use Amp\Rpc\Examples\Basic\TimeService; use Amp\Rpc\Interceptor\RoundRobinBalancer; use Amp\Serialization\NativeSerializer; use Monolog\Logger; use ProxyManager\Factory\RemoteObjectFactory; use function Amp\ByteStream\getStdout; $logHandler = new StreamHandler(getStdout()); $logHandler->setFormatter(new ConsoleFormatter); $logger = new Logger('client'); $logger->pushHandler($logHandler); $serializer = new NativeSerializer; $proxyFactory = new RemoteObjectFactory(new RoundRobinBalancer([ new RpcClient('http://localhost:1337/', $serializer), ])); /** @var TimeService $timeService */ $timeService = $proxyFactory->createProxy(TimeService::class); // This is a remote call via HTTP var_dump($timeService->getCurrentTime());
安全
如果您发现任何与安全相关的问题,请通过电子邮件contact@amphp.org
联系,而不是使用问题跟踪器。
许可证
MIT许可证(MIT)。有关更多信息,请参阅LICENSE。