PHP 外部函数接口 PHP-FFI

未知
C/C++ PHP 查看源码»
跨平台
2018-04-20
达尔文

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

的码云指数为
超过 的项目
加载中

评论(2)

风情万种
风情万种
能用于哪些场景啊
卧龙大熊猫
卧龙大熊猫
这个不错

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

Zend 的 Dmitry Stogov 通过允许 PHP 执行嵌入式 C 代码扩展了 PHP 的领域。 这将允许完全访问本地 C 函数,变量以及数据结构。 解决方案 PHP FFI 作为实验性扩展提供,但要求 PHP 7.3 的开发...

2018/04/21 08:04

没有更多内容

加载失败,请刷新页面

没有更多内容

暂无问答

luaJIT FFI Library

LuaJIT FFI Library The FFI library allows calling external C functions and using C data structures from pure Lua code. The FFI library largely obviates the need to write tedious...

2015/06/10 18:40
116
0
Clozure Common Lisp 接口数据库创建操作指导(教程翻译)

# Clozure Common Lisp 接口数据库创建操作指导(教程翻译) === 原文地址: 网络: http://trac.clozure.com/ccl/browser/trunk/source/examples/cocoa/interface-databases/ 本地: file:///ccl...

2013/08/07 15:49
611
0
Openresty中使用LuaJit

今天在使用Openresty的时候,遇到了一个问题: local resty_sha1 = require "resty.sha1" 想使用resy.sha1的时候,出现了error,log如下: 2013/09/25 09:00:40 [error] 19620#0: *3 lua en...

2013/09/25 14:42
2.6K
0
node调用dll

安装python2.7,一定要2.7 https://www.python.org/download/releases/2.7/ 安装后设置环境变量:在环境变量path中添加C:\Python27 (python路径) 全局安装原生模块编译模块,编译ffi模块时需...

01/24 10:10
24
0
lua使用rust代码(第二期)--String

lua使用rust代码--第二期 前言 lua本身提供来ffi库,来完成对C语言的对接(实际上是动态连接库*.so)。调用rust代码也是通过这个ffi。那么对于struct,std::string::String,Vec\<struct\>,也因...

08/02 18:32
3
0
nginx lua 找不着ffi模块

解决方法

2018/04/18 16:13
306
0
Electron 环境搭建并引入 ffi 调用C++动态库

图方便使用官方提供的start git 地址 https://github.com/electron/electron-quick-start 环境准备 我的环境是 node 32位 vs2017 python 2.7 32位 然后执行 npm i 然后运行 npm start 就可以...

2018/06/07 11:44
221
0
electron-vue调用dll

安装python2.7,一定要2.7 https://www.python.org/download/releases/2.7/ 安装后设置环境变量:在环境变量path中添加C:\Python27 (python路径) 新建electron-vue项目 vue init simulated...

01/25 20:00
25
0
edx---安装 vagrant - vbguest 插件

An error occurred during installation of VirtualBox Guest Additions 4.3.20. Some functionality may not work as intended. In most cases it is OK that the "Window System drivers" ...

2015/07/02 09:46
78
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部