/usr/phper
php ext_skel.php --ext 扩展名称
phpize
./configure --with-php-config=/www/server/php/74/bin/php-config
make
phpize
./configure --with-php-config=/www/server/php/74/bin/php-config
make
extension = hello.so
php -m
php index.php
#![crate_type = "staticlib"]
extern crate libc;
//使用C类型约束
use std::ffi::{CStr, CString};
use libc::{c_char, c_int};
//add_int【参数:两个c语言的int类型】:对两个int类型数值进行相加
#[no_mangle]
pub extern "C" fn add_int(x:c_int, y:c_int) -> c_int{
//两个数相加
return x + y;
}
//base64_decode函数【参数:c语言的*char类型】:对字符串进行base64解码
#[no_mangle]
pub extern "C" fn base64_decode(s:*const c_char) -> *mut c_char {
//c char类型转&str
let h = unsafe{CStr::from_ptr(s).to_str().unwrap()};
//base64 解码
let s = base64::decode(h.to_string());
if let Err(_s) = s {
panic!("类型错误!");
}
let n = String::from_utf8(s.unwrap().clone()).unwrap();
//String 转 C CString
let a = CString::new(n.as_str()).unwrap();
//C CString 转 C char
//这里实属无奈,因为rust ffi中阐述,对字符串返回只能是该字符串地址,所以需要该方法进行返回C才能接收到!
let r = a.into_raw();
return r;
}
[package]
name = "hello"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
name = "hello"
crate-type = ["staticlib"]
[dependencies]
libc = "*"
base64 = "0.12.1"
rustup target add x86_64-unknown-linux-musl
cargo build --target x86_64-unknown-linux-musl --release
rustup target add i686-unknown-linux-musl
cargo build --target i686-unknown-linux-musl --release
language = "C"
cargo install --force cbindgen
cbindgen --config cbindgen.toml --crate 项目名称 --output 头文件名称.h
PHP_ADD_LIBRARY_WITH_PATH(hello, /usr/phper/php-7.4.30/ext/hello/lib, HELLO_SHARED_LIBADD)
PHP_SUBST(HELLO_SHARED_LIBADD)
/* hello extension for PHP */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "php.h"
#include "ext/standard/info.h"
#include "php_hello.h"
#include "hello.h"//引入头文件
/* For compatibility with older PHP versions */
#ifndef ZEND_PARSE_PARAMETERS_NONE
#define ZEND_PARSE_PARAMETERS_NONE() \
ZEND_PARSE_PARAMETERS_START(0, 0) \
ZEND_PARSE_PARAMETERS_END()
#endif
/* {{{ void hello_test1()
*/
PHP_FUNCTION(hello_test1)
{
ZEND_PARSE_PARAMETERS_NONE();
int num = add_int(1,2);//rust中两个数相加函数并返回。
php_printf("The extension %d is loaded and working!\r\n", num);
}
/* }}} */
/* {{{ string hello_test2( [ string $var ] )
*/
PHP_FUNCTION(hello_test2)
{
char *var = "World";
size_t var_len = sizeof("World") - 1;
zend_string *retval;
ZEND_PARSE_PARAMETERS_START(0, 1)
Z_PARAM_OPTIONAL
Z_PARAM_STRING(var, var_len)
ZEND_PARSE_PARAMETERS_END();
char *newstr = base64_decode(var);//rust中解析base64字符串并返回。
retval = strpprintf(0, "Hello %s", newstr);
RETURN_STR(retval);
}
/* }}}*/
/* {{{ PHP_RINIT_FUNCTION
*/
PHP_RINIT_FUNCTION(hello)
{
#if defined(ZTS) && defined(COMPILE_DL_HELLO)
ZEND_TSRMLS_CACHE_UPDATE();
#endif
return SUCCESS;
}
/* }}} */
/* {{{ PHP_MINFO_FUNCTION
*/
PHP_MINFO_FUNCTION(hello)
{
php_info_print_table_start();
php_info_print_table_header(2, "hello support", "enabled");
php_info_print_table_end();
}
/* }}} */
/* {{{ arginfo
*/
ZEND_BEGIN_ARG_INFO(arginfo_hello_test1, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_hello_test2, 0)
ZEND_ARG_INFO(0, str)
ZEND_END_ARG_INFO()
/* }}} */
/* {{{ hello_functions[]
*/
static const zend_function_entry hello_functions[] = {
PHP_FE(hello_test1, arginfo_hello_test1)
PHP_FE(hello_test2, arginfo_hello_test2)
PHP_FE_END
};
/* }}} */
/* {{{ hello_module_entry
*/
zend_module_entry hello_module_entry = {
STANDARD_MODULE_HEADER,
"hello", /* Extension name */
hello_functions, /* zend_function_entry */
NULL, /* PHP_MINIT - Module initialization */
NULL, /* PHP_MSHUTDOWN - Module shutdown */
PHP_RINIT(hello), /* PHP_RINIT - Request initialization */
NULL, /* PHP_RSHUTDOWN - Request shutdown */
PHP_MINFO(hello), /* PHP_MINFO - Module info */
PHP_HELLO_VERSION, /* Version */
STANDARD_MODULE_PROPERTIES
};
/* }}} */
#ifdef COMPILE_DL_HELLO
# ifdef ZTS
ZEND_TSRMLS_CACHE_DEFINE()
# endif
ZEND_GET_MODULE(hello)
#endif
phpize
./configure --with-php-config=/www/server/php/74/bin/php-config
make
--TEST--hello_test2() Basic test--SKIPIF--if (!extension_loaded('hello')) {echo 'skip';} --FILE-- hello_test1();var_dump(hello_test2('5LiA56CB6LaF5Lq6')); --EXPECT--string(11) "Hello World"string(9) "Hello PHP"
make test
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!