锈扩展怎么在PHP项目中使用

  介绍

本篇文章给大家分享的是有关锈扩展怎么在PHP项目中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

<强>,C或PHP中生锈的

我的基本出发点就是写一些可以编译的铁锈代码到一个库里面,并写为它一些C的头文件,在C中为被调用的PHP做一个拓展。虽然并不是很简单,但是很有趣。
锈FFI(外国函数接口)

我所做的第一件事情就是摆弄生锈与C连接的生锈的外部函数接口。我曾用简单的方法(hello_from_rust)写过一个灵活的库,伴有单一的声明(C字符指针,否则称为一个字符串),如下是输入后输出的“你好锈”。
,

//, hello_from_rust.rs=# ! [crate_type “staticlib"】   ,   # ![特性(libc)]   extern  crate  libc;   ffi use  std::::装运箱;   ,   # (no_mangle)   pub  extern “C", fn  hello_from_rust(名称:* const  libc:: c_char), {   ,let  buf_name =, unsafe {,装运箱:from_ptr(名字).to_bytes (),};   ,let  str_name =,字符串:from_utf8 (buf_name.to_vec ()) .unwrap ();   ,let  c_name =,格式! (“Hello 得到生锈,,{},,,str_name);   ,println ! (“{}”,, c_name);   }

我从C(或其它!)中调用生锈的库拆分它。这有一个接下来会怎样的很好的解释。

编译它会得到。的一个文件,libhello_from_rust.a。这是一个静态的库,包含它自己所有的依赖关系,而且我们在编译一个C程序的时候链接它,这让我们能做后续的事情。注意:在我们编译后会得到如下输出:
,

注意:,link  against 从而following  native  artifacts  when  linking  against 却;能够static 图书馆   注意:,,order 以及any  duplication 还要be  significant 提醒some 平台,以及so  may  need 用be 保留   注意:,图书馆:Systemnote:,图书馆:pthread   注意:图书馆:,c   注意:,图书馆:m

这就是铁锈编译器在我们不使用这个依赖的时候所告诉我们需要链接什么。

<强>从C中调用锈

既然我们有了一个库,不得不做两件事来保证它从C中可调用。首先,我们需要为它创建一个C的头文件,hello_from_rust.h。然后在我们编译的时候链接到它。

下面是头文件:
,

//, hello_from_rust.h   # ifndef  __HELLO   # define  __HELLO   ,   void  hello_from_rust (const  char  *名称);   ,   # endif

这是一个相当基础的头文件,仅仅为了一个简单的函数提供签名/定义。接着我们需要写一个C程序并使用它。
,

//,安全   # include  & lt; stdio.h>   # include  & lt; stdlib.h>   # include “hello_from_rust.h"   ,   命令行参数个数,int 主要(int  char  * argv []), {   ,hello_from_rust(“贾里德!“);   }

我们通过运行一下代码来编译它:
,

gcc  -Wall  -o  hello_c  hello.c  -L /用户/jmcfarland/代码/生锈/php-hello-rust  -lhello_from_rust  -lSystem  -lpthread  -lc  - lm

注意在末尾的-lSystem -lpthread lc - lm告诉gcc不要链接那些“本地的古董”,为了当编译我们的铁锈库时生锈编译器可以提供出来。

经运行下面的代码我们可以得到一个二进制的文件:
,

,美元。/hello_c   Hello 得到锈蚀、,杰瑞德!

漂亮!我们刚才从C中调用了铁锈库。现在我们需要理解锈库是如何进入一个PHP扩展的。


<强>从PHP中调用C

该部分花了我一些时间来弄明白,在这个世界上,该文档在PHP扩展中并不是最好的。最好的部分是来自绑定一个脚本ext_skel的PHP源(大多数代表“扩展骨架”)即生成大多数你需要的样板代码只你可以通过下载来开始,和未配额的php源,把代码写进php目录并且运行:

,美元cd  ext/,美元。/ext_skel ——extname=hello_from_rust

,这将生成需要创建php扩展的基本骨架。现在,移动你处处想局部地保持你的扩展的文件夹。并且移动你的

<李>

,,,李.rust源

<李>

,,,李.rust库

<李>

,,,李c头

进入同一个目录。因此,现在你应该看看像这样的一个目录:

,。   ├──,学分   ├──实验   ├──config.m4   ├──config.w32   ├──hello_from_rust.c   ├──hello_from_rust.h   ├──hello_from_rust.php   ├──hello_from_rust.rs   ├──libhello_from_rust.a   ├──php_hello_from_rust.h   └──,测试   001年,└──,。phpt

锈扩展怎么在PHP项目中使用