← 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-ffiffi.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_tabletifbmht)。

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-ffiffi.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=ffiffi.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 上可用,ReportReportAot 均不支持。数据集名称必须与 .rdl 文件中定义的数据集匹配。所有字段值都必须是字符串。

导出格式

格式字符串输出可用范围
pdfPDF所有模式
csvCSV 文本所有模式
xlsxExcel 工作簿所有模式
xmlXML 数据所有模式
rtfRich Text Format所有模式
tifTIFF 图像(彩色)所有模式
htmlHTML所有模式
xlsx_tableExcel(表格样式)仅 ReportAot + ReportNative
tifbTIFF 图像(黑白)仅 ReportAot + ReportNative
mhtMHTML 网页存档仅 ReportAot + ReportNative