php扩展返回字符数组,PHP扩展之数组字符串处理

今天介绍一下PHP扩展来处理数组和字符串,附带一个对比原生PHP的处理效率:

我的测试机是装的PHP5.6.12,实现下面这个功能:function phprandstr($a, $z, $n) {

$b = array();

$max = count($a);

for ($i = 0; $i 

$tmp = "";

for ($j = 0; $j 

$zix = mt_rand(0, ($max - 1));

$tmp.=$a[$zix];

}

array_push($b, $tmp);

}

return $b;

}

很简单对不对,对一个数组里面的字符,随机取出来拼接,然后push到一个新的数组,下面来看PHP扩展的实现:

继续在我之前那个ligphp扩展里面写,编辑php_ligphp.h,添加一个randStr()函数:PHP_FUNCTION(randStr);

然后我们来重点看一下ligphp.c里面的代码:PHP_FUNCTION(randStr) {

zval *arr, **data;

long z;

long n;

int i, j, zix;

char *s = NULL, *str;

HashTable * arr_hb;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "all", &arr, &z, &n) == FAILURE) {

RETURN_NULL();

}

arr_hb = Z_ARRVAL_P(arr);

long length = zend_hash_num_elements(arr_hb);

if (z > length) {

php_error_docref(NULL TSRMLS_CC, E_NOTICE, "参数二不能超过数组长度");

RETURN_NULL();

}

array_init_size(return_value, n);

for (i = 0;i 

str = (char *)malloc(z + 1);

memset(str, '\0', z + 1);

for(j = 0;j 

zix = php_rand() % length;

if(zend_hash_index_find(arr_hb, zix, (void **)&data)== FAILURE) {

return;

}

s = Z_STRVAL_PP(data);

strncat(str, s, strlen(s));

}

add_index_string(return_value, i, str, 1);

}

return;

};

解释下上面的代码;

1.我们首先用zend_parse_parameters()函数接收参数,可以看到,接收一个数组类型的zval结构arr,2个long整型z和n;

2.用Z_ARRVAL_P宏,取出arr的值赋给哈希表结构类型的arr_hb,用zend_hash_num_elements()函数获取hashtable的长度便于下面的验证和算法处理;

3.用array_init_size()函数初始化return_value为一个数组;

4.开始循环处理,这里代码比较简单,用到的2个C函数malloc()动态分配内存空间和memset()把str的内存地址中没一个字节都设置成'\0'空字符串,即NULL;

5.zend_hash_index_find()函数是用于数字型索引数组的查找,strncat()是C函数用于拼接字符串的,add_index_string()函数类似PHP的array_push(),只不过是要指定index的。

把randStr注册到函数表中然后编译,接下来,我们来做一个简单测试,从26个英文字母里面随机取50000个10位的字符串,对比PHP执行和PHP扩展执行的效率:$a = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");

$t1 = microtime(true);

//$b=phprandstr($a,10,50000);

$b = randStr($a, 10, 50000);

$t2 = microtime(true);

echo "耗时:" . ($t2 - $t1) . "\n";

在我的机器上实测PHP处理需要0.162毫秒,PHP扩展处理0.032毫秒,相差大概五倍,可能毫秒级的你不在乎,但是想想,一次请求让你等1秒,你可以接受,让你等五秒,你估计炸毛了。。。

打赏

5bcf1d675d3d892e4e904daf057a4823.png微信扫一扫,打赏作者吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsp源码oracle数据库,JSP与oracle数据库交互案例

本案例为咖啡销售情况录入查询系统一、数据输入系统:1. 设计输入信息页面代码如下:咖啡管理系统——录入系统欢迎来到录入系统vcm0gYWN0aW9uPQ"inputaction.jsp" method"post" name"form1" id"form1">咖啡名…

oracle查询可更新结果集,jdbc 可更新结果集

jdbc中ResultSet在jdk 5.0以后默认都是可滚动的,不可更新的。可滚动的意思是我们可以调用absolute(),previous(), first()等操作来更新结果集中的指针位置。当我们需要结果集可更新的时候,可以设置它的值为ResultSet.CONCUR_UPDATABLE&#…

oracle 28000错误码,Oracle数据库 ORA-28000 错误处理方式

Oracle数据库ORA-28000错误处理方式ORA-28000:the account is locked-的解决办法ORA-28000:the account is locked第一步:使用PL/SQL,登录名为system,数据库名称不变,选择类型的时候把Normal修改为Sysdba;第二步:选择myjob,查看us…

为什么选择matlab,matlab选择语句

matlab程序if语句用法MATLAB中我们常常用到条件判断语句结构,通过实例介绍这个结构的用法: 1、if。..end结构,运行下面的句子,此条件语句是判断5是否大于3,如果大于3,就将1赋值给; 2、if。.else…

崔华 oracle简历,2013数据库大会:崔华-基于Oracle的SQL优化案例分析

2013数据库大会:崔华-基于Oracle的SQL优化案例分析崔华的新书即将出版,其数据库大会上的演讲也非常精彩,他的新书十分值得期待。2013年中国数据库技术大会第二天的"Oracle架构与优化"专场中,来自中航信资深Oracle数据库工程师崔华为…

模板消息 php实例,PHP微信模板消息操作示例

本文实例讲述了PHP微信模板消息操作方法。分享给大家供大家参考,具体如下:微信SDK:class Oauth {//获得全局access_tokenpublic function get_token(){//如果已经存在直接返回access_token//if($_SESSION[access_token] && $_SESSION…

非阻塞 php,PHP异步非阻塞之路

需求一个简单的需求,提交大量数据到远程服务器,此时并不需要等待返回。另一个需求,获取API数据,同时查询数据库,并行处理,加快响应速度。配置问题set_time_limitignore_user_abortfastcgi_finish_request只…

linux进程监控自动重启,Linux监控进程,进程关闭自动重启方案

Linux监控进程,进程关闭自动重启方案corntabshell脚本检测进程这个方案简单不用额外安装软件。缺点是存在间隔,corntab设置1秒执行一次shell脚本也是存在间隔的#!/bin/bash#author smallForest#email 1032817724qq.comproc_name"xiaofei.php" …

https脚本调linux执行器,linux平台下一键配置网站https

部署过SSL证书的人都知道,申请和部署一张SSL证书是相当繁琐而漫长的过程,枯燥无味的部署指南、非常容易出错的命令、复杂的编辑配置等等,在linux平台下,更加痛不欲生。LZ试用了SSL证书自动配置工具,支持linux平台下自动…

linux内核是否支持nfs,嵌入式命令:查看设备是否支持nfs

1:查看设备是否支持nfs功能命令: cat /proc/filesystems若有一行为 nodev nfs,则开发板Linux内核支持NFS,反之需要配置内核同样方法查看Linux主机内核是否支持NFS挂载文件系统的时候遇到:[rootHZCTC-hadoop-0-81 hadoo…

linux6同步时间,centos 6.x 同步网络时间

1. linux时间介绍Linux的时间分为System Clock(系统时间)和Real Time Clock (硬件时间,简称RTC)。系统时间:指当前Linux Kernel中的时间。硬件时间:主板上有电池供电的时间。2. 手动设置时间查看系统时间的命令:date设置系统时间的…

linux6.5如何打开ftp服务,CentOs6.5上快速搭建ftp服务器

1、用root 进入系统2、使用命令 rpm -qa|grep vsftpd 查看系统是否安装了ftp,若安装了vsftp,使用这个命令会在屏幕上显示vsftpd的版本3、使用命令rpm -e vsftpd 即可卸载ftp4、再使用rpm -qa|grep vsftpd 查看系统是否已删除ftp,若删除成功…

linux cmake安装教程,ubuntu安装Cmake

安装 CMake1、下载最新的CMake( 版本:3.4.0)wget http://www.cmake.org/files/v3.4/cmake-3.4.0-rc2-Linux-i386.tar.gz2、解压tar zxvf cmake-3.4.0-rc2-Linux-i386.tar.gz3、创建链接ln -s /usr/cmake-3.4.0-rc2-Linux-i386/bin/* /usr/bin/4、执行命令&#xff0…

linux设置静态ip后端口不能上网,Centos7设置静态IP后无法上网的解决方法

在VMWare中安装的本地虚拟机CentOS7操作系统,动态IP地址会经常变化,设置成静态IP地址后,本地局域网可以互相访问,但CentOS7系统无法访问互联网,按以下步骤解决这个问题。1、以系统管理员打开VMWare2、选择虚拟网络编辑…

linux 下nc-verilog 仿真环境搭建,Cadence NC Verilog仿真教程

这个手册将向你介绍使用 NC-Verilog simulator 和 SimVision。 本文使用的是一个用 Veilog 硬件编程语言编写的一个饮料分配机,通过这个例 子你将学会: 编译 Verilog 源文件,描述设计,在 NC-Launch(用于管理你的大型设计 的图形交…

Linux分支代码必须公开吗,linux – 当拉出不同的分支时,让“git pull”请求确认...

现在,我将重点介绍如何在执行任何拉动之前提示用户进行确认.不幸的是,因为没有预拉hook这样的东西,我认为你不能得到实际的pull命令来直接为你做这个.在我看来,你有两个选择:1 – 使用fetch然后合并(而不是pull)而不是运行git pull,运行git fetch,然后git merge或gi…

linux宽松模式,SELinux 宽容模式(permissive) 强制模式(enforcing) 关闭(disabled) 几种模式之间的转换...

SELinux 宽容模式(permissive) 强制模式(enforcing) 关闭(disabled) 几种模式之间的转换在Android的root相关的文章里经常会看到关于SElinux,Android4.3以后引进SElinux。###SELinux 的启动、关闭与查看1、并非所有的 Linux distributions 都支持 SELinux目前 SELin…

linux vim emmet,前端开发神器Emmet.vim使用笔记

Emmet.vim的安装请看:http://www.cnblogs.com/yunie-akira/p/3554065.htmlEmmet.vim简介Emmet,原来叫Zen Coding,由Sergey Chikuyonok开发,是快速开发HTML和CSS的编辑器插件。支持 Sublime Text、Notepad、Eclipse等等。官方的Emmet并不支持v…

深度Linux修改分辨率6,Deepin 修改自定义分辨率

之前我有篇文章是写显示器超频问题,当时感觉Deepin超频麻烦,折腾换成了Win10,但用了断时间后,感觉Win10真的不好用,夜览模式软件适配差,CPU占用率高,字体颗粒感强,显示器看着眼睛很累…

linux标准i o实例,9.3. 一个 I/O 端口例子

## 9.3. 一个 I/O 端口例子我们用来展示一个设备驱动内的端口 I/O 的例子代码, 操作通用的数字 I/O 端口; 这样的端口在大部分计算机系统中找到.一个数字 I/O 端口, 在它的大部分的普通的化身中, 是一个字节宽的 I/O 位置, 或者内存映射的或者端口映射的. 当你写一个值到一个输…