Join 4,000+ others and never miss out on new tips, tutorials, and more.
Latest version:
pecl install openswoole-22.1.2 | composer require openswoole/core:22.1.5
GRPC is a high performance, open source universal RPC framework. Open Swoole GRPC for PHP is a high performance integration solution for building cloud-native multiple language microservices architecture.
GRPC Server is the server side of OpenSwoole GRPC for PHP.
GRPC Client can be used to connect with GRPC services provided by either OpenSwoole GRPC servers or GRPC services implemented with other frameworks and programming languages.
GRPC Compiler can be used to generate PHP stub codes for your protocols.
You have to install OpenSwoole GRPC library with
composer require openswoole\grpc
to use this feature.
When implementing a GRPC service runing in PHP GRPC server, you get started with .proto
file with the defination of the service.
syntax = "proto3";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
service Stream {
rpc FetchResponse (HelloRequest) returns (stream HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
Then you can generate PHP stub codes from the .proto
and OpenSwoole GRPC Compiler.
Then implement the logic of the service in the generated PHP service files like the following Helloworld GreeterService example:
# src/Helloworld/GreeterService.php
namespace Helloworld;
use OpenSwoole\GRPC;
class GreeterService implements GreeterInterface
{
/**
* @throws GRPC\Exception\InvokeException
*/
public function SayHello(GRPC\ContextInterface $ctx, HelloRequest $request): HelloReply
{
$name = $request->getName();
$out = new HelloReply();
$out->setMessage('hello ' . $name);
return $out;
}
}
<?php
use Helloworld\GreeterService;
use Helloworld\StreamService;
use OpenSwoole\GRPC\Middleware\LoggingMiddleware;
use OpenSwoole\GRPC\Middleware\TraceMiddleware;
use OpenSwoole\GRPC\Server;
// enable hooks on IO clients
co::set(['hook_flags' => OpenSwoole\Runtime::HOOK_ALL]);
$server = (new Server('127.0.0.1', 9501))
->register(GreeterService::class)
->register(StreamService::class)
->withWorkerContext('worker_start_time', function () {
return time();
})
// use middlewares
->addMiddleware(new LoggingMiddleware())
->addMiddleware(new TraceMiddleware())
->set([
'log_level' => \OpenSwoole\Constant::LOG_INFO,
])
->start();
<?php
declare(strict_types=1);
use Helloworld\HelloRequest;
use OpenSwoole\Constant;
use OpenSwoole\GRPC\Client;
co::set(['log_level' => Constant::LOG_ERROR]);
co::run(function () {
$conn = (new Client('127.0.0.1', 9501))->connect();
$client = new Helloworld\GreeterClient($conn);
$message = new HelloRequest();
$message->setName(str_repeat('x', 10));
$out = $client->sayHello($message);
var_dump($out->serializeToJsonString());
$conn->close();
echo "closed\n";
});