PHP中怎么调用FFI扩展

  介绍

这篇文章将为大家详细讲解有关PHP中怎么调用FFI扩展,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

<节>

什么是FFI

FFI,外国函数接口,外部函数接口。这个扩展允许我们加载一些公共库(. dll。),其实也就是可以调用一些C的数据结构及函数。它已经是随PHP源码发布的一个扩展了,在编译的时候可以加上——with-ffi来直接编译到PHP程序中。

我们这里已经是编译好的PHP,所以我们直接找到这个扩展,进行简单的扩展安装步骤就可以安装完成。

 <代码> cd  php-7.4.4/ext/ffi/phpize 

./configure
make ,,, make 安装
  ,

安装完成后记得在php。ini文件中打开扩展。关于这个扩展需要注意的一点是,它有一个配置项为ffi。启用,默认情况下这个配置项的值是“preload",仅在CLI SAPI环境下启用FFI的能力。当然,我们也可以修改为“true"或“false"来开启和关闭它。设定为“true"将使得这个扩展在任何环境下都启用。

,

使用FFI调用C的函数

接下来,简单地看一下它是如何调用C的函数的。

 <代码>//,创建一个,FFI 对象,加载,libc 并且导入,printf 函数
ffi_printf 美元;=,FFI: cdef (
,,,,“int  printf (const  char  *格式,,…),,,,//,C 的定义规则
,,,,“libc.so.6");,//,指定,libc 库
//,调用,C 的,printf 函数
ffi_printf→美元printf (“Hello  % s ! \ n",,“world");,//, Hello 世界

//,加载,math 并且导入,pow 函数
ffi_pow 美元;=,FFI: cdef (
,,,,“double 战俘(double  x,, double  y);“,,
,,,,“libboost_math_c99.so.1.66.0");
//,这里调用的是,C 的,pow 函数,不是,PHP 自己的
echo 美元ffi_pow→战俘(2、3),PHP_EOL;,//, 8
  ,

我们创建了两个对象,分别调用了C的printf()和战俘()函数.FFI:: cdef()是用于创建一个FFI对象,它接收两个参数,一个是包含常规C语言(类型,结构,函数,变量等)声明序列的字符串。实际上,这个字符串可以从C头文件复制粘贴。而另一个参数则是要加载并定义链接的共享库文件的名称。也就是我们需要的. dll或所以文件,它与我们声明字符串是对应的,比如在libc.so。6中并没有战俘()这类的计算函数,所以我们就要找到数学相关的C语言计算函数库。

,

定义变量和数组

当然,FFI也是可以定义变量和数组的。

 <代码>//,创建一个,int 变量
x 美元;=,FFI::新(“int");
var_dump ($ x→cdata);,//, int (0)

//,为变量赋值
$ x→cdata =, 5。
var_dump ($ x→cdata);,//, int (5)

//,计算变量
$ x→cdata  +=, 2,
var_dump ($ x→cdata);,//, int (7)


//,结合上面的两个,FFI 对象操作

echo “pow 价值:“,,美元ffi_pow→战俘($ x→cdata, 3),, PHP_EOL;
//, pow 价值:
343 ffi_printf→printf (“int  pow  value  is :, % f \ n",,美元ffi_pow→战俘($ x→cdata, 3));
//, int  pow  value  is :, 343.000000


//,创建一个数组
a 美元;=,FFI::新(“长[1024]“);
//,为数组赋值
for ($小姐:=,0;,美元小姐:& lt;, count($);,我+ +美元),{
,,,,一个美元($ i),=,我美元;
}
var_dump ($ [25]);,//, int (25)

sum 美元;=,0;
foreach  (a 美元;as  $ n), {
,,,, sum 美元;+=,$ n;
}
var_dump ($ sum);,//, int (523776)

var_dump (count ($)),,//, int(1024),数组长度
var_dump (FFI: sizeof(美元)),,//,int(8192),内存大小
  ,

使用FFI::新()函数来创建一个C的数据结构,也就是变量声明,这些变量的内容将保存在cdata属性中。而数组则直接就可以操作这个函数的返回值。当然,当我们要结束使用的时候,还是需要使用FFI::自由()来释放变量的,就和C语言的开发一样。


关于PHP中怎么调用FFI扩展就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。

PHP中怎么调用FFI扩展