Search by

sting_bo / php-gome

stingbo

Calling Match Engine Of Go Service

Package info

github.com/stingbo/php-gome

pkg:composer/sting_bo/php-gome

Statistics

Installs: 22

Dependents: 0

Suggesters: 0

Stars: 4

Open Issues: 0

v1.0.0 2026-11-05 09:01 UTC

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/