← SDK
PHP SDK
majorsilence/reporting
从 PHP 生成 PDF、Excel、CSV 等格式的 RDL 报表——通过子进程、AOT 二进制文件,或进程内 PHP FFI。PHP 8.1+。无 Composer 运行时依赖。
安装
通过 Composer 安装(需要 PHP 8.1+):
composer require majorsilence/reporting
或者克隆仓库并手动引入自动加载器:
require_once __DIR__ . '/vendor/autoload.php';
无 Composer 运行时依赖。原生 FFI 模式还需要 ext-ffi 以及 php.ini 中的 ffi.enable=true。
集成模式
| 类 | 机制 | 前提条件 |
|---|---|---|
| Report | 通过 proc_open 启动 dotnet RdlCmd.dll。 | 服务器上的 .NET 运行时。 |
| ReportAot | 通过 proc_open 启动自包含的 AOT 编译 RdlCmd 二进制文件。 | AOT 二进制文件与应用一同部署。无需 .NET 运行时。 |
| ReportNative | 通过 PHP FFI 在进程内加载 librdlnative.so。使用 RdlLibrary::load() 获取 FFI 实例。 | ext-ffi、ffi.enable=true,以及位于 LD_LIBRARY_PATH 中的原生库。 |
Report —— 子进程(dotnet)
use MajorsilenceReporting\Report; $rpt = new Report( '/path/to/report.rdl', '/path/to/RdlCmd.dll' ); $rpt->set_connection_string('Data Source=/path/to/data.db'); $rpt->set_parameter('StartDate', '2026-01-01'); // 保存到磁盘 $rpt->export('pdf', '/tmp/output.pdf'); // 或直接流式输出到浏览器 $data = $rpt->export_to_memory('pdf'); header('Content-Type: application/pdf'); header('Content-Disposition: inline; filename="report.pdf"'); echo $data;
ReportAot —— AOT 二进制
与 Report 使用相同的 API,但指向自包含的二进制文件。无需 .NET 运行时。还可解锁额外的导出格式(xlsx_table、tifb、mht)。
use MajorsilenceReporting\ReportAot; $rpt = new ReportAot( '/path/to/report.rdl', '/path/to/RdlCmd' // 自包含二进制文件 ); $rpt->set_connection_string('Data Source=/path/to/data.db'); $data = $rpt->export_to_memory('xlsx_table'); header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); echo $data;
ReportNative —— PHP FFI
通过 FFI 将 librdlnative.so 直接加载到 PHP 进程中。不会启动任何子进程。需要 ext-ffi 和 ffi.enable=true。
use MajorsilenceReporting\ReportNative; use MajorsilenceReporting\RdlLibrary; // 只加载原生库一次。会自动设置 RDLNATIVE_LIB_DIR。 $lib = RdlLibrary::load('/path/to/librdlnative.so'); $rpt = new ReportNative($lib, '/path/to/report.rdl'); $rpt->set_connection_string('Data Source=/path/to/data.db'); $data = $rpt->export_to_memory('pdf'); header('Content-Type: application/pdf'); echo $data;
PHP FFI 需要在
php.ini 中设置 extension=ffi 和 ffi.enable=true。原生库所在目录必须在 PHP 启动前就已加入 LD_LIBRARY_PATH——RdlLibrary::load() 会设置 RDLNATIVE_LIB_DIR,但无法为当前进程追溯性地更新 LD_LIBRARY_PATH。
核心 API
三个类共享同一接口(PSR-4 命名空间 MajorsilenceReporting\):
| 方法 | 说明 |
|---|---|
| set_connection_string(string $cs) | 设置数据库连接字符串。需在 export 之前调用。 |
| set_parameter(string $name, string $value) | 设置一个具名报表参数。可根据需要多次调用。 |
| export(string $type, string $path) | 渲染报表并将输出写入磁盘上的 $path。 |
| export_to_memory(string $type): string | 渲染并以二进制字符串(用于 PDF、TIFF、RTF、XLSX)或 UTF-8 字符串(用于 CSV、XML、HTML)形式返回输出。 |
内存数据集
ReportNative 支持通过 add_data() 完全在内存中提供数据——无需数据库连接。传入数据集名称和一个关联数组组成的数组,其中每个值都是字符串。
$rpt->add_data('SalesData', [ ['Product' => 'PDF Library Pro', 'Revenue' => '1200.00', 'Units' => '3'], ['Product' => 'Report Designer', 'Revenue' => '250.00', 'Units' => '1'], ['Product' => 'Support (12 mo.)', 'Revenue' => '500.00', 'Units' => '1'], ]); $data = $rpt->export_to_memory('pdf');
add_data() 仅在 ReportNative 上可用,Report 和 ReportAot 均不支持。数据集名称必须与 .rdl 文件中定义的数据集匹配。所有字段值都必须是字符串。
导出格式
| 格式字符串 | 输出 | 可用范围 |
|---|---|---|
pdf | 所有模式 | |
csv | CSV 文本 | 所有模式 |
xlsx | Excel 工作簿 | 所有模式 |
xml | XML 数据 | 所有模式 |
rtf | Rich Text Format | 所有模式 |
tif | TIFF 图像(彩色) | 所有模式 |
html | HTML | 所有模式 |
xlsx_table | Excel(表格样式) | 仅 ReportAot + ReportNative |
tifb | TIFF 图像(黑白) | 仅 ReportAot + ReportNative |
mht | MHTML 网页存档 | 仅 ReportAot + ReportNative |