Установите laravel Octane с сервером Roadrunner, плагином gRPC

Я использую ларавель 11.9. Я хочу использовать laravel Octane с плагином gRPC, но он не работает. my composer.json file

...
"require": {
        "php": "^8.2",
        "ext-grpc": "*",
        "google/protobuf": "^3.25",
        "grpc/grpc": "^1.57",
        "laravel/framework": "^11.9",
        "laravel/octane": "^2.3",
        "laravel/tinker": "^2.9",
        "spiral/goridge": "^4.2",
        "spiral/roadrunner": "^2024.1",
        "spiral/roadrunner-cli": "^2.6.0",
        "spiral/roadrunner-grpc": "^3.3",
        "spiral/roadrunner-http": "^3.3.0"
    },
...

my voucher.proto file


package services;

option php_namespace = "GrpcServices\\Voucher\\Messages";
option php_metadata_namespace = "GrpcServices\\Voucher";

service Voucher {
    rpc validateVoucher (VoucherMessageRequest) returns (VoucherMessageResponse) {
    }
}

message VoucherMessageRequest {
    repeated int32 VoucherId = 1;
}

message VoucherMessageResponse {
    int32 VoucherId = 1;
    int32 customerId = 2;
}

my voucher service


namespace App\Grpc;

use GrpcServices\Voucher\Messages\VoucherMessageRequest;
use GrpcServices\Voucher\Messages\VoucherMessageResponse;
use Spiral\Roadrunner\GRPC\ContextInterface;

class VoucherService implements VoucherServiceInterface
{
    public function validateVoucher(VoucherMessageRequest $request, ContextInterface $context): VoucherMessageResponse
    {
        $response = new VoucherMessageResponse();

        return $response;
    }
}

после запуска команды:

protoc --proto_path=./protos --php_out=./app/Grpc --grpc_out=./app/Grpc --plugin=protoc-gen-grpc=/usr/bin/grpc_php_plugin voucher.proto

У меня 4 файла VoucherClient.php, VoucherMessageRequest.php, VoucherMessageResponse.php, Voucher.php, вот так

app
 -Grpc
   |
    -GrpcServices
      |
       - Voucher
          |
           - Messages
          |    - VoucherClient.php
          |    - VoucherMessageRequest.php
          |    - VoucherMessageResponse.php
           - Voucher.php

.rr.yaml file

version: "3"
rpc:
  listen: "tcp://127.0.0.1:6001"

server:
  command: "php artisan octane:start --server=roadrunner --host=127.0.0.1 --port=8000"

http:
  address: "0.0.0.0:8000"

grpc:
  listen: "tcp://0.0.0.0:9090"
  proto:
    - "/var/www/html/server/protos/voucher.proto"

logs:
  mode: development

  channels:
    grpc:
      level: debug
      type: stdout
    http:
      level: debug
      type: stdout
    server:
      level: debug
      type: stdout

сейчас запускаю ./rr serve ошибка

/var/www/html/server # ./rr serve -p
2024-06-06T07:59:27+0000        DEBUG   rpc             plugin was started      {"address": "tcp://127.0.0.1:6001", "list of the plugins with RPC methods:": ["lock", "resetter", "app", "informer"]}
handle_serve_command: Function call error:
        serve error from the plugin *grpc.Plugin stopping execution, error: grpc_plugin_serve: WorkerAllocate:
        static_pool_allocate_workers:
        goridge_frame_receive: validation failed on the message sent to STDOUT, see: https://roadrunner.dev/docs/known-issues-stdout-crc/current/en, invalid message:
   ERROR  RoadRunner server is already running.

и остановить процесс. если я побегу php artisan octane:start --server=roadrunner --host=127.0.0.1 --port=8000 это работает с сообщением

/var/www/html/server #  php artisan octane:start --server=roadrunner --host=127.0.0.1 --port
=8000

   INFO  Server running…

  Local: http://127.0.0.1:8000

  Press Ctrl+C to stop the server

В клиенте пишу тестовую команду:

<?php

namespace App\Console\Commands;

use GrpcServices\Voucher\Messages\VoucherClient;
use GrpcServices\Voucher\Messages\VoucherMessageRequest;
use Illuminate\Console\Command;
class test extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'app:test';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $client = new VoucherClient('127.0.0.1:9090', [
            'credentials' => \Grpc\ChannelCredentials::createInsecure(),
        ]);
        $voucherRequest = new VoucherMessageRequest();
        $voucherRequest->setVoucherId([123]);

        list($response, $status) = $client->validateVoucher($voucherRequest)->wait();
        dd($response, $status);
    }
}

и при запуске php artisan app:test я получил сообщение об ошибке

/var/www/html/client # php artisan app:test
null // app/Console/Commands/test.php:36
{#566
  +"metadata": []
  +"code": 13
  +"details": "sync_worker_receive_frame: Network: EOF"
} // app/Console/Commands/test.php:36

Я не знаю, команда ./rr serve или php artisan octane:start --server=roadrunner --host=127.0.0.1 --port=8000 верна? Как laravel Octane работает с gRPC?

Документации по этому вопросу очень мало

Как laravel Octane работает с gRPC?

Пожалуйста, не делитесь изображениями вашего композитора и ошибки, так как изображения в конечном итоге исчезнут, и вопрос будет непригоден для всех, замените его обычным текстом.

matiaslauriti 06.06.2024 11:39

Да, я только что отредактировал свой вопрос

Mike 06.06.2024 12:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
2
185
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Laravel Octane не поддерживает gRPC. Более того, судя по этой ответной ссылке , в Laravel не понимают, что это такое.

Что касается сообщения об ошибке, которое вы видите в журналах, вот причина:

ERROR  RoadRunner server is already running.

Вы не можете отправлять какие-либо данные в STDOUT RR во время загрузки рабочих процессов (можно использовать STDERR).

Другие вопросы по теме