You've already forked Php-Template
feat: add gRPC server configuration and initial implementation with example proto
This commit is contained in:
7
.rr.yaml
7
.rr.yaml
@@ -6,6 +6,13 @@ server:
|
||||
rpc:
|
||||
listen: tcp://127.0.0.1:6001
|
||||
|
||||
grpc:
|
||||
listen: "tcp://0.0.0.0:9001"
|
||||
pool:
|
||||
command: "php grpc-worker.php"
|
||||
proto:
|
||||
- "proto/helloworld.proto"
|
||||
|
||||
http:
|
||||
pool:
|
||||
allocate_timeout: 5s
|
||||
|
||||
@@ -42,6 +42,7 @@ COPY --from=library /app/vendor /app/vendor
|
||||
|
||||
# Copy the RoadRunner configuration file and source
|
||||
ADD src src/
|
||||
ADD generated generated/
|
||||
ADD server.php .
|
||||
ADD .rr.yaml .
|
||||
ADD config.php .
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Siteworxpro\\App\\": "src/",
|
||||
"Siteworxpro\\Tests\\": "tests/"
|
||||
"Siteworxpro\\Tests\\": "tests/",
|
||||
"GRPC\\": "generated/GRPC"
|
||||
}
|
||||
},
|
||||
"require": {
|
||||
@@ -25,7 +26,8 @@
|
||||
"react/promise": "^3",
|
||||
"react/async": "^4",
|
||||
"guzzlehttp/guzzle": "^7.10",
|
||||
"zircote/swagger-php": "^5.7"
|
||||
"zircote/swagger-php": "^5.7",
|
||||
"spiral/roadrunner-grpc": "^3.5"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^12.4",
|
||||
|
||||
142
composer.lock
generated
142
composer.lock
generated
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "f12aaf0dae6930c226e719a5705e3f91",
|
||||
"content-hash": "977f74570c671e4d59fd70d5e732c3d2",
|
||||
"packages": [
|
||||
{
|
||||
"name": "adhocore/cli",
|
||||
@@ -298,6 +298,65 @@
|
||||
],
|
||||
"time": "2025-08-10T19:31:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "google/common-protos",
|
||||
"version": "4.12.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/googleapis/common-protos-php.git",
|
||||
"reference": "0127156899af0df2681bd42024c60bd5360d64e3"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/googleapis/common-protos-php/zipball/0127156899af0df2681bd42024c60bd5360d64e3",
|
||||
"reference": "0127156899af0df2681bd42024c60bd5360d64e3",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"google/protobuf": "^4.31",
|
||||
"php": "^8.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.6"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"component": {
|
||||
"id": "common-protos",
|
||||
"path": "CommonProtos",
|
||||
"entry": "README.md",
|
||||
"target": "googleapis/common-protos-php.git"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Google\\Api\\": "src/Api",
|
||||
"Google\\Iam\\": "src/Iam",
|
||||
"Google\\Rpc\\": "src/Rpc",
|
||||
"Google\\Type\\": "src/Type",
|
||||
"Google\\Cloud\\": "src/Cloud",
|
||||
"GPBMetadata\\Google\\Api\\": "metadata/Api",
|
||||
"GPBMetadata\\Google\\Iam\\": "metadata/Iam",
|
||||
"GPBMetadata\\Google\\Rpc\\": "metadata/Rpc",
|
||||
"GPBMetadata\\Google\\Type\\": "metadata/Type",
|
||||
"GPBMetadata\\Google\\Cloud\\": "metadata/Cloud",
|
||||
"GPBMetadata\\Google\\Logging\\": "metadata/Logging"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"Apache-2.0"
|
||||
],
|
||||
"description": "Google API Common Protos for PHP",
|
||||
"homepage": "https://github.com/googleapis/common-protos-php",
|
||||
"keywords": [
|
||||
"google"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/googleapis/common-protos-php/tree/v4.12.4"
|
||||
},
|
||||
"time": "2025-09-20T01:29:44+00:00"
|
||||
},
|
||||
{
|
||||
"name": "google/protobuf",
|
||||
"version": "v4.33.1",
|
||||
@@ -2943,6 +3002,87 @@
|
||||
],
|
||||
"time": "2025-11-13T17:24:29+00:00"
|
||||
},
|
||||
{
|
||||
"name": "spiral/roadrunner-grpc",
|
||||
"version": "v3.5.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/roadrunner-php/grpc.git",
|
||||
"reference": "916c061de160d6b2f3efc82dcffac0360d84fab8"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/roadrunner-php/grpc/zipball/916c061de160d6b2f3efc82dcffac0360d84fab8",
|
||||
"reference": "916c061de160d6b2f3efc82dcffac0360d84fab8",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-json": "*",
|
||||
"google/common-protos": "^3.1|^4.0",
|
||||
"google/protobuf": "^3.7 || ^4.0",
|
||||
"php": ">=8.1",
|
||||
"spiral/goridge": "^4.0",
|
||||
"spiral/roadrunner": "^2024.3 || ^2025.1",
|
||||
"spiral/roadrunner-worker": "^3.0",
|
||||
"symfony/polyfill-php83": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"jetbrains/phpstorm-attributes": "^1.0",
|
||||
"mockery/mockery": "^1.4",
|
||||
"phpunit/phpunit": "^10.0",
|
||||
"spiral/code-style": "^2.2",
|
||||
"spiral/dumper": "^3.3",
|
||||
"vimeo/psalm": ">=5.8"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Spiral\\RoadRunner\\GRPC\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Anton Titov (wolfy-j)",
|
||||
"email": "wolfy-j@spiralscout.com"
|
||||
},
|
||||
{
|
||||
"name": "Pavel Buchnev (butschster)",
|
||||
"email": "pavel.buchnev@spiralscout.com"
|
||||
},
|
||||
{
|
||||
"name": "Aleksei Gagarin (roxblnfk)",
|
||||
"email": "alexey.gagarin@spiralscout.com"
|
||||
},
|
||||
{
|
||||
"name": "Maksim Smakouz (msmakouz)",
|
||||
"email": "maksim.smakouz@spiralscout.com"
|
||||
},
|
||||
{
|
||||
"name": "RoadRunner Community",
|
||||
"homepage": "https://github.com/spiral/roadrunner/graphs/contributors"
|
||||
}
|
||||
],
|
||||
"description": "High-Performance GRPC server for PHP applications",
|
||||
"homepage": "https://roadrunner.dev/",
|
||||
"support": {
|
||||
"chat": "https://discord.gg/V6EK4he",
|
||||
"docs": "https://docs.roadrunner.dev",
|
||||
"forum": "https://forum.roadrunner.dev/",
|
||||
"issues": "https://github.com/roadrunner-server/roadrunner/issues",
|
||||
"source": "https://github.com/roadrunner-php/grpc/tree/v3.5.2"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sponsors/roadrunner-server",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2025-05-18T13:54:33+00:00"
|
||||
},
|
||||
{
|
||||
"name": "spiral/roadrunner-http",
|
||||
"version": "v3.6.0",
|
||||
|
||||
3
generated/README.md
Normal file
3
generated/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
### Note to Developers
|
||||
Only generated files are allowed in this directory.
|
||||
Please do not add any other files here manually.
|
||||
70
makefile
Normal file
70
makefile
Normal file
@@ -0,0 +1,70 @@
|
||||
help:
|
||||
@echo "Available commands:"
|
||||
@echo " start - Start the development runtime container"
|
||||
@echo " sh - Open a shell in the development runtime container"
|
||||
@echo " run - Run the application server in the development runtime container"
|
||||
@echo " stop - Stop and remove the development runtime container"
|
||||
@echo " migrate - Run database migrations in the migration container"
|
||||
@echo " composer-install - Install PHP dependencies in the composer runtime container"
|
||||
@echo " composer-require - Require a PHP package in the composer runtime container (usage: make composer-require package=vendor/package)"
|
||||
@echo " composer-require-dev - Require a PHP package as dev in the composer runtime container (usage: make composer-require-dev package=vendor/package)"
|
||||
@echo " composer-update - Update PHP dependencies in the composer runtime container"
|
||||
@echo " enable-debug - Enable Xdebug in the development runtime container"
|
||||
@echo " enable-coverage - Enable PCOV code coverage in the composer runtime container"
|
||||
@echo " protoc - Generate PHP gRPC code from .proto files"
|
||||
|
||||
|
||||
build-php-grpc:
|
||||
git clone -b v1.76.0 https://github.com/grpc/grpc
|
||||
cd grpc
|
||||
cd grpc && git submodule update --init
|
||||
grpc_root="$(pwd)"
|
||||
cd src/php/ext/grpc
|
||||
phpize
|
||||
GRPC_LIB_SUBDIR=libs/opt ./configure --enable-grpc="${grpc_root}"
|
||||
make
|
||||
|
||||
composer-install:
|
||||
docker compose exec composer-runtime sh -c "composer install --no-interaction --prefer-dist --optimize-autoloader --ignore-platform-reqs"
|
||||
|
||||
composer-require:
|
||||
docker compose exec composer-runtime sh -c "composer require $(package) --ignore-platform-reqs"
|
||||
|
||||
composer-require-dev:
|
||||
docker compose exec composer-runtime sh -c "composer require --dev $(package) --ignore-platform-reqs"
|
||||
|
||||
composer-update:
|
||||
docker compose exec composer-runtime sh -c "composer update --no-interaction --prefer-dist --optimize-autoloader --ignore-platform-reqs"
|
||||
|
||||
migrate:
|
||||
docker compose up migration-container
|
||||
|
||||
enable-coverage:
|
||||
${MAKE} start
|
||||
docker compose exec composer-runtime sh -c "bin/pcov.sh"
|
||||
|
||||
start:
|
||||
docker compose up dev-runtime -d --no-recreate
|
||||
|
||||
sh:
|
||||
${MAKE} start
|
||||
docker compose exec dev-runtime sh
|
||||
|
||||
run:
|
||||
${MAKE} start
|
||||
docker compose exec dev-runtime sh -c "rr serve"
|
||||
|
||||
enable-debug:
|
||||
${MAKE} start
|
||||
docker compose exec dev-runtime sh -c "bin/xdebug.sh"
|
||||
|
||||
stop:
|
||||
docker compose down
|
||||
|
||||
protoc:
|
||||
protoc --plugin=protoc-gen-php-grpc \
|
||||
--php_out=./generated \
|
||||
--php-grpc_out=./generated \
|
||||
protos/example.proto
|
||||
|
||||
.PHONY: help enable-coverage start sh run enable-debug stop protoc
|
||||
23
protos/example.proto
Normal file
23
protos/example.proto
Normal file
@@ -0,0 +1,23 @@
|
||||
syntax = "proto3";
|
||||
|
||||
option go_package = "proto/greeter";
|
||||
option php_namespace = "GRPC\\Greeter";
|
||||
option php_metadata_namespace = "GRPC\\GPBMetadata";
|
||||
|
||||
package helloworld;
|
||||
|
||||
// The greeting service definition.
|
||||
service Greeter {
|
||||
// Sends a greeting
|
||||
rpc SayHello (HelloRequest) returns (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;
|
||||
}
|
||||
34
src/Grpc.php
Normal file
34
src/Grpc.php
Normal file
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Siteworxpro\App;
|
||||
|
||||
use Siteworxpro\App\Services\Facades\Config;
|
||||
use Spiral\RoadRunner\GRPC\Invoker;
|
||||
use Spiral\RoadRunner\GRPC\Server;
|
||||
use Spiral\RoadRunner\Worker;
|
||||
|
||||
class Grpc
|
||||
{
|
||||
/**
|
||||
* @throws \ReflectionException
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
Kernel::boot();
|
||||
}
|
||||
|
||||
public function start(): int
|
||||
{
|
||||
$server = new Server(new Invoker(), [
|
||||
'debug' => (bool) Config::get('app.debug'),
|
||||
]);
|
||||
|
||||
$server->registerService(GreeterInterface::class, new Greeter());
|
||||
|
||||
$server->serve(Worker::create());
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user