#php #php-extension

solder

一个用于使用 Rust 构建 PHP 扩展的库

7 个版本

0.1.6 2019年10月10日
0.1.5 2019年10月2日
0.1.3 2019年9月23日

#145FFI

每月 21 次下载

MIT 许可证

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