ext-php-rs 是一个用于构建PHP扩展的RUST库,比起其他的php的绑定库,该库使用起来 更加的方便和快捷。
官方宣称的特性为:
- 易于使用,内置的宏抽象了 zend API,特别是参数类型交互
- 轻量级,该库会自动编写胶水代码,只需要写功能即可。
- 可扩展,可以使用
IntoZval
和FromZval
定义自己的类型用于参数和返回类型。
迄今为止, 使用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
- 创建项目
cargo new extphpdmeo --lib
- 配置
追加到 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"
- 写 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
}
- 编译测试
# 编译
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工程学的库。