不能,php标准库和主流扩展均不支持原生读写parquet,需通过duckdb命令行、python pyarrow脚本或http api等外部工具间接实现。

PHP能直接读写Parquet吗?不能,得靠外部工具
PHP标准库和主流扩展(包括 ext-parquet)目前都不支持原生解析或生成 Parquet 文件。所谓“PHP处理Parquet”,本质是调用外部命令行工具(如 parquet-cli、duckdb、pyarrow 脚本)或通过 FFI / HTTP API 间接操作。硬要在 PHP 进程里做二进制解析,既没成熟库,也极易出错。
用 duckdb 命令行快速读取 Parquet 到 PHP 数组
duckdb 是最轻量、兼容性最好的选择:单二进制、无需服务端、支持 SQL 查询 Parquet 文件。PHP 只需执行 shell 命令并解析 JSON 输出:
- 确保系统已安装
duckdb(v0.10+),且在$PATH中 - 用
duckdb执行SELECT * FROM 'data.parquet' LIMIT 100并导出为 JSON:
duckdb data.parquet "SELECT * FROM read_parquet('data.parquet') LIMIT 100" -json
PHP 中调用示例:
$cmd = escapeshellcmd("duckdb data.parquet \"SELECT * FROM read_parquet('data.parquet') LIMIT 100\" -json");
$output = shell_exec($cmd);
$data = json_decode($output, true);
-
escapeshellcmd()必须用,否则文件名含空格或单引号会崩 - duckdb 默认把 NULL 字段转成
null,PHPjson_decode()能正确映射 - 注意:大文件加
LIMIT或分页(OFFSET+LIMIT),否则内存爆掉
用 Python + pyarrow 写 Parquet:PHP 调用脚本最稳
PHP 自己拼 Parquet 二进制格式几乎不可行;用 pyarrow 写是最可靠路径。不装 Python 环境?不行——这是当前唯一可信赖的写入方案。
- Python 脚本(
write_parquet.py)接收 JSON 格式 stdin:
import sys import json import pyarrow as pa import pyarrow.parquet as pq <p>data = json.load(sys.stdin) table = pa.Table.from_pydict(data) pq.write_table(table, sys.argv[1])</p>
PHP 中调用:
$json = json_encode(['col_a' => [1, 2, 3], 'col_b' => ['x', 'y', 'z']]);
$cmd = escapeshellcmd("python3 write_parquet.py output.parquet");
$proc = proc_open($cmd, [
['pipe', 'r'], // stdin
['pipe', 'w'], // stdout
['pipe', 'w'] // stderr
], $pipes);
<p>if (is_resource($proc)) {
fwrite($pipes[0], $json);
fclose($pipes[0]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
proc_close($proc);
if (!empty($stderr)) {
throw new RuntimeException("pyarrow error: {$stderr}");
}
}</p>
- 必须检查
$stderr,pyarrow 报错不会走 stdout,静默失败很常见 - 字段类型由
pyarrow自动推断,但字符串列含null时可能被误判为large_string,后续读取兼容性一般没问题 - 别用
exec()直接传 JSON 参数——长度超限或特殊字符会截断
性能和线上部署要注意什么
这不是本地玩具方案。真实业务中,I/O 和进程开销是瓶颈,不是语法问题。
- 每次读写都起新进程(
duckdb或python),并发高时 CPU 和 fork 开销明显;考虑用常驻服务(如 FastAPI 封装 pyarrow 接口)替代 shell 调用 - Parquet 文件路径必须对 PHP 进程可读(web server 用户如
www-data),权限错误时shell_exec返回空字符串,无报错提示 - duckdb 对时间戳、嵌套结构(List/Struct)支持较好;但 PHP 传给 pyarrow 的数组不能含资源、对象、循环引用——
json_encode()会静默跳过
真正卡住人的从来不是“怎么写第一行代码”,而是权限、超时、stderr 没捕获、临时目录磁盘满、以及以为 JSON 就能直通 Parquet 类型系统。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











