ext-php-rs 是一个用于构建PHP扩展的RUST库,比起其他的php的绑定库,该库使用起来 更加的方便和快捷。

官方宣称的特性为:

  • 易于使用,内置的宏抽象了 zend API,特别是参数类型交互
  • 轻量级,该库会自动编写胶水代码,只需要写功能即可。
  • 可扩展,可以使用 IntoZvalFromZval 定义自己的类型用于参数和返回类型。

迄今为止, 使用rust写php扩展,并没有太好的方式与php进行交互,建议使用rust写 基础类库。

cargo-php 命令工具

ext-php-rs 提供了 cargo-php 工具, 它提供了功能

  • 生成扩展的 Stubs 文件, 为 IDE 进行支持。(参考 phpstorm-stubs)
  • 安装扩展
  • 移除扩展

现仅支持 macos, linux 暂时不支持 windows

使用 cargo 安装

cargo install cargo-php

hello world

  1. 创建项目
cargo new extphpdmeo --lib
  1. 配置

追加到 Cargo.toml

# 引入扩展
[dependencies]
ext-php-rs = "*"

# 输出类型
[lib]
crate-type = ["cdylib"]

修改编译选项,在项目的根目录创建 .cargo/config.toml

[target.'cfg(not(target_os = "windows"))']
rustflags = ["-C", "link-arg=-Wl,-undefined,dynamic_lookup"]

[target.x86_64-pc-windows-msvc]
linker = "rust-lld"

[target.i686-pc-windows-msvc]
linker = "rust-lld"
  1. 写 hello_world, 修改 lib.rs
#![cfg_attr(windows, feature(abi_vectorcall))]
use ext_php_rs::prelude::*;

#[php_function]
pub fn hello_world(name: &str) -> String {
    format!("hello -> {}", name)
}

#[php_module]
pub fn get_module(module: ModuleBuilder) -> ModuleBuilder {
    module
}
  1. 编译测试
# 编译
cargo build 

# 安装扩展
cargo php install

# 创建 stubs
cargo php stubs 

生成的 stubs文件后, 最好自己使用 composer 创建stubs项目进行组织,以备给需要扩展的项目使用, 可以参考 phalcon/ide-stubs

使用 php-config 获取扩展安装的位置

# 获取扩展位置
php-config --extension-dir

# 检查php_info,扩展是否存在
php -i | grep "extphp" 

创建临时的测试文件 test.php

<?php
var_dump(hello_world("go"));

执行测试

php -e test.php

结果应该为

string(11) "hello -> go

结语

总而言之 ext-php-rs 扩展对于使用rust构建php扩展是目前来说比较符合rust工程学的库。