在大公司,通常和我的编程语言有很多合作。比如Java作为微服务层,C++做底层计算,PHP做中间层,最后用JS展示效果。这些语言之间的协作大多是通过RPC来完成的,或者是将数据直接存入数据库,然后用不同的语言进行访问。那么,我们的PHP代码是否可以直接调用这些语言呢?其实PHP确实为我们准备了一个可以直接调用C语言的扩展库,而且PHP默认已经内置了这个扩展库,就是FFI扩展。什么是FFIFFI,ForeignFunctionInterface,国外函数接口。这个扩展允许我们加载一些公共库(.dll,.so),实际上它可以调用一些C数据结构和函数。已经是随PHP源码发布的扩展,编译时加上--with-ffi即可直接编译到PHP程序中。我们这里已经编译好了PHP,所以直接找到这个扩展,按照简单的扩展安装步骤就可以完成安装。cdphp-7.4.4/ext/ffi/phpize./configuremake&&makeinstall安装完成后记得打开php.ini文件中的扩展。关于此扩展需要注意的一件事是它有一个名为ffi.enable的配置项。默认情况下,该配置项的值为"preload",仅在CLISAPI环境下启用FFI。当然,我们也可以修改为“true”或“false”来开启和关闭它。将其设置为“true”将在任何环境中启用此扩展。使用FFI调用C函数接下来我们简单看一下它是如何调用C函数的。//创建一个FFI对象,加载libc并导入printf函数$ffi_printf=FFI::cdef("intprintf(constchar*format,...);",//C定义规则"libc.so.6");//指定libc库//调用Cprintf函数$ffi_printf->printf("Hello%s!\n","world");//HelloWorld//加载数学并导入pow函数$ffi_pow=FFI::cdef("doublepow(doublex,doubley);","libboost_math_c99.so.1.66.0");//的pow函数这里调用的是C,不是PHP自带的echo$ffi_pow->pow(2,3),PHP_EOL;//8我们创建了两个对象,分别调用了C的printf()和pow()函数。FFI::cdef()用于创建一个FFI对象,它接收两个参数,一个是包含一系列通用C语言(类型、结构、函数、变量等)声明的字符串。事实上,这个字符串可以从C头文件中复制粘贴。另一个参数是要加载和定义链接的共享库文件的名称。即我们需要的.dll或.so文件,对应我们的语句字符串,比如libc.so.6中没有pow()等计算函数,所以我们需要找到数学相关的C语言计算函数库。定义变量和数组当然FFI也可以定义变量和数组。//创建一个int变量$x=FFI::new("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"powvalue:",$ffi_pow->pow($x->cdata,3),PHP_EOL;//powvalue:343$ffi_printf->printf("IntPowvalueis:%f\n",$ffi_pow->pow($x->cdata,3));//IntPowvalueis:343.000000//创建数组$a=FFI::new("long[1024]");//给数组赋值for($i=0;$i
