amphp/rpc

基于Amp的PHP远程过程调用

维护者

详细信息

github.com/amphp/rpc

源代码

问题

资助包维护!
amphp

v2.0.0 2024-03-19 19:37 UTC

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