【php7扩展开发五】函数调用

centOS下安装php7及扩展 先介绍一下我使用的环境,是centOS7.4 之前的安装PHP我都是下载PHP安装包文件,解压编译安装,扩展也是编译安装,再把生成的.so文件保存在PHP的扩展文件夹下才能使用,这次我发现了一种能超级简便好用的安装方式。 大家都知道使用yum install命令安装,如果直接yum install php,安装的PHP版本是5.6,要安装高版本的PHP,其实也可以用yum install命令直... 阅读详情

实际应用中,扩展可能需要调用用户自定义的函数或者其他扩展定义的内部函数,PHP提供的函数调用API的使用:

ZEND_API int call_user_function(HashTable *function_table, zval *object,zval *function_name, zval *retval_ptr, uint32_t param_count, zval params[
]);

各参数的含义:

  • __function_table:__ 函数符号表,普通函数是EG(function_table),如果是成员方法则是zend_class_entry.function_table
  • object: 调用成员方法时的对象
  • __function_name:__ 调用的函数名称
  • __retval_ptr:__ 函数返回值地址
  • __param_count:__ 参数数量
  • params: 参数数组

从接口的定义看其使用还是很简单的,不需要我们关心执行过程中各阶段复杂的操作。下面从一个具体的例子看下其使用:

(1)在PHP中定义了一个普通的函数,将参数$i加上100后返回:

function mySum($i){
    return $i+100;
}


(2)接下来在扩展中调用这个函数:

PHP_FUNCTION(my_func_2)
{
    zend_long i;
    zval call_func_name, call_func_ret, call_func_params[1];
    uint32_t call_func_param_cnt = 1;
    zend_string *call_func_str;
    char *func_name = "mySum";
    if(zend_parse_parameters(ZEND_NUM_ARGS(), "l", &i) == FAILURE){
        RETURN_FALSE;
    }
    //分配zend_string:调用完需要释放
    call_func_str = zend_string_init(func_name, strlen(func_name), 0);
    //设置到zval
    ZVAL_STR(&call_func_name, call_func_str);
    
    //设置参数
    ZVAL_LONG(&call_func_params[0], i);
    
    //call
    if(SUCCESS != call_user_function(EG(function_table), NULL, &call_func_name, &call_func_ret, call_func_param_cnt, call_func_params)){
        zend_string_release(call_func_str);
        RETURN_FALSE;
    }
    
    zend_string_release(call_func_str);
    RETURN_LONG(Z_LVAL(call_func_ret));
}

(3)最后调用这个内部函数:

function mySum($i){
    return $i+100;
}
echo my_func_2(60);
===========[output]===========
160

call_user_function() 并不是只能调用PHP脚本中定义的函数,内核或其它扩展注册
的函数同样可以通过此函数调用,比如:array_merge()。

PHP_FUNCTION(my_func_1)
{
    zend_array *arr1, *arr2;
    zval call_func_name, call_func_ret, call_func_params[2];
    uint32_t call_func_param_cnt = 2;
    zend_string *call_func_str;
    char *func_name = "array_merge";
    if(zend_parse_parameters(ZEND_NUM_ARGS(), "hh", &arr1, &arr2) == FAILURE){
        RETURN_FALSE;
    }
    
    //分配zend_string
    call_func_str = zend_string_init(func_name, strlen(func_name), 0);
    //设置到zval
    ZVAL_STR(&call_func_name, call_func_str);
    
    ZVAL_ARR(&call_func_params[0], arr1);
    ZVAL_ARR(&call_func_params[1], arr2);
    
    if(SUCCESS != call_user_function(EG(function_table), NULL, &call_func_name, &call_func_ret, call_func_param_cnt, call_func_params)){
    zend_string_release(call_func_str);
    RETURN_FALSE;
    }
    zend_string_release(call_func_str);
    RETURN_ARR(Z_ARRVAL(call_func_ret));
}
$arr1 = array(1,2);
$arr2 = array(3,4);
$arr = my_func_1($arr1, $arr2);
var_dump($arr);

 

带你了解如何分析Jmeter监听器常用图表并定位瓶颈 1.1 Jmeter监听器常用图表 目录 1.1 Jmeter监听器常用图表 1.1-1 查看结果树 1.1-2 汇总报告 1.1-3 集合报告 1.1-4 综合图 1.1-5 断言结果 1.1-6 图形结果 1.1-7 响应时间图 1.2 Jmeter性能瓶颈定位 1.2-1 性能瓶颈产生的原因 1.2-2 性能瓶颈的解决方法 1.2-3 性能瓶颈如何定位 1.1-1 查看结果树 查看结果树:调试利器。可以查看每个请求具体的详情,方便进行测试的比对。有点类似我... 阅读详情

相关推荐

MIMO技术入门

MIMO:多天线技术,发射端和接收端有多个天线(注意:并不是指多个天线板,而是多套振子,每一套是一个独立的天线。) 4G:2、8天线 5G:4、64天线(64T64R) 手机也是多天线 MIMO实现效果的分类: 1)空间分集 。2)空间复用。3)波束赋形。 空间分集(space diversity) 作用:提升接收质量 利用多个天线发射或者接收一个数据流,避免单个信道衰落对整个链路的影响。(比如你的耳机坏了一只并不影响另一只) 空间复用(space multiplexing) 作用:提升速率 利

About1129的博客 2876

PHP7扩展开发之函数调用

前言 在这篇文章中我们将演示如何在扩展中调用函数,和调用对象的方法。代码示例如下: class demo { public function get_site_name ($prefix) { return $prefix."信海龙的博客\n"; } } function get_site_url ($prefix) { return $prefi

稻草人技术博客 1589

基于STM32避障/循迹/蓝牙遥控小车的硬件与软件底层设计

1、实现2m的自动直线行驶,要求左右偏移不大于10cm。2、车载显示屏显示车辆当前行驶速度或车辆运行时间,当前方20cm内出现障碍物时显示与前方障碍物的距离,车每次转弯蜂鸣器报警,同时通过左右指示灯指示转弯方向。3、依次驶过障碍物①②③④,且不触碰障碍物。4、成功进行调头转弯,行驶过程中车轮不碾压黑实线。5、在车道指定位置停车且不越界。6、通过红外、蓝牙、WiFi等任意一种方式实现对小车的控制,使其前进、后退、左转、右转。

2301_78758161的博客 1万+

php7与php5调用函数的区别

php7的写法要求更加严谨 直接看代码 <?php class test { public static function test1($name, $name1) { echo $name . "-" . $name1; } } $testArr = array("test" , "test1"); $test = new test(); $

4837

告别Keil手动分区!用CubeMX+VS Code一键生成带Bootloader的STM32 OTA工程

本文详细介绍了如何利用STM32CubeMX和VS Code实现STM32 OTA工程的自动化构建,告别传统Keil手动分区的繁琐流程。通过图形化配置Flash分区、自动生成链接脚本以及实现Bootloader跳转逻辑,开发者可以高效完成远程升级功能开发,显著提升嵌入式开发效率。

weixin_33720956的博客 389

英飞凌Tricore实战系列导读

笔者结合项目应用经验对Tricore MCU的开发及应用经验进一步总结,成人达己,渡己渡人。

initiallizer的博客 3791

PHP7.0--如何使用函数的引用

<?php /** * Created by PhpStorm. */ function &example($a = 1) //函数必须用&声明 { return $a; } $b = &example('引用虾米大王'); //类似c++的地址使用方式 echo $b."<br>"; ...

虾米大王的学习历程 538

199、医疗内窥镜影像:微型镜头与高色彩保真度的ISP定制化方案

医疗内窥镜影像系统开发面临三大光学挑战:衍射极限导致分辨率下降,微型镜头色差严重,镀膜不足引发红外漏光。团队通过定制化ISP方案解决问题:采用分区色差补偿、红外泄露补偿技术,开发12区域分段颜色校正矩阵,并设计自适应伽马曲线。关键经验包括锁定白平衡避免术中偏色,优化FPGA流水线确保30fps流畅度,强调光学标定优先于算法优化。最终方案使DeltaE降至3以下,满足医生对组织颜色细微差异的识别需求,尤其解决了血管与脂肪边界辨识难题。

zzfmlxs的博客 265

编写php自定义扩展

有两个理由需要自己编写PHP扩展。第一个理由是:PHP需要支持一项她还未支持的技术。这通常包括包裹一些现成的C函数库,以便提供PHP接口。例如,如果一个叫FooBase的数据库已推出市场,你需要建立一个PHP扩展帮助你从PHP里调用FooBase的C函数库。这个工作可能仅由一个人完成,然后被整个PHP社区共享(如果你愿意的话)。第二个不是很普遍的理由是:你需要从性能或功能的原因考虑来编写一些商业逻辑

乐乐的博客 7909

UNet改进(12):融合小波变换与注意力机制的图像分割新方法

本文提出了一种改进的WaveletAttentionUNet架构,通过结合小波变换和注意力机制来增强传统UNet的多尺度特征提取能力。该网络使用分组卷积模拟小波分解,将输入通道扩展为4个子带(LL、LH、HL、HH),并通过通道注意力机制自适应加权各子带特征。网络保留了UNet的编码器-解码器结构,在关键位置集成了WaveletAttention模块。实验证明该方法在医学图像分割等任务中能更好地保持边缘细节和复杂纹理特征,同时保持计算效率。

2501_91516851的博客 759

OpenHarmony AI系列:神经网络处理单元(NPU)驱动架构与实现详解

NPU(Neural Processing Unit,神经网络处理单元)是专门为神经网络计算设计的硬件加速器。在OpenHarmony系统中,NPU驱动是通过NNRT(Neural Network Runtime,神经网络运行时)框架实现的,它作为中间桥梁连接上层AI推理框架和底层NPU硬件,实现AI模型的跨芯片推理计算。

m0_67505153的博客 665

php扩展调用其他扩展函数

在扩展开发中,并不是所有的功能都需要自已去实现 。可以调用一些其他扩展已经实现的函数。 调用内核标准函数 如下面是调用php_string_tolower的过程。 引入头文件 #include "ext/standard/php_string.h" 然后可以直接使用引入文件中的PHPAPI 开头的标准函数。 如下: PHP_FUNCTION(rsautil_test1) { zend_str...

小熊的专栏 1207

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

PHP扩展开发及入门解惑

原站地址:https://xuwenzhi.com/2016/03/09/php%E6%89%A9%E5%B1%95%E5%BC%80%E5%8F%91%E5%8F%8A%E5%85%A5%E9%97%A8%E8%A7%A3%E6%83%91/ 说在最前面 作为PHP程序猿,如果不懂得PHP内核、不懂得PHP扩展开发,仿佛是一件很”羞耻”的事情,嗯,的确很”羞耻”!虽说已经接触PHP已经有三年多...

weixin_42214915的博客 7296

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

如何在php7.2/php7.3中安装mcrypt扩展?

mcrypt 是php里面重要的加密支持扩展库,linux环境下该库在默认情况下不开启。window环境下,PHP>=5.3,默认开启mcrypt扩展。mcrypt扩展是mcrypt加密库的接口。这个扩展对于允许使用mcrypt的PHP代码在PHP 7.2+上运行非常有用。 mcrypt扩展的主要问题是,它是基于libmcrypt的,自2007年开始就没有开发过。因此,即使lib...

gb4215287的博客 6482

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

linux c 开发php7扩展

记录一下php7扩展开发的步骤 先做准备工作 1:在php.net下载源代码 2:安装php7 安装过程看以前文章 扩展名称为gradytest,下面开始操作 进入ext目录,执行 ./ext_skel --extname=gradytest 生成gradytest扩展目录 修改config.m4内容 把下图中的dnl注释去掉,

黑色的夜 3210

PHP7 安装 zip 扩展的过程(CentOS7 )

PECL:The PHP Extension Community Library是php的扩展库。 1、准备 php 开发包和扩展库: yum install php-devel php-pear 2、安装php的zip扩展: perl install zip 3、开启扩展( vimphp.ini ): zlib.output_compression = On extensio...

Phplayers的博客 9225

PHP7扩展开发之依赖其他扩展

前言 有的时候,我们的扩展要依赖其他扩展。比如,我们PHP的mysqli扩展就依赖mysqlnd扩展。这中情况下,我们怎么使用其他扩展呢?这个就是本文讲述的内容。 我们新建立一个扩展,名字叫 demo_dep , 依赖之前的say扩展。 在demo_dep扩展中,我们实现demo_say方法。这个方法调用say扩展的say方法。 代码 基础代码 确保say扩展的头文件正确安装到了p

稻草人技术博客 2186

centos7 php7安装redis扩展

环境 linux centos7 php7.1 一、下载安装包 下载地址: http://pecl.php.net/package/redis [root@localhost ~]# wget -c http://pecl.php.net/get/redis-4.2.0.tgz 二、解压安装包 [root@localhost ~]# tar -zvxf redis-4.2.0.tgz ...

Cywanp的博客 3388

php扩展调用php函数,PHP7扩展开发之函数调用

前言在这篇文章中我们将演示如何在扩展中调用函数,和调用对象的方法。代码示例如下:

weixin_31101725的博客 311

window制作php扩展,详解Window7下开发php扩展,详解window7php扩展_PHP教程

详解Window7 下开发php扩展,详解window7php扩展一、首先查看phpinfo() 信息PHP Version 5.4.34Zend Extension Build API220100525,TS,VC9PHP Extension Build API20100525,TS,VC9Thread Safety enable线程安全,VC9编译,5.4.34版本二、开发前准备工作php 5...

weixin_29531177的博客 254

php7.2安装redis扩展

centos7 以上版本php7.2安装redis扩展,使php能和redis进行通信。 一、使用oneinstack安装php7.2 二、下载php7的phpredis扩展库 php官网下载redis扩展页面:http://pecl.php.net/package/redis wget http://pecl.php.net/get/redis-4.0.2.tgz 三、解压phpredis...

zjw18340905951的博客 3121

php window扩展,详解Window7 下开发php扩展

详解Window7 下开发php扩展2020-06-21 21:01:08一、首先查看phpinfo() 信息PHP Version 5.4.34Zend Extension Build API220100525,TS,VC9PHP Extension Build API20100525,TS,VC9Thread Safety enable线程安全,VC9编译,5.4.34版本二、开发前准备工作p...

weixin_39620273的博客 106

用C开发PHP7.1扩展模块

前言:因为自己做过C++开发,就想搞一下PHP扩展。然有此文。 本文适合:熟悉linux源码安装;安装过lnmp或lamp的。 看了一堆文章还不如自己看官网说明。----------智能一帅 《-------------------华丽的分隔线-----------------------------------------》 本文件只讲PH...

WGQTHXXXXM的博客 1132

php7 ext skel_手把手告诉你如何用扩展开发PHP7?

本教程以PHP7为基础,说明如何从零开始扩展PHP7.3。第一步:准备工作1、基础环境:PHP 7.3.19-1+ubuntu16.04.12、安装php开发版:apt install php7.3.1-dev3、下载相关事项:①下载php源码②linux可用命令下载③下载源码所放目录(可自定):/usr/local/src/手把手告诉你如何用扩展开发PHP7? 第二步:解压源码压缩包1、tar...

weixin_40007804的博客 356
上一篇: 【php7扩展开发四】函数的参数 ,引用传参 ,返回值
下一篇: 【php7扩展开发六】zval的操作
rorntuck7
博客等级 码龄16年 46粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值