iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >如何在PHP中使用FFI扩展调用C函数
  • 333
分享到

如何在PHP中使用FFI扩展调用C函数

2023-06-15 11:06:04 333人浏览 八月长安
摘要

今天就跟大家聊聊有关如何在PHP中使用FFI扩展调用C函数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是 FFIFFI , Foreign Function Interface

今天就跟大家聊聊有关如何在PHP中使用FFI扩展调用C函数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

什么是 FFI

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

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

cd php-7.4.4/ext/ffi/phpize./configuremake && make install

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

使用 FFI 调用 C 的函数

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

// 创建一个 FFI 对象,加载 libc 并且导入 printf 函数$ffi_printf = FFI::cdef(    "int printf(const char *fORMat, ...);", // C 的定义规则    "libc.so.6"); // 指定 libc 库// 调用 C 的 printf 函数$ffi_printf->printf("Hello %s!\n", "world"); // Hello World// 加载 math 并且导入 pow 函数$ffi_pow = FFI::cdef(    "double pow(double x, double y);",     "libboost_math_c99.so.1.66.0");// 这里调用的是 C 的 pow 函数,不是 PHP 自己的echo $ffi_pow->pow(2,3), PHP_EOL; // 8

我们创建了两个对象,分别调用了 C 的 printf() 和 pow() 函数。FFI::cdef() 是用于创建一个 FFI 对象,它接收两个参数,一个是包含常规C语言(类型、结构、函数、变量等)声明序列的字符串。实际上,这个字符串可以从C头文件复制粘贴。而另一个参数则是要加载并定义链接的共享库文件的名称。也就是我们需要的 .dll 或 .so 文件,它与我们声明字符串是对应的,比如在 libc.so.6 中并没有 pow() 这类的计算函数,所以我们就要找到 math 相关的 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 "pow value:", $ffi_pow->pow($x->cdata, 3), PHP_EOL;// pow value:343$ffi_printf->printf("Int Pow value is : %f\n", $ffi_pow->pow($x->cdata, 3));// Int Pow value is : 343.000000// 创建一个数组$a = FFI::new("long[1024]");// 为数组赋值for ($i = 0; $i < count($a); $i++) {    $a[$i] = $i;}var_dump($a[25]); // int(25)$sum = 0;foreach ($a as $n) {    $sum += $n;}var_dump($sum); // int(523776)var_dump(count($a)); // int(1024) 数组长度var_dump(FFI::sizeof($a)); // int(8192),内存大小

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

看完上述内容,你们对如何在PHP中使用FFI扩展调用C函数有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网PHP编程频道,感谢大家的支持。

--结束END--

本文标题: 如何在PHP中使用FFI扩展调用C函数

本文链接: https://www.lsjlt.com/news/279777.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在PHP中使用FFI扩展调用C函数
    今天就跟大家聊聊有关如何在PHP中使用FFI扩展调用C函数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是 FFIFFI , Foreign Function Interface...
    99+
    2023-06-15
  • 如何使用 PHP 函数扩展?
    通过编写 php 扩展模块,可以添加新函数或修改现有函数,实现自定义需求。具体步骤包括:创建 php 源代码文件;使用 phpize 初始化扩展;运行 configure 脚本生成 ma...
    99+
    2024-04-16
    函数 php扩展
  • 如何使用 PHP 扩展函数?
    php 扩展函数是核心组件之外的附加功能,可扩展 php 的功能。安装扩展函数后,在 php.ini 中启用它们,然后使用扩展函数,例如 imagick 扩展用于处理图像。您可以使用命令...
    99+
    2024-04-16
    php 扩展函数 composer
  • 如何使用 PHP 函数扩展?
    通过编写 php 扩展模块,可以添加新函数或修改现有函数,实现自定义需求。具体步骤包括:创建 php 源代码文件;使用 phpize 初始化扩展;运行 configure 脚本生成 ma...
    99+
    2024-04-16
    函数 php扩展
  • PHP中如何使用 function函数扩展
    这篇文章将为大家详细讲解有关PHP中如何使用 function函数扩展,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。PHP function函数扩展的代码示例:< php &...
    99+
    2023-06-17
  • 如何使用 Mockery 扩展 PHP 函数?
    使用 mockery 来扩展 php 函数,通过以下步骤模拟函数的行为:安装 mockery 库。使用 mockery::mock('alias:函数名称') 创建模拟函数,其中 ali...
    99+
    2024-04-11
    php函数 mockery composer
  • 如何使用 Hamcrest 扩展 PHP 函数?
    是的,通过使用 hamcrest 可以扩展 php 函数以增强测试可读性:使用 extend() 方法扩展函数,将函数名和 hamcrest 匹配器作为参数。对于泛型函数,指定类型提示。...
    99+
    2024-04-11
    php hamcrest composer
  • 如何使用 Prophecy 扩展 PHP 函数?
    使用 prophecy 扩展 php 函数可通过以下步骤实现:使用 composer 安装 prophecy。使用 prophesize() 方法创建桩对象。使用 will() 方法配置...
    99+
    2024-04-11
    php prophecy composer
  • 如何使用 RespectPHP 扩展 PHP 函数?
    respectphp 扩展 php 的验证功能,让开发者轻松验证数据类型。它提供了广泛的验证规则,支持链接形成复杂、可读的验证链。常见的用途包括表单验证,其中 respectphp 与 ...
    99+
    2024-04-11
    php函数 composer
  • 如何使用 SinonPHP 扩展 PHP 函数?
    sinonphp 允许扩展或覆盖 php 函数和方法,用于单元测试或定制代码行为。它提供了以下主要功能:扩展函数:使用 sinonphp\stub 函数扩展已有的 php 函数。扩展方法...
    99+
    2024-04-11
    php sinonphp composer 作用域
  • 如何在PHP中调用C函数
    如何在PHP中调用C函数?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是 FFIFFI , Foreign Function Interface,外部函数接口。这个扩展...
    99+
    2023-06-15
  • 如何在 PHP 中扩展内置函数
    通过php扩展机制,我们可以自定义内置函数。只需创建一个包含扩展函数代码的扩展文件(如myext.c),编译它(phpize、configure、make),并安装它(make inst...
    99+
    2024-04-26
    php 扩展内置函数
  • PHP 函数如何扩展?
    php 提供了一种函数扩展机制,允许开发人员创建自定义函数。具体步骤包括:使用 function 关键字创建自定义函数。使用 function_exists() 检查函数是否存在,若不存...
    99+
    2024-04-18
    php 扩展
  • 如何使用 trait 扩展自定义 PHP 函数?
    如何使用 trait 扩展自定义 php 函数?定义一个包含扩展方法的 trait。使用 use 关键字将 trait 包含到自定义函数中。在自定义函数中通过 $this 访问 trai...
    99+
    2024-04-23
    php trait
  • 如何在 PHP 中使用回调函数?
    回调函数,作为 php 中的强大工具,允许将函数作为参数传递给其他函数,旨在实现代码重用和可扩展性,具体涉及:创建回调函数:使用匿名函数或函数名;使用回调函数:作为参数传递给其他函数;实...
    99+
    2024-04-16
    php 回调函数
  • 如何使用 CLion 开发调试 PHP 扩展
    本文主要介绍如何使用 IDE Clion 来开发调试PHP扩展。 一、 创建PHP扩展 php 扩展的创建这里就不再赘述,使用ext_skel 生成一个框架,然后编辑相应的文件,编译安装,最后...
    99+
    2024-02-27
  • 如何使用 C++ 函数对象扩展 STL 算法?
    可以通过使用函数对象来扩展 stl 算法,函数对象是具有调用运算符 (operator()) 的类或结构。只需要将函数对象作为算法的参数传递即可,例如使用 std::sort 算法排序容...
    99+
    2024-04-25
    stl 函数对象 c++
  • PHP中DirectIO扩展如何使用
    本篇文章给大家分享的是有关PHP中DirectIO扩展如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。什么是Direct IODirect IO 其实是 Linux 操作...
    99+
    2023-06-20
  • 如何在PHP中调用函数
    在PHP编程中,函数是非常重要的组件之一。函数是一段可被多次调用的代码块,能够执行特定的任务。除了提高代码的可重用性和可维护性,使用函数还可以简化代码,提高开发效率。本文将介绍如何在PHP中调用函数。内置函数PHP语言内置了许多常用的函数,...
    99+
    2023-05-18
    PHP编程 PHP函数 函数调用
  • 如何在 PHP 中使用函数作为回调?
    在 php 中使用函数作为回调,可以使用匿名函数或命名函数。匿名函数语法为:$callback = function ($argument) { return $result; }。命名...
    99+
    2024-04-10
    php 回调函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作