跳转到主要内容

plphp

将 PHP 8 嵌入 PostgreSQL,提供非可信过程语言

概览

扩展包名版本分类许可证语言
plphp2.6LANGPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
3170plphp否是否是否否-
相关扩展plruby plperl plpython3u pllua plv8 jsonb_plphp hstore_plphp bytea_plphp
下游依赖bytea_plphp hstore_plphp jsonb_plphp

Uses non-ZTS PHP embed. EL8/EL9 RPMs require the PHP 8.2/8.3 module streams respectively; DEBs pin the matching PHP embed runtime for each OS. No preload or fixed schema. The three optional transforms are not included in this package.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY2.61817161514plphp-
RPMPIGSTY2.61817161514plphp_$vphp-embedded
DEBPIGSTY2.61817161514postgresql-$v-plphplibphp-embed
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
u22.x86_64
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
u22.aarch64
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
u24.x86_64
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
u24.aarch64
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
PIGSTY 2.6
u26.x86_64
u26.aarch64

构建

您可以使用 pig build 命令构建 plphp 扩展的 RPM / DEB 包:

pig build pkg plphp         # 构建 RPM / DEB 包

安装

您可以直接安装 plphp 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

安装
pig install plphp;          # 当前活跃 PG 版本安装
pig
pig ext install -y plphp -v 18  # PG 18
pig ext install -y plphp -v 17  # PG 17
pig ext install -y plphp -v 16  # PG 16
pig ext install -y plphp -v 15  # PG 15
pig ext install -y plphp -v 14  # PG 14
dnf
dnf install -y plphp_18       # PG 18
dnf install -y plphp_17       # PG 17
dnf install -y plphp_16       # PG 16
dnf install -y plphp_15       # PG 15
dnf install -y plphp_14       # PG 14
apt
apt install -y postgresql-18-plphp   # PG 18
apt install -y postgresql-17-plphp   # PG 17
apt install -y postgresql-16-plphp   # PG 16
apt install -y postgresql-15-plphp   # PG 15
apt install -y postgresql-14-plphp   # PG 14

创建扩展:

CREATE EXTENSION plphp;

用法

来源:

plphp 把 PHP 作为非可信 PostgreSQL 过程语言嵌入,用于函数、过程、触发器、事件触发器与匿名块。只有在确实需要 PHP API、并能接受代码以 PostgreSQL 服务器操作系统权限运行时才应使用;它不是沙箱语言。

核心流程

CREATE EXTENSION plphp;

CREATE FUNCTION php_square(integer)
RETURNS integer
LANGUAGE plphp
AS $$
    return $args[0] * $args[0];
$$;

SELECT php_square(12);

PL/php 2.6 支持使用非 ZTS embed SAPI 的 PHP 8.1 至 8.4,以及 PostgreSQL 11 至 18。由于该语言明确属于非可信语言,安装与创建都需要超级用户。

主要接口

  • spi_exec(...)、spi_prepare(...)、spi_exec_prepared(...)、spi_query(...) 与游标辅助函数通过 SPI 访问 PostgreSQL。
  • return_next() 从集合返回函数输出行。
  • spi_commit() 与 spi_rollback() 在过程中提供事务控制。
  • subtransaction(...) 创建可捕获的子事务边界。
  • $_TD 暴露触发器与事件触发器上下文。
  • $_SHARED 是会话全局存储,$_SD 是每个函数私有的会话存储。
  • plphp.on_init、plphp.start_proc 与 plphp_modules 用于初始化会话解释器。

可选的 jsonb_plphp、hstore_plphp 与 bytea_plphp 扩展提供原生转换。函数必须声明 TRANSFORM FOR TYPE ... 才会使用转换;安装配套扩展不会自动改变所有 PL/php 函数。

安全与运维

PL/php 函数可以读写文件、打开网络连接、调用 PHP 能力,并影响 PostgreSQL 操作系统账户可访问的一切。函数所有权与创建权只能授予等同服务器管理员信任级别的角色。若不得不使用高权限包装器,应按常规加固 SECURITY DEFINER 与 search_path。

SPI 查询文本、动态标识符、会话初始化代码、加载模块与持久解释器状态都需要审查。长时间运行的 PHP 代码会阻塞 PostgreSQL 后端,$_SHARED 或 $_SD 中保留的内存会持续到会话结束。对不可信值应使用预备语句,限制资源用量,测试取消与错误路径,并在应用代码保留过多状态时回收会话。

2.6 新增每函数 $_SD 与二进制安全的 bytea_plphp 转换。PostgreSQL 记录的控制版本是 2.6,源码发行包版本是 2.6.0。

这个页面对您有帮助吗?