sting_bo / php-gome
Calling Match Engine Of Go Service
v1.0.0
2026-11-05 09:01 UTC
Requires
- php: >=8.1
- ext-grpc: *
- google/protobuf: ^4.33.6 || ^5.34
- grpc/grpc: ^1.34
- pimple/pimple: ^3.0
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-11-05 09:01:22 UTC
README
通过 gRPC 调用 Gome 撮合引擎 的 PHP 客户端。
安装
需要 PHP 8.1 或以上,以及已启用的 grpc 扩展。Protobuf 可使用 Composer 安装的 PHP 实现。
pecl install grpc composer require sting_bo/php-gome
下单、重试和查询
use Gome\Factory; use Gome\Order\OrderRequest; use Gome\Order\OrderStatusRequest; use Gome\Order\TransactionType; use Grpc\ChannelCredentials; $app = Factory::mengine([ 'host' => '127.0.0.1', 'port' => 8088, 'opts' => ['credentials' => ChannelCredentials::createInsecure()], 'channel' => null, ]); $identity = ['uuid' => 'user-1', 'oid' => 'order-1', 'symbol' => 'btc2usdt']; $order = new OrderRequest($identity + [ 'transaction' => TransactionType::BUY, 'price' => 1.25, 'volume' => 2.0, ]); $response = $app->gome->doOrder($order); if ($response->getCode() === \Grpc\STATUS_OK) { $duplicate = $response->getDuplicate(); $status = $app->gome->getOrderStatus(new OrderStatusRequest($identity), [], [ 'timeout' => 1000000, // 微秒 ]); }
- 原有调用方式继续可用。使用
$app->gome->deleteOrder($order)撤单,使用$app->pool->getDepth($request)查询深度。 - 相同订单和参数重试成功时,
getDuplicate()返回true。同一交易对内复用订单 ID 且参数不同时,原有下单封装通过getCode()返回\Grpc\STATUS_ALREADY_EXISTS。 getOrderStatus()需要支持GetOrderStatus的 Go 服务。查询失败时抛出RuntimeException,异常代码是 gRPC 状态码。查询响应中的价格和数量以整数 tick 返回,getAccuracy()表示小数位数。
开发验证
composer install
composer test
GOME_TEST_PORT=8088 GOME_TEST_SYMBOL=php-status-test composer test:integration
联调需使用隔离的 Go 服务,并启动对应交易对的撮合进程。该测试要求 Go 服务的 gome.accuracy 为 8,并会提交和撤销真实测试订单。可通过 GOME_TEST_HOST 覆盖默认地址 127.0.0.1。
更新协议时使用 protoc 生成消息类和元数据。PHP 协议保留 gome.order 和 gome.pool 包名以维持 PHP 类名,RPC stub 则沿用 Go 服务的 /Order/… 和 /Pool/… 路径。更新订单消息的示例命令如下。
cd src out=$(mktemp -d) protoc --php_out="$out" order.proto cp "$out"/GPBMetadata/Order.php GPBMetadata/ cp "$out"/Gome/Order/*.php Order/