环境要求
| 组件 | 要求 |
|---|---|
| PHP | 8.0+ |
| guzzlehttp/guzzle | ^7.0,随包自动安装 |
| psr/log | ^3.0,随包自动安装 |
| ext-pdo_mysql | 可选;Doris、StarRocks 的 SQL 需要;Stream Load 是纯 HTTP,不需要 |
| apache/thrift | 可选;Hive / Spark Thrift Server 需要,支持 ^0.24 或 ^0.25 |
| mroosz/php-cassandra | 可选;Cassandra 需要,^1.2 |
| aws/aws-sdk-php | 可选;Hudi / Paimon 的 S3 存储需要 |
框架适配器的版本与 PHP 下限:
| 框架 | 支持版本 | PHP 下限 |
|---|---|---|
| Laravel | 9 / 10 / 11 | 9 为 8.0,10 为 8.1,11 为 8.2 |
| ThinkPHP | 6 / 8 | 包本身要求 8.0;ThinkPHP 8 也要求 8.0 |
| Webman | 1.4+ / 2.x | 1.4+ 为 8.0,2.x 为 8.1 |
| Hyperf | 3.x | 8.1,并需要 Swoole 5 |
| Yii2 | 2.0.46+ | 8.0 |
| Yii3 | 3.x | 8.1 |
框架自身的 PHP 下限可能高于本包的 8.0;以框架要求为准。
安装
标准安装方式(Packagist 已上线):
composer require erikwang2013/bigdata-php:^2.0
包在 Composer 中声明为 yii2-extension,以便 Yii2 自动注册组件;Laravel、ThinkPHP、Webman、Hyperf、Yii3 和非 Yii2 项目仍按普通 Composer 库安装。框架注册细节见第 6 节。
按需安装可选依赖:
composer require apache/thrift # Hive / Spark Thrift Server
composer require mroosz/php-cassandra # Cassandra
Doris / StarRocks 不需要额外的 Composer 包,但需要在 php.ini 中启用 pdo_mysql 扩展。
快速开始
use Erikwang2013\BigData\BigData;
$trino = BigData::driver('trino', [
'host' => '127.0.0.1',
'port' => 8080,
'user' => 'php',
'catalog' => 'hive',
'schema' => 'default',
]);
$result = $trino->query('SELECT 1 AS id');
foreach ($result->rows() as $row) {
echo $row[0], PHP_EOL;
}
ResultSet 的常用方法:
$result->columns(); // 列名或列描述,具体结构由驱动决定
$result->rows(); // 行数组,null 值原样保留
$result->count(); // 行数
$result->raw(); // 驱动原始返回,便于排查协议细节
调度类驱动示例:
$airflow = BigData::driver('airflow', [
'baseUrl' => 'http://127.0.0.1:8081',
'username' => 'admin',
'password' => 'admin',
]);
$airflow->triggerDag('daily_etl', ['date' => '2026-10-29']);
可选驱动模式:
BigData::drivers(); // 全部 21 个驱动键
BigData::available(); // 当前环境可选依赖齐全的驱动键
try {
$hive = BigData::driver('hive', ['host' => '127.0.0.1']);
} catch (\Erikwang2013\BigData\Exception\DriverUnavailableException $e) {
echo $e->getMessage(); // 包含 composer require apache/thrift 提示
}
驱动也可以直接实例化。直接实例化不会经过可选依赖检查,缺少扩展或类时会在运行时失败:
use Erikwang2013\BigData\Driver\Trino\TrinoClient;
use Erikwang2013\BigData\Driver\Trino\TrinoConfig;
$trino = new TrinoClient(TrinoConfig::fromArray([
'host' => '127.0.0.1',
]));
框架集成
核心包不依赖任何框架。src/Integration 中的适配器只做两件事:读取统一的 default / drivers 配置,把 Erikwang2013\BigData\Integration\Manager 绑定到框架容器。
每个适配器都有独立文档:Laravel、ThinkPHP、Webman、Hyperf、Yii2、Yii3。
首次启动时,适配器按框架约定自动复制配置模板:Laravel、ThinkPHP、Webman、Yii2 写入 config/bigdata.php,Hyperf 写入 config/autoload/bigdata.php;Yii3 由 yiisoft/config 自动合并包内配置,无需复制。已有配置文件不会被覆盖。
composer require 后的注册方式随框架规则不同:
| 框架 | 注册方式 |
|---|---|
| Laravel | extra.laravel.providers,自动发现 |
| ThinkPHP | extra.think.services,骨架在 post-autoload-dump 中执行 service:discover |
| Hyperf | extra.hyperf.config,自动合并 ConfigProvider |
| Yii3 | extra.config-plugin,yiisoft/config 自动合并 |
| Webman | post-package-install 插件钩子自动写入 config/plugin/erikwang2013/bigdata-php/(app.php + bootstrap.php) |
| Yii2 | type=yii2-extension + extra.bootstrap,yiisoft/yii2-composer 自动注册组件 |
统一配置结构(所有框架相同):
// config/bigdata.php
return [
'default' => 'trino',
'drivers' => [
'trino' => [
'host' => '127.0.0.1',
'port' => 8080,
'user' => 'php',
'catalog' => 'hive',
'schema' => 'default',
],
'airflow' => [
'baseUrl' => 'http://127.0.0.1:8081',
'username' => 'admin',
'password' => 'admin',
],
],
];
Manager 的公开行为:
driver()使用default,driver('airflow')使用显式名称;同一名称的实例会被缓存。drivers()返回drivers下已配置的驱动名。available()返回已配置且可选依赖齐全的驱动名。- 只允许创建
drivers中配置过的驱动;未知名称抛出InvalidArgumentException。
Laravel
包在 extra.laravel.providers 中声明服务提供者,composer require 后 Laravel 自动发现并注册,无需修改 config/app.php 或 bootstrap/providers.php。首次启动会自动写入 config/bigdata.php,已有文件不会被覆盖;也可以显式发布:
php artisan vendor:publish --tag=bigdata-config
使用:
$trino = app(\Erikwang2013\BigData\Integration\Manager::class)->driver('trino');
// provider 同时注册了 "bigdata" 别名
$airflow = app('bigdata')->driver('airflow');
ThinkPHP
包在 extra.think.services 中声明服务。使用 topthink/think 骨架时,composer require 触发的 post-autoload-dump 会自动执行 php think service:discover;旧项目或自定义骨架没有该脚本时,手动执行一次。首次启动会自动写入 config/bigdata.php,无需复制模板。
$manager = app('bigdata');
$trino = $manager->driver('trino');
Webman
包内置 Webman 插件安装器(src/Install.php)。composer require 时,Webman 骨架的 post-package-install 钩子会调用它,自动写入 config/plugin/erikwang2013/bigdata-php/app.php 和 bootstrap.php;Webman 启动时加载该配置并运行 Bootstrap。首次 worker 启动会自动写入 config/bigdata.php,无需手动改 config/bootstrap.php。
如果 Webman 的插件钩子被禁用,再手动注册:
// config/bootstrap.php
return [
Erikwang2013\BigData\Integration\Webman\Bootstrap::class,
];
适配器使用懒加载定义,每个 worker 进程拥有自己的 Manager:
$manager = \support\Container::get(\Erikwang2013\BigData\Integration\Manager::class);
$trino = $manager->driver('trino');
Hyperf
包在 extra.hyperf.config 中声明 ConfigProvider,composer require 后自动参与配置提供者合并,无需手写 config_providers。首次启动会自动写入 config/autoload/bigdata.php;也可以显式发布:
php bin/hyperf.php vendor:publish erikwang2013/bigdata-php
Hyperf 3 需要 PHP 8.1 和 Swoole 5:
$manager = $container->get(\Erikwang2013\BigData\Integration\Manager::class);
$trino = $manager->driver('trino');
Yii2
本包声明为 type=yii2-extension,并在 extra.bootstrap 中注册 BigDataBootstrap。yiisoft/yii2-composer 会把组件自动加入应用,无需修改 config/web.php 或 config/console.php;组件首次使用会自动写入 config/bigdata.php。非 Yii2 项目仍由 Composer 的默认安装器按普通库安装,不受影响。
如果 Yii2 的 Composer 插件被禁用,再手动注册组件:
// config/web.php
return [
'components' => [
'bigdata' => Erikwang2013\BigData\Integration\Yii2\BigDataComponent::class,
],
];
驱动配置优先从 Yii::$app->params['bigdata'] 读取;未设置时使用自动写入的 config/bigdata.php:
$trino = Yii::$app->bigdata->driver('trino');
Yii3
包在 extra.config-plugin 中声明 params 和 di,yiisoft/config 的 Composer 插件会在安装/更新时自动合并包内配置。应用需要允许该插件:
composer config allow-plugins.yiisoft/config true
无需复制文件;应用侧覆盖 config/common/params.php 中的 erikwang2013/bigdata-php 段即可:
// config/common/params.php
return [
'erikwang2013/bigdata-php' => [
'default' => 'trino',
'drivers' => [
'trino' => ['host' => '127.0.0.1'],
],
],
];
Manager 已注册到容器,可以注入或直接获取:
final class DashboardController
{
public function __construct(
private \Erikwang2013\BigData\Integration\Manager $bigdata,
) {
}
}
或直接从容器获取:
$manager = $container->get(\Erikwang2013\BigData\Integration\Manager::class);
$trino = $manager->driver('trino');
驱动矩阵
19 个平台、21 个驱动键。— 表示没有额外依赖。
| 平台 | 驱动键 | 客户端 | 可选依赖 | 说明 | 文档 |
|---|---|---|---|---|---|
| Trino | trino |
Driver\Trino\TrinoClient |
— | SQL 查询、catalog / schema / table 浏览 | 查看 |
| Hadoop | hadoop-webhdfs |
Driver\Hadoop\WebHdfsClient |
— | HDFS 读写,WebHDFS REST,含 307 重定向 | 查看 |
| Hadoop | hadoop-yarn |
Driver\Hadoop\YarnClient |
— | YARN 应用查询与终止 | 查看 |
| Hive | hive |
Driver\Hive\HiveClient |
apache/thrift |
HiveServer2 / Spark Thrift Server,NONE / NOSASL / PLAIN / LDAP | 查看 |
| Spark | spark |
Driver\Spark\LivyClient |
— | Livy session / statement / batch | 查看 |
| Flink | flink-sql |
Driver\Flink\SqlGatewayClient |
— | Flink SQL Gateway | 查看 |
| Flink | flink-jobs |
Driver\Flink\JobClient |
— | JobManager 作业查询与取消 | 查看 |
| Doris | doris |
Driver\Doris\DorisClient |
ext-pdo_mysql (SQL) |
SQL 9030 + Stream Load 8030 | 查看 |
| StarRocks | starrocks |
Driver\StarRocks\StarRocksClient |
ext-pdo_mysql (SQL) |
SQL 9030 + Stream Load 8030 | 查看 |
| Kylin | kylin |
Driver\Kylin\KylinClient |
— | SQL / cube / job | 查看 |
| Druid | druid |
Driver\Druid\DruidClient |
— | SQL / native query | 查看 |
| Iceberg | iceberg |
Driver\Iceberg\RestCatalogClient |
— | REST Catalog 元数据 | 查看 |
| Hudi | hudi |
Driver\Hudi\HudiTable |
aws/aws-sdk-php (S3 可选) |
只读 .hoodie 时间线,本地 / WebHDFS / S3 |
查看 |
| Paimon | paimon |
Driver\Paimon\PaimonTable |
aws/aws-sdk-php (S3 可选) |
只读 schema / snapshot,本地 / WebHDFS / S3 | 查看 |
| Delta Lake | delta-lake |
Driver\DeltaLake\DeltaSharingClient |
— | Delta Sharing,返回 Parquet 文件清单 | 查看 |
| DolphinScheduler | dolphinscheduler |
Driver\DolphinScheduler\DolphinSchedulerClient |
— | 项目 / 工作流 / 实例 / 日志 | 查看 |
| Airflow | airflow |
Driver\Airflow\AirflowClient |
— | DAG / run / task / 变量 | 查看 |
| Azkaban | azkaban |
Driver\Azkaban\AzkabanClient |
— | 登录 / flow / 执行 / 日志 | 查看 |
| Oozie | oozie |
Driver\Oozie\OozieClient |
— | workflow / coordinator / bundle | 查看 |
| HBase | hbase |
Driver\HBase\HBaseClient |
— | Stargate REST,Base64 单元格 | 查看 |
| Cassandra | cassandra |
Driver\Cassandra\CassandraClient |
mroosz/php-cassandra |
CQL,协议 v3 / v4 / v5 | 查看 |
驱动键与客户端类的完整命名空间前缀是 Erikwang2013\BigData\。例如 Driver\Trino\TrinoClient 的完整类名是 Erikwang2013\BigData\Driver\Trino\TrinoClient。
Hudi / Paimon 通过 BigData::driver() 使用时必须提供 base_path,可选 storage(local 或 webhdfs)以及 WebHDFS 的 host / port / user:
$table = BigData::driver('hudi', ['base_path' => '/warehouse/orders']);
$latest = $table->latestCommit();
架构设计
调用路径:
- 应用层:业务代码直接调用
BigData::driver(),或通过框架适配器从容器取得Integration\Manager。 - 框架适配层(可选):Laravel、ThinkPHP、Webman、Hyperf、Yii2、Yii3 适配器读取
default/drivers配置,把Manager绑定到容器;不引入 ORM、查询构造器或额外抽象。 - Manager / Registry:
Manager负责配置解析和实例缓存;BigData内部维护 21 个驱动键到工厂闭包的静态映射,未知键和缺失的可选依赖都在这里拦截。 - 驱动层:每个平台一个目录,包含
XxxConfig、XxxClient(部分驱动还有专用ResultSet或异常)。通用 HTTP、结果集、配置读取和异常位于src/Support/与src/Exception/,驱动只依赖自己的配置和注入的 HTTP / 日志实例。 - 外部系统:HTTP / JSON(Guzzle 7)、Thrift TCLIService、MySQL 协议(PDO)、CQL、本地文件系统或 WebHDFS。
关键约束:驱动按需创建、按名称缓存;Manager 不会在构造时连接任何外部系统;HTTP 客户端和日志器可以从上层注入,便于统一超时、代理和日志配置。
功能设计
代码分为五层:
- Core:
BigData门面(driver/drivers/available)、Integration\Manager、驱动注册表和可选依赖闸门。核心层只做名称解析、配置合并和工厂调用。 - Support:共享的
Support\Http(Guzzle 7 薄封装)、Support\ResultSet、Support\Config,以及以BigDataException为根的异常体系;连接失败与请求失败分别落到ConnectionException和RequestException。Hive、Cassandra、Doris、StarRocks 保留专用异常层级,Hudi/Paimon/Delta Lake 的元数据错误保留HudiException/PaimonException/DeltaLakeException。 - Driver:按平台隔离的 19 个目录,分为 SQL / OLAP、Hadoop / compute、Schedulers、Lakehouse、NoSQL 五组。驱动之间不共享客户端实例,也不存在跨驱动的统一 SQL 层。
- Optional dependencies:
ext-pdo_mysql(仅 Doris/StarRocks SQL)、apache/thrift、mroosz/php-cassandra、aws/aws-sdk-php(仅 S3)。Hive/Cassandra 在创建驱动时检查,PDO 在 SQL 调用时检查,S3 在读取时检查。 - Tests:单元测试使用 mock HTTP、本地 fixture 和 fake server;集成测试独立成组,按需连接真实服务。
这套结构的目标是“统一入口,不统一语义”:配置、结果集和异常命名保持一致,但每个驱动仍按目标系统的协议和错误模型工作。
请求周期
一次典型的驱动调用经过 8 步:
- 读取配置:应用或框架适配器读取
default与drivers;独立脚本直接把配置数组传给BigData::driver()。 - 解析驱动名:
Manager使用显式名称或默认名称;直接调用BigData时由调用方传入名称。 - 校验驱动键与可选依赖:注册表检查名称;
doris/starrocks检查pdo_mysql,hive检查apache/thrift,cassandra检查mroosz/php-cassandra。 - 创建配置与客户端:工厂调用
XxxConfig::fromArray(),再构造XxxClient;Guzzle 客户端和 PSR-3 日志器可以注入。 - 认证(如需要):HTTP Basic / Bearer / token、Hive SASL PLAIN 或 LDAP、Doris / StarRocks 的 PDO 登录、Cassandra 的 CQL 认证。
- 发送传输请求:HTTP/JSON、Thrift TCLIService、PDO MySQL、CQL、本地或 WebHDFS 读取;分页请求可能在这一步发出多次。
- 解析响应:处理 JSON 与 HTTP 200 下的应用层错误,跟随
nextUri、结果 token 或 offset,解析 Thrift 行批次、PDO 行或 Base64 编码的 HBase 单元格。 - 返回结果:查询类驱动返回
ResultSet,调度 / 目录类驱动返回驱动特定的数组;Hive 和 Cassandra 的会话由调用方显式close()。
错误映射:传输失败、超时和连接错误抛出 ConnectionException;HTTP 非 2xx 或应用层错误抛出 RequestException。所有驱动都不自动重试,调用方需要根据幂等性决定是否重试。
生命周期
| 阶段 | 做什么 |
|---|---|
| 安装 | composer require erikwang2013/bigdata-php;只在需要时安装 apache/thrift、mroosz/php-cassandra 或启用 pdo_mysql。 |
| 配置 | 准备 default / drivers 数组,或发布框架配置文件;每个驱动的字段见对应文档。 |
| 创建 | BigData::driver($name, $config) 或 Manager::driver($name);此时检查驱动键与可选依赖。 |
| 连接 | 大多数驱动在第一次查询或执行时才建立连接;HTTP 驱动无持久连接,PDO、Hive、Cassandra 按需打开。 |
| 查询 / 执行 | 执行 SQL、提交作业、读取元数据或写入 Stream Load;结果返回 ResultSet 或数组。 |
| 关闭 | Hive 和 Cassandra 提供 close() 释放会话;PDO 和 HTTP 资源随客户端实例释放。 |
可选依赖的生命周期是独立的:Hive/Cassandra 在创建驱动时检查类,ext-pdo_mysql 在 Doris/StarRocks 首次执行 SQL 时检查,S3 存储在首次读取时检查;缺失时抛出带安装提示的异常。直接 new 客户端会绕过创建期的检查。
目录结构
bigdata-php/
├── src/
│ ├── BigData.php # 驱动注册、工厂与可选依赖检查
│ ├── Install.php # Webman 插件安装器
│ ├── Driver/
│ │ ├── Trino/
│ │ ├── Hadoop/
│ │ ├── Hive/
│ │ ├── Spark/
│ │ ├── Flink/
│ │ ├── Doris/
│ │ ├── StarRocks/
│ │ ├── Kylin/
│ │ ├── Druid/
│ │ ├── Iceberg/
│ │ ├── Hudi/
│ │ ├── Paimon/
│ │ ├── DeltaLake/
│ │ ├── DolphinScheduler/
│ │ ├── Airflow/
│ │ ├── Azkaban/
│ │ ├── Oozie/
│ │ ├── HBase/
│ │ └── Cassandra/
│ ├── Integration/ # 框架适配器与 Manager
│ │ ├── Manager.php
│ │ ├── Laravel/
│ │ ├── ThinkPHP/
│ │ ├── Webman/
│ │ ├── Hyperf/
│ │ ├── Yii2/
│ │ └── Yii3/
│ ├── Support/ # 共享 HTTP、ResultSet、配置辅助
│ └── Exception/
│ ├── BigDataException.php
│ ├── ConnectionException.php
│ ├── RequestException.php
│ └── DriverUnavailableException.php
├── config/ # 框架配置样例
├── docs/
│ ├── diagrams/ # 中英文架构、功能、请求周期、生命周期 SVG
│ ├── drivers/ # 19 个平台的详细文档(en/ 为英文版)
│ ├── frameworks/ # 6 个框架适配文档(en/ 为英文版)
│ ├── pet.svg / pet-expressions/ # 项目宠物及 12 种动态表情
│ └── site/ # 站点内容源、构建与部署配置
├── scripts/ # 站点构建 / 检查脚本
├── site/ # 本地站点构建产物(gitignore,不随发布打包)
├── tests/
│ ├── Driver/ # 单元测试与 fixture
│ └── Integration/ # 按需运行的集成测试
├── demo/ # Trino / Flink / Airflow / Cassandra 演示
├── composer.json
├── phpstan.neon
├── phpunit.xml / phpunit-8.0.xml
├── ASSETS-LICENSE.md
├── CHANGELOG.md
├── README.md
└── README_EN.md
测试
composer test # 单元测试,不依赖真实集群
composer test-integration # 集成测试,需要可用的外部服务
单元测试使用 mock HTTP 客户端、本地 fixture 和 fake server,覆盖 296 个测试、994 个断言;另有 14 个集成测试。测试套件在 phpunit.xml 中分为 unit 和 integration 两组;默认的 composer test 只运行 unit,不包含 tests/Integration。
集成测试按需运行,例如 Cassandra 需要可访问的实例;demo/ 下提供了 Trino、Flink、Airflow 和 Cassandra 的 Docker Compose 配置,可作为本地验证起点。
边界与限制
- 湖仓只读元数据:Iceberg 读取 REST Catalog 和表元数据;Hudi 读取
.hoodie时间线;Paimon 读取 schema / snapshot;Delta Sharing 返回 Parquet 文件清单。它们都不读取 Parquet 行数据,也不做谓词下推或查询执行。 - Delta Sharing 不返回行:
DeltaSharingClient::query()返回文件清单和元数据,实际数据需要由调用方按清单读取。 - Hive 认证范围:支持 NONE、NOSASL、SASL PLAIN 和 LDAP(QOP
auth);NONE/PLAIN/LDAP 使用 SASL PLAIN,NOSASL 关闭 SASL;不支持 Kerberos / GSSAPI。binary 传输可通过tls => true使用 TLS;HTTP 传输通过scheme => https。 - Cassandra 可选且可能命名冲突:驱动包装
mroosz/php-cassandra,与ext-cassandra共用Cassandra\命名空间,同时加载时可能冲突。 - 不做自动重试:连接、HTTP 和应用层错误直接抛出
ConnectionException/RequestException;重试策略、退避和幂等判断由调用方负责。 - 没有统一 SQL 层或 ORM:驱动只做协议适配,不做 SQL 方言转换、跨源 JOIN、事务编排、连接池或模型映射。
- 可选依赖检查只在
BigData::driver():直接实例化客户端会跳过检查,缺失的扩展或类会在运行时以 PHP 错误暴露。 - 驱动能力不对称:每个平台只覆盖其公开 API 的一部分;具体方法、配置字段和限制以
docs/drivers/下的文档为准。
License
MIT。详见 LICENSE。