首页 > 编程语言 >C语言,PHP扩展开发

C语言,PHP扩展开发

时间:2024-04-09 17:36:04浏览次数:30  
标签:echo NULL xuxiaobo 扩展 ZEND C语言 add PHP

c语言代码:

/* test_add extension for PHP */

#ifdef HAVE_CONFIG_H
# include "config.h"
#endif

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "php.h"
#include "zend_exceptions.h"
#include "ext/standard/info.h"
#include "php_test_add.h"

/* For compatibility with older PHP versions */
#ifndef ZEND_PARSE_PARAMETERS_NONE
#define ZEND_PARSE_PARAMETERS_NONE() \
    ZEND_PARSE_PARAMETERS_START(0, 0) \
    ZEND_PARSE_PARAMETERS_END()
#endif

PHP_FUNCTION(xuxiaobo_test1)
{
    ZEND_PARSE_PARAMETERS_NONE();
    php_printf("已经加载了扩展:%s\n", "test_add");
}

PHP_FUNCTION(xuxiaobo_test2)
{
    char *var = "世界";
    size_t var_len = sizeof("世界") - 1;
    zend_string *retval;

    ZEND_PARSE_PARAMETERS_START(0, 1)
        Z_PARAM_OPTIONAL
        Z_PARAM_STRING(var, var_len)
    ZEND_PARSE_PARAMETERS_END();

    retval = strpprintf(0, "你好,%s", var);

    RETURN_STR(retval);
}

PHP_FUNCTION(xuxiaobo_test3)
{
    long a, b;
    zend_long retval;
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
        RETURN_NULL();
    }
    long c = 0;
    c = a + b;
    retval = c;
    RETURN_LONG(retval);
}

PHP_FUNCTION(xuxiaobo_test4)
{
    char *arg = NULL;
    char *ret = NULL;
    size_t arg_len;
    zend_string *strg;
    zend_string *retval;

    if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) {
        RETURN_NULL(); // 如果参数解析失败,返回 NULL
    }

    strg = zend_string_init(arg, arg_len, 0);
    char *strgstr = strg->val;

    ret = getenv(strgstr);
    retval = strpprintf(0, "%s", ret);

    RETURN_STR(retval);
}

PHP_FUNCTION(xuxiaobo_test5)
{
    char *arg1, *arg2, *arg3;
    size_t arg_len1, arg_len2, arg_len3;
    zend_string *result;

    ZEND_PARSE_PARAMETERS_START(3, 3)
        Z_PARAM_STRING(arg1, arg_len1)
        Z_PARAM_STRING(arg2, arg_len2)
        Z_PARAM_STRING(arg3, arg_len3)
    ZEND_PARSE_PARAMETERS_END();

    result = strpprintf(0, "%s%s%s", arg1, arg2, arg3);
    RETURN_STR(result);
}

PHP_FUNCTION(xuxiaobo_test6)
{
    zend_long num1, num2, num3, num4;

    // 检查参数个数
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "llll", &num1, &num2, &num3, &num4) == FAILURE) {
        RETURN_NULL();
    }

    // 输出数字
    array_init(return_value);
    add_index_long(return_value, 0, num1);
    add_index_long(return_value, 1, num2);
    add_index_long(return_value, 2, num3);
    add_index_long(return_value, 3, num4);
    add_index_long(return_value, 4, num1 + num2 + num3 + num4);
    add_index_long(return_value, 5, num1 * num2 * num3 * num4);
}

PHP_FUNCTION(xuxiaobo_test7)
{
    zval *param1;
    zval *param2;
    zval *param3;
    zend_string *result;

    // 检查参数的数量
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zzz", &param1, &param2, &param3) == FAILURE) {
        RETURN_NULL();
    }

    long num1 = Z_LVAL_P(param1);

    char str1[1024];
    sprintf(str1, "%s", Z_STRVAL_P(param2));

    char str2[1024];
    sprintf(str2, "%s%s", Z_STRVAL_P(param2), Z_STRVAL_P(param2));

    double float_value1 = Z_DVAL_P(param3);

    // 输出三个
    array_init(return_value);
    add_index_long(return_value, 0, num1);
    add_index_string(return_value, 1, str1);
    add_index_double(return_value, 2, float_value1);
    add_index_long(return_value, 3, num1 * num1);
    add_index_string(return_value, 4, str2);
    add_index_double(return_value, 5, float_value1 * 2);
}

PHP_FUNCTION(xuxiaobo_test8)
{

}

PHP_RINIT_FUNCTION(test_add)
{
#if defined(ZTS) && defined(COMPILE_DL_TEST_ADD)
    ZEND_TSRMLS_CACHE_UPDATE();
#endif

    return SUCCESS;
}

PHP_MINFO_FUNCTION(test_add)
{
    php_info_print_table_start();
    php_info_print_table_header(2, "test_add support", "enabled");
    php_info_print_table_end();
}

ZEND_BEGIN_ARG_INFO(arginfo_xuxiaobo_test1, 0)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO(arginfo_xuxiaobo_test2, 0)
ZEND_ARG_INFO(0, str)

ZEND_END_ARG_INFO()

static const zend_function_entry test_add_functions[] = {
    PHP_FE(xuxiaobo_test1,        NULL)
    PHP_FE(xuxiaobo_test2,        NULL)
    PHP_FE(xuxiaobo_test3,        NULL)
    PHP_FE(xuxiaobo_test4,        NULL)
    PHP_FE(xuxiaobo_test5,        NULL)
    PHP_FE(xuxiaobo_test6,        NULL)
    PHP_FE(xuxiaobo_test7,        NULL)
    PHP_FE(xuxiaobo_test8,        NULL)
    PHP_FE_END
};

zend_module_entry test_add_module_entry = {
    STANDARD_MODULE_HEADER,
    "test_add",                    /* Extension name */
    test_add_functions,            /* zend_function_entry */
    NULL,                            /* PHP_MINIT - Module initialization */
    NULL,                            /* PHP_MSHUTDOWN - Module shutdown */
    PHP_RINIT(test_add),            /* PHP_RINIT - Request initialization */
    NULL,                            /* PHP_RSHUTDOWN - Request shutdown */
    PHP_MINFO(test_add),            /* PHP_MINFO - Module info */
    PHP_TEST_ADD_VERSION,        /* Version */
    STANDARD_MODULE_PROPERTIES
};


#ifdef COMPILE_DL_TEST_ADD
# ifdef ZTS
ZEND_TSRMLS_CACHE_DEFINE()
# endif
ZEND_GET_MODULE(test_add)
#endif

 

php代码:

<?php
header("Content-type:text/html;charset=utf-8");
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('memory_limit', '-1');
set_time_limit(0);

$arr1 = ['蒋光头', '卧槽', '你', '大爷的', '函数', '是一个非常', '实用的字符', 
'串操作', '工具', '它在', '各种', '场景中', '都能', '派上用场', '掌握', '函数和其他', 
'字符串操作', '函数', '我们', '编程', '世界中', '更加', '游刃', '有余'];

echo "<title>C语言,PHP扩展开发</title>\n\n";
echo "<h1>C语言,PHP扩展开发</h1>\n\n";

echo "<b>1、xuxiaobo_test1() : </b><pre>\n";
xuxiaobo_test1();
echo "</pre>\n\n";


echo "<b>2、xuxiaobo_test2() : </b>\n";
echo "<pre>".xuxiaobo_test2()."</pre>\n\n";


$a = $arr1[random_int(0, count($arr1)-1)];
echo "<b>3、xuxiaobo_test2(\"{$a}\") : </b>\n";
echo "<pre>".xuxiaobo_test2($a)."</pre>\n\n";


$a = random_int(1, 100);
$b = random_int(1, 100);
$c = xuxiaobo_test3($a, $b);
echo "<b>4、xuxiaobo_test3({$a}, {$b}) : </b>\n";
echo "<pre>{$c}</pre>\n\n";


$arr = ['HOME', 'USER', 'PATH'];
$a = $arr[random_int(0, count($arr)-1)];
echo "<b>5、xuxiaobo_test4(\"{$a}\") : </b>\n";
echo "<pre>".xuxiaobo_test4($a)."</pre>\n\n";


$a = $arr1[random_int(0, count($arr1)-1)];
$b = $arr1[random_int(0, count($arr1)-1)];
$c = $arr1[random_int(0, count($arr1)-1)];
$d = xuxiaobo_test5($a, $b, $c);
echo "<b>6、xuxiaobo_test5(\"{$a}\", \"{$b}\", \"{$c}\") : </b>\n";
echo "<pre>".$d."</pre>\n\n";


$a = random_int(1, 10);
$b = random_int(1, 10);
$c = random_int(1, 10);
$d = random_int(1, 10);
echo "<b>7、xuxiaobo_test6({$a}, {$b}, {$c}, {$d}) : </b>\n";
$d = xuxiaobo_test6($a, $b, $c, $d);
$e = print_r($d, true);//json_encode($d, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
echo "<pre>".$e."</pre>\n\n";


$a = random_int(1, 10);
$b = $arr1[random_int(0, count($arr1)-1)];
echo "<b>8、xuxiaobo_test7({$a}, \"{$b}\", 3.14) : </b>\n";
$d = xuxiaobo_test7($a, $b, 3.14);
$e = print_r($d, true);//json_encode($d, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
echo "<pre>".$e."</pre>\n\n";

 

效果:

1、xuxiaobo_test1() :

已经加载了扩展:test_add
2、xuxiaobo_test2() :
你好,世界
3、xuxiaobo_test2("工具") :
你好,工具
4、xuxiaobo_test3(26, 19) :
45
5、xuxiaobo_test4("USER") :
root
6、xuxiaobo_test5("场景中", "更加", "字符串操作") :
场景中更加字符串操作
7、xuxiaobo_test6(4, 9, 10, 2) :
Array
(
    [0] => 4
    [1] => 9
    [2] => 10
    [3] => 2
    [4] => 25
    [5] => 720
)
8、xuxiaobo_test7(6, "都能", 3.14) :
Array
(
    [0] => 6
    [1] => 都能
    [2] => 3.14
    [3] => 36
    [4] => 都能都能
    [5] => 6.28
)

标签:echo,NULL,xuxiaobo,扩展,ZEND,C语言,add,PHP
From: https://www.cnblogs.com/xuxiaobo/p/18124403

相关文章

  • 关于转义符 \ 在php正则中的匹配问题
    今天做题遇到一个很经典的问题,记录一下,先看一段代码<?php$str,=,"\\";$pattern,=,"/\\/";if(preg_match($partern,$str,$arr)){,,,,echo,"success";,,,,print_r($arr);}else{,,,,echo,"false";}看到这段代码的师傅们,思考一下,会输出success还是false输出fals......
  • 【C语言初阶】结构体
    【C语言初阶】结构体文章目录【C语言初阶】结构体7-结构体一、结构体的声明1结构体的基础知识2结构体的声明2.1介绍2.2声明示例3结构体成员类型二、结构体变量的定义和初始化1结构体变量的定义和初始化三、结构体成员的访问1结构体变量直接访问成员2结构体指......
  • 【C语言】练习:比较十个数的大小
    初始化一个数组,使用for循环输入;把数组中的第一个数字,也就是下标为[0]的数字赋值给一个int类型的变量“max”;使用循环从arr数组中下标为[1]的数字开始对比,如果arr[1]>arr[0],则把arr[1]赋值给max;最后打印出最大数。intmain(){ intarr[10]; for(inti=0;i<10;......
  • 【C语言】练习:分数求和
    计算1/1-1/2+1/3-1/4+1/5……+1/99-1/100的值,打印出结果首先看题,分子不变为1,分母1-100;既然是分数计算,那结果肯定存在小数,所以在开始定义一个double类型的变量“num”;初始化一个int类型的变量“i”,使用for循环产出1-100的值;在for循环里使用if语句来判断分母是偶数......
  • C语言语法最后一个教案-教案21(预处理 · 头文件)
    最近给大家争取到一个深夜福利保证你在深夜手机刷到嘎嘎香~那就是 官方授权大流量卡缺点:月租太便宜 185GB~100分钟通话时长~长期套餐~畅想自由的气息流量自由的同时还拥有超长通话,而且免费领取。名额有限,咱们废话不多说直接上图。感兴趣的家人私我或者直接加微......
  • 【C语言】链表(原理+实现)
    目录一.链表概念二.链表实现1.创建新节点2.打印链表3.尾插、头插4.尾删、头删5.查找6.指定位置前插入7.指定位置后插入8.指定位置删除9.指定位置后删除 10.销毁链表三.完整代码一.链表概念链表是线性表的一种,与顺序表不同的是,链表在物理存储结构上不连续,在......
  • 数据结构----栈和队列详细操作完整代码(C语言)
    栈和队列是两种常用的,重要的数据结构栈和队列是限定插入和删除只能在表的“端点”进行的线性表栈和队列是线性表的子集(是插入和删除位置受限的线性表)栈定义:只能在表的一端(栈顶)进行插入和删除运算的线性表逻辑结构:与线性表相同,仍为一对一关系存储结构:用顺序栈或链栈存......
  • 【华为OD机试真题】218、寻找相似单词 | 机试真题+思路参考+代码分析(C语言、C++、Java
    文章目录一、题目......
  • 【华为OD机试真题】217、最长广播响应 | 机试真题+思路参考+代码分析(C语言、C++、Java
    文章目录一、题目......
  • sd+ebsynth_utility扩展+controlNet实现视频换风格
    1.安装sd,安装EbSynth(https://ebsynth.com/)2.安装扩展:https://github.com/Mikubill/sd-webui-controlnethttps://github.com/s9roll7/ebsynth_utility3.下载模型基础模型选用c站:https://civitai.com/models/104100?modelVersionId=155254 下载放置sd扩展path/to......