xray-grpc-php
PHP-клиенты gRPC API Xray и классы protobuf-сообщений. Нужны ext-grpc, grpc/grpc и google/protobuf из composer.json.
Установка
Заголовок раздела «Установка»composer require localzet/xray-grpccomposer check-platform-reqsКлиенты сервисов
Заголовок раздела «Клиенты сервисов»| Класс | Назначение |
|---|---|
| Xray\App\Proxyman\Command\HandlerServiceClient | Управление inbound/outbound обработчиками |
| Xray\App\Log\Command\LoggerServiceClient | Управление журналированием |
| Xray\App\Router\Command\RoutingServiceClient | Маршруты и балансировщики |
| Xray\App\Stats\Command\StatsServiceClient | Счётчики трафика и системная статистика |
| Xray\Core\App\Observatory\Command\ObservatoryServiceClient | Состояние наблюдаемых outbound |
Конструктор принимает адрес и channel options. Unary RPC возвращает объект вызова; wait() возвращает пару response/status. Проверяйте status.code до чтения полей ответа. Call option timeout задаётся в микросекундах.
Статистика
Заголовок раздела «Статистика»GetStats читает один счётчик по имени; QueryStats выбирает счётчики по pattern; GetSysStats возвращает показатели процесса. Поле reset управляет сбросом счётчика при чтении. В примере ниже reset=false, а deadline равен одной секунде. Замените inbound tag example на свой и включите соответствующие счётчики/API в конфигурации Xray.
Канал без TLS в примере адресован loopback. Для удалённого API используйте защищённый транспорт и ограничьте доступ: это административный интерфейс Xray.
Методы клиентов и поля сообщений.
<?php
declare(strict_types=1);
use Grpc\ChannelCredentials;use Xray\App\Stats\Command\GetStatsRequest;use Xray\App\Stats\Command\StatsServiceClient;
require __DIR__ . '/vendor/autoload.php';
$client = new StatsServiceClient('127.0.0.1:10085', [ 'credentials' => ChannelCredentials::createInsecure(),]);$request = new GetStatsRequest();$request->setName('inbound>>>example>>>traffic>>>uplink');$request->setReset(false);[$response, $status] = $client->GetStats($request, [], ['timeout' => 1_000_000])->wait();if ($status->code !== Grpc\STATUS_OK) { throw new RuntimeException($status->details);}$stat = $response->getStat();if ($stat === null) { throw new RuntimeException('No statistic returned');}echo $stat->getValue(), PHP_EOL;Исходный код · AGPL-3.0