Как вызвать код на Go из PHP, используя библиотеку roadrunner-php/goridge?

Я использую <a href="https://github.com/roadrunner-php/goridge" rel="nofollow">https://github.com/roadrunner-php/goridge</a> и <a href="https://github.com/roadrunner-server/goridge" rel="nofollow">https://github.com/roadrunner-server/goridge</a>. В файле .rr.dev.yaml у меня следующая конфигурация: 

```yaml
version: "2.7"

server:
    command: "php bin/road-runner-console baldinof:roadrunner:worker"
    env:
        - APP_RUNTIME: Baldinof\RoadRunnerBundle\Runtime\Runtime

## Go воркер
go_worker:
    command: "go run main.go"
    env:
        - GOOS: linux
        - GOARCH: amd64
```

А в main.go код выглядит так:

```go
package main

import (
        "fmt"
        "net"
        "net/rpc"

        goridgeRpc "github.com/roadrunner-server/goridge/v3/pkg/rpc"
)

type App struct{}

func (s *App) Hi(name string, r *string) error {
        *r = fmt.Sprintf("Hello, %s!", name)
        return nil
}

func main() {
    fmt.Println("Привет, мир!")

        ln, err := net.Listen("tcp", ":6001")
        if err != nil {
                panic(err)
        }

        _ = rpc.Register(new(App))

        for {
                conn, err := ln.Accept()
                if err != nil {
                        continue
                }
                _ = conn
                go rpc.ServeCodec(goridgeRpc.NewCodec(conn))
        }
}
```

В консольной команде используется следующий код:

```php
$tcpRPC = new Goridge\RPC\RPC(Goridge\Relay::create('tcp://127.0.0.1:6001'));
$r = $tcpRPC->call("App.Hi", "Antony");
```

Возникают ли у вас какие-либо вопросы относительно этой конфигурации и кода?
  • 16 октября 2024 г. 10:23
Ответы на вопрос 2
Ваше описание конфигурации и кода в основной части выглядит довольно вполне, но я хотел бы отметить несколько моментов, которые могут помочь избежать потенциальных проблем при использовании Go через RPC с PHP с помощью библиотеки `goridge`.

Вот несколько вопросов и предложений, которые могут помочь вам:

1. **Проверка ошибок**:
   Убедитесь, что вы проверяете ошибки на всех стадиях выполнения, как в PHP коде, так и в Go коде. Например, в Go коде вы можете добавить обработку ошибок на этапе регистраций и связи:

    ```go
    if err := rpc.Register(new(App)); err != nil {
        fmt.Println("Ошибка регистрации RPC:", err)
        return // выходим, если произошла ошибка
    }
    ```

2. **Запуск Workers**:
   Убедитесь, что ваш воркер Go действительно запущен и слушает подключение на порту `6001`. Вы можете добавить в ваш Go код логи, чтобы видеть, запустился ли он корректно и готов ли принять соединения.

3. **Проверьте конфигурацию RoadRunner**:
   Убедитесь, что ваш RoadRunner сервер правильно настраивается и действительно запускает Go воркер. Посмотрите логи RoadRunner, чтобы понять, возникают ли ошибки при запуске.

4. **Правильный путь к Навигации**:
   В `PHP` коде убедитесь, что у вас правильно прописан путь к вашему TCP-соединению. Обычно, если вы используете Docker, `127.0.0.1` может не ссылаться на тот же контейнер, что и ваш PHP-код. Возможно, нужно использовать IP-адрес, который соответствует вашему контейнеру Go.

5. **Тестирование отдельно**:
   Для исключения проблем с одной из сторон проведите тестирование каждой части отдельно. Попробуйте запустить только Go сервер и используйте клиент на Go (например), чтобы проверить, что он работает, перед тем, как делать вызовы из PHP.

6. **Формат RPC вызова**:
   Строка вызова в PHP должна быть `App.Hi`, как у вас и указано, но также убедитесь, что передаваемые параметры являются корректными.

Вот пример, как проверить и вызвать RPC из PHP:

```php
use Goridge\RPC;

$tcpRPC = new RPC(Goridge\Relay::create('tcp://127.0.0.1:6001'));

try {
    $result = $tcpRPC->call("App.Hi", "Antony");
    echo $result; // должно вывести "Hello, Antony!"
} catch (Exception $e) {
    echo "Ошибка при вызове RPC: " . $e->getMessage();
}
```

Соблюдение этих моментов должно помочь вам успешно интегрировать код на Go с PHP через библиотеку `roadrunner-php/goridge`. Если у вас осталось что-то неясное или возникли новые вопросы, не стесняйтесь их задавать.
Я запутался кто тут кого вызывает ... 
"server" вызывает "go_worker" ?
Консольная команда - она где вызывается, на "server" ??

В общем так ...
Если один сервис вызывает другой (когда "server" вызывает "go_worker") порты не нужно пробрасывать.

надо поправить в консольной команде адрес
$tcpRPC = new Goridge\RPC\RPC(Goridge\Relay::create('tcp://go_worker:6001'));

наверное будет достаточно.

для случая когда надо вызвать сервис (например "go_worker") из "внешнего мира" надо пробрасывать порты
к сожалению тут я не подскажу т.к. ".rr.dev.yaml" - не стандартный docker-compose file, надо в смотреть как пробрасывать тут где то https://github.com/roadrunner-php/goridge
Похожие вопросы