PHP-FFI 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
PHP-FFI 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
PHP-FFI 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
PHP-FFI 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
PHP-FFI 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !

软件简介

FFI PHP 扩展提供了一种调用本地函数,访问本地变量和创建/访问用 C 语言定义的数据结构的简单方法。 扩展的 API 非常简单,并通过以下示例及其输出来演示:

<?php
$libc = new FFI("
    int printf(const char *format, ...);
    char * getenv(const char *);
    unsigned int time(unsigned int *);

    typedef unsigned int time_t;
    typedef unsigned int suseconds_t;

    struct timeval {
        time_t      tv_sec;
        suseconds_t tv_usec;
    };

    struct timezone {
        int tz_minuteswest;
        int tz_dsttime;
    };

	int gettimeofday(struct timeval *tv, struct timezone *tz);    
", "libc.so.6");

$libc->printf("Hello World from %s!\n", "PHP");
var_dump($libc->getenv("PATH"));
var_dump($libc->time(null));

$tv = $libc->new("struct timeval");
$tz = $libc->new("struct timezone");
$libc->gettimeofday($tv, $tz);
var_dump($tv->tv_sec, $tv->tv_usec, $tz);
?>
Hello World from PHP!
string(135) "/usr/lib64/qt-3.3/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/home/dmitry/.local/bin:/home/dmitry/bin"
int(1523617815)
int(1523617815)
int(977765)
object(CData)#3 (2) {
  ["tz_minuteswest"]=>
  int(-180)
  ["tz_dsttime"]=>
  int(0)
}

FFI::__constructor() 有两个参数(都是可选的)。 第一个是 C 声明的集合,第二个是 DSO 库。 由第一个参数定义的所有变量和函数都绑定到 DSO 库中相应的本地符号,然后可以作为FFI对象方法和属性访问。 C 类型的参数,返回值和变量会自动转换为 PHP 类型(如果可能)。 否则,它们被封装在一个特殊的 CData 代理对象中,并可能被元素访问。

在某些情况下(例如,通过指针传递 C 结构),我们可能需要创建一个真正的 C 数据结构。 这可以使用 FFF::new() 方法。 它需要一个 C 类型定义,并且可以重用由 FFI::__constructor() 定义的 C 类型和标签。

也可以使用 FFI::new() 作为静态方法来创建任意 C 数据结构。

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (3)

加载中
emm 还行
2019/10/31 19:55
回复
举报
能用于哪些场景啊
2018/08/22 14:13
回复
举报
打分: 力荐
这个不错
2018/08/22 13:10
回复
举报
更多评论
发表于软件架构专区
2019/10/31 08:17

PHP 7.4 的 FFI 将支持更好地在 PHP 中使用 C 函数/数据结构

即将在下月底发布的 PHP 7.4 将会引入一个有趣的新功能,那就是期待已久的对 FFI(外部函数接口,Foreign Function Interface)的支持。此功能使得开发者可以在原生 PHP 代码中调用 C 定义的函数/变量/数据结构。 FFI 与预加载功能都将是 PHP 7.4 的重要新功能,FFI 还增强了 PHP FPM systemd 服务、用于 OpenSSL 流的 TLS 1.3 以及许多其他更改。PHP 7.4 的 FFI 甚至可与其他语言的 FFI 实现相媲美。 使用 PHP FFI 应该可以减少...

39
7
发表于大前端专区
2018/04/21 08:04

PHP FFI 允许在 PHP 脚本中嵌入原始 C 代码

Zend 的 Dmitry Stogov 通过允许 PHP 执行嵌入式 C 代码扩展了 PHP 的领域。 这将允许完全访问本地 C 函数,变量以及数据结构。 解决方案 PHP FFI 作为实验性扩展提供,但要求 PHP 7.3 的开发版本。 该解决方案还不能用于生产,但它构建在坚实的基础之上,使用 FFI(外部函数接口)库 libffi,允许高级语言生成代码。 输入: <?php$libc = new FFI("     int printf(const char *format, ...);     char * g...

13
12
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
2019/03/03 13:44

PHP 7.4 前瞻:FFI 新特性

FFI扩展已经通过RFC,正式成为PHP 7.4核心扩展。 什么是FFI FFI(Foreign Function Interface),即外部函数接口,是指在一种语言里调用另一种语言代码的技术。PHP的FFI扩展就是一个让你在PHP里调用C代码的技术。 FFI的使用非常简单,只用声明和调用两步就可以,对于有C语言经验,但是不了解Zend引擎的程序员来说,这简直是打开了新世界的大门,可以快速地使用C类库进行原型试验。 (此处有图:溜了溜了,要懂C的……) 下面通过...

0
0
发表了博客
2020/03/19 20:01

PHP FFI详解 - 一种全新的PHP扩展方式

https://www.laruence.com/2020/03/11/5475.html 本文地址: https://www.laruence.com/2020/03/11/5475.html 转载请注明出处 随着PHP7.4而来的有一个我认为非常有用的一个扩展:PHP FFI(Foreign Function interface), 引用一段PHP FFI RFC中的一段描述: For PHP, FFI opens a way to write PHP extensions and bindings to C libraries in pure PHP. 是的,FFI提供了高级语言直接的互相调用,而对于PHP来说,FFI让我们可以方便的...

0
0
2020/06/18 18:02

让PHP能够调用C的函数-FFI扩展

让PHP能够调用C的函数-FFI扩展 在大型公司中,一般会有很多编程语言的配合。比如说让 Java 来做微服务层,用 C++ 来进行底层运算,用 PHP 来做中间层,最后使用 JS 展现效果。这些语言间的配合大部分都是通过 RPC 来完成,或者直接将数据入库再使用不同的语言来取用。那么,我们 PHP 的代码能否直接调用这些语言呢?其实,PHP 还真为我们准备了一个可以直接调用 C 语言的扩展库,并且这个扩展库还是已经默认内置在 PHP 中了,它...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
3 评论
6 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部