7 个版本
0.1.6 | 2019年10月10日 |
---|---|
0.1.5 | 2019年10月2日 |
0.1.3 | 2019年9月23日 |
#145 在 FFI
每月 21 次下载
34KB
800 行
将 Rust 焊接到 PHP 中
这个库旨在帮助您通过 Rust 编写的扩展来改进您的 PHP 应用程序。它最初是从 php-rs
分支出来的。
想法是能够纯 Rust 编写代码,使用 cargo 编译,然后直接将库加载到 PHP 中。
请注意,这是该 crate 的第一个版本,很多东西都会改变。此外,我必须强调,这个 crate 目前非常不稳定。请谨慎使用。
示例
extern crate libc;
extern crate solder;
use solder::*;
use solder::zend::*;
use solder::info::*;
#[no_mangle]
pub extern fn php_module_info() {
print_table_start();
print_table_row("A demo PHP extension written in Rust", "enabled");
print_table_end();
}
#[no_mangle]
pub extern fn get_module() -> *mut zend::Module {
let function = FunctionBuilder::new(c_str!("hello_world"), hello_world)
.with_arg(ArgInfo::new(c_str!("name"), 0, 0, 0))
.build();
ModuleBuilder::new(c_str!("hello_world"), c_str!("0.1.0-dev"))
.with_info_function(php_module_info)
.with_function(function)
.build()
.into_raw()
}
#[no_mangle]
pub extern fn hello_world(_data: &ExecuteData, retval: &mut Zval) {
let mut name_zval = Zval::new_as_null();
php_parse_parameters!(&mut name_zval);
let name = String::try_from(name_zval).ok().unwrap();
let hello = format!("Hello {}", name);
php_return!(retval, hello);
}
要编译它,我们需要将以下内容添加到我们的 .cargo/config
[build]
rustflags = ["-C", "link-arg=-Wl,-undefined,dynamic_lookup"]
然后,使用 cargo build
编译扩展,并将其复制到您的 PHP 模块目录中,修改您的 php.ini
以加载它。
$ cargo build --release && php -dextension=$(pwd)/target/debug/libhelloworld.so -a
Compiling solder v0.1.0 (/src)
Compiling helloworld v0.1.0 (/src/examples/helloworld)
Finished dev [unoptimized + debuginfo] target(s) in 5.93s
Interactive shell
php > var_dump(hello_world("Bruno"));
string(11) "Hello Bruno"
php >
PHP 版本
目前,这个 crate 只适用于 PHP7。在构建过程中,它会尝试从已安装的 PHP 中获取 PHP API 版本和 PHP 扩展构建版本。但是,您可以通过手动设置 PHP_API_VERSION 和 PHP_EXTENSION_BUILD 环境变量来编译其他版本。
如果您对这个项目有任何问题或想法,请随时联系我。
依赖项
~43KB