当前位置: 首页 > 软件库 > 程序开发 > 常用工具包 >

PHP-FFI

PHP 外部函数接口
授权协议 未知
开发语言 C/C++ PHP
所属分类 程序开发、 常用工具包
软件类型 开源软件
地区 不详
投 递 者 汪胡非
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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 数据结构。

  • FFI PHP extension (Foreign Function Interface) This extension has been merged into php main source tree. The latest version is available as part of PHP sourcses at php.net or at github mirror ! FFI PH

  • php-ffi-rust 本项目目标就是采用Rust编写扩展库,提供给PHP7.4的FFI扩展,看看是否能够抢救一下PHP。 拓展 测试环境 macOS:10.13.6 PHP:7.4.0beta1 Rust:1.36.0 为macOS编译PHP 由于MacOS下没有找到合适的PHP7.4版本,所以只能自己动手编译。 下载 从PHP的Github Release页面下载PHP7.4.0beta1版

  • FFI(Foreign Function Interface)是这样一种机制:用一种编程语言写的程序能调用另一种编程语言写的函数(routines)。 FFI 有两种内涵。一种是是在当前正在使用的语言(host)中,调用由其它语言(guest)提供的库。第二种内涵与第一种方向相反,即,使用当前语言(host)写库,供其它语言(guest)调用。不过,后者不是任何语言都能做到的,有些语言即使能做,也

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

  • 随着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提供了高级语言直接的互相调用,而对

  • 随着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提供了高级语言直接的互相调用,而对于P

  • 随着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提供了高级语言直接的互相调用,而对

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

  • 设置 PHP版本大于7.4 开启FFI扩展ext/ffi PHP-FFI要求libffi-3 使用未提供头文件的库 编辑C语言测试库源码 //File: libtest.c int fnadd(int a,int b){ return a+b; } int fnsub(int a,int b){ return a-b; } 编译库 $ gcc -shared -

 相关资料
  • 介绍 本教程会使用snappy压缩/解压缩库来作为一个 Rust 编写外部语言代码绑定的介绍。目前 Rust 还不能直接调用 C++ 库,不过 snappy 库包含一个 C 接口(记录在snappy-c.h中)。 一个关于 libc 的说明 很多这些例子使用libc crate,它提供了很多 C 类型的类型定义,还有很多其他东西。如果你正在自己尝试这些例子,你会需要在你的Cargo.toml中添加

  • 问题内容: function parts($part) { $structure = ‘http://’ . $site_url . ‘content/’; echo($tructure . $part . ‘.php’); } 该函数使用在页面顶部定义的变量,但是此变量未传递到该函数中。 我们如何使它返回到函数中? 问题答案: 添加第二个参数 您需要将其他参数传递给函数: 如果关闭 如果您希望使

  • 我刚刚开始学习React和JavaScript。在我阅读了留档和教程之后,我看了一下示例项目,并试图整理我还没有得到的内容。 然后我看到有一些函数是在函数内部定义的,还有一些函数是在函数外部定义的。 例如,在之外: 和内部render()。。。 为什么它们看起来如此不同,为什么你想在内部和外部有一些函数? 编辑: 之外的函数的另一个示例: EDIT2:在另一个线程中,有人回答说,如果函数背后的逻辑

  • Rust 提供了外部语言函数接口(Foreign Function Interface,FFI)到 C 语言库。外部语言函数必须声明在一个 extern 代码块,且该代码块要带有一个包含外部语言库名称的 #[link] 属性。 use std::fmt; // 此外部代码块链接到 libm 库 #[link(name = "m")] extern { // 这是外部语言函数 //

  • 所以我有这个函数,它获取Laravel项目所在的剩余内存。问题是有两个控制器需要检查剩余的内存。 这是它看起来像它就在我的控制器 所以我想把这个函数放在一个外部PHP中,以便在需要时调用它。有什么办法吗?非常感谢!

  • 问题内容: 我在此线程上给出了答案,并讨论了matplotlib上的衰落点。我对ImportanceOfBeingErnest的答案感到好奇。因此,我尝试使用他的代码。 首先,这是我的代码。 然后,我注意到了一件奇怪的事。至少对于我来说。注意和(在代码末尾)。位置1放置在函数之后,另一个放置 在 代码 后 ,因为函数在位置1之后结束,因此转到位置2。 由于需要运行动画,所以我想知道为什么在位置1而

  • 问题内容: 我想使用匿名函数,所以我决定制作一个简单的主要查找器。这里是: 然而,我发现了什么,就是在每次访问,而我希望它是一个字面上的数字。我怎样才能使其成为替代? 问题答案: 您可以在创建lambda时“捕获” 这会将lambda的上下文设置为等于创建时的值。您还可以说,如果需要的话,它并不能完全捕获,但是可以满足您的需要。 这是一个查找问题,类似于具有定义函数的以下内容:

  • 外部链接 关键参数 报告 method metrics(指标, 数据单位) 其他参数 外部链接 source/link/a pv_count (浏览量(PV)) pv_ratio (浏览量占比,%) visit_count (访问次数) visitor_count (访客数(UV)) new_visitor_count (新访客数) new_visitor_ratio (新访客比率,%) ip_c