Я использую <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");
```
Возникают ли у вас какие-либо вопросы относительно этой конфигурации и кода?
Ваше описание конфигурации и кода в основной части выглядит довольно вполне, но я хотел бы отметить несколько моментов, которые могут помочь избежать потенциальных проблем при использовании 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