用C编写你自己的php扩展

使用C语言来扩展PHP,写PHP扩展dll 将c代码写成php的拓展库,实现php对c语言的调用 立即下载

本文链接:http://blog.youkuaiyun.com/ddjohn/article/details/42317675

本文参考:http://blog.youkuaiyun.com/taft/article/details/596291

如果你没写过php扩展,又是追求性能的极客,那么这篇文章肯定适合你:

假如你有这样一个php程序

function self_concat($string, $n){
    $result = "";
    for($i = 0; $i < $n; $i++){
        $result .= $string;
    }
    return $result;
}
$str = self_concat('fire',10);

如果传入的第二个参数N很大,程序的性能如何?我在自己的机器上测试下如果 n=10000000的时候耗时0.6s左右 如果用C写这个php function然后php直接调用,会快么?那就开始写这样一个简单的扩展吧,采用静态编译成.so的方式来加载,我用最快最简明的方式说明。

1.首先你需要有php的源码目录 cd到其ext目录下执行:

./ext_skel --extname=luckyext --proto=luckyext.def

这条命令会自动生成一个名叫luckyext的目录 里面有基本的扩展骨架文件,核心的文件只有三个 congif.m4用来做编译配置,luckyext.h定义都文件包括声明你的自定义函数,还有luckyext.c用来写C的函数源码,其他都是附加的骨架文件,暂时可以不用管。

2.在luckyext.c内编写你要的函数,记得在头文件内声明,不然编译的时候会报错

PHP_FUNCTION(self_concat_c)
 
{
 
char *str = NULL;
 
int argc = ZEND_NUM_ARGS();
 
int str_len;
 
long n;
 
char *result; /* Points to resulting string */
 
char *ptr; /* Points at the next location we want to copy to */
 
int result_length; /* Length of resulting string */
 
if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == FAILURE)
 
return;
 
/* Calculate length of result */
 
result_length = (str_len * n);
 
/* Allocate memory for result */
 
result = (char *) emalloc(result_length + 1);
 
/* Point at the beginning of the result */
 
ptr = result;
 
while (n--) {
 
/* Copy str to the result */
 
memcpy(ptr, str, str_len);
 
/* Increment ptr to point at the next position we want to write to */
 
ptr += str_len;
 
}
 
/* Null terminate the result. Always null-terminate your strings
 
even if they are binary strings */
 
*ptr = '\0';
 
/* Return result to the scripting engine without duplicating it*/
 
RETURN_STRINGL(result, result_length, 0);
 
} 

3.编译扩展 关于php的环境配置就不说了

phpize
./configure
make&&make install

成功编译的话会在你的php指定的扩展目录中生成一个luckyext.so的文件

4.引入扩展重新加载php

vi /etc/php.ini
extension=luckyext.so
我是mac机,修改的时候请看自己机器的配置,修改完后保存重启fpm
killall php-fpm
php-fpm

5.测试

终端输入

php -m
出来的扩展中应该有luckyext了,至于它支持什么函数 可以用ext/luckyext目录内的luckyext.php脚本去运行看看 正常情况会输出它支持的函数self_concat_c()

6.性能对比 直接运行C写的php

<?php
self_concat_c('fire',10000000);

出来的结果耗时是惊人的,0.06秒,相差10倍!为什么呢,因为如果用php那套代码,每次往字符串塞字符的时候,php都需要做一个内存的动态分配,循环越多次,性能开销就越大,而C写的function直接就计算出最终需要分配多少内存了,所以快就快在这里,是不是很有趣~哈哈,至少我觉得很刺激!

本文的C例子属参考前辈翻译的文件,以后要多修修C的功底才行了,后面我会研究更多C的知识,加油!

PHP高性能组合框架(C扩展) 1、考虑之前做的项目都是CI框架,如果全部推翻,将会有超级多的东西需要修改,所以我将CI引擎替换,但是SuperCI对外提供的调用方式不变, 2、框架支持4层架构,Controller、Business、Dao、View 层。 3、首先我将CI框架的路由部分抽取出来, 替换成Yaf。 4、然后将CI的数据库ORM操作底层引擎替换成Phalcon, 然而这并不是一个全部的Phalcon, 而是将Phalcon所有其它模块全部删除,仅保留DB操作部分,重新编译之后生成的ORM引擎,替换到CI的数据库底层操作,相当于给五菱宏光装上了悍马的发动机,数据库操作性能能提升2倍。 5、代码模块分离,并加入自己写的模块、类库、配置加载类。 6、加入自己的日志记录类 Logger::get_instance("log_name"): 7、加入redis的通用实例化加载方法 Loader::redis("default"); 8、替换 PHP 5 到 PHP 7 , 开启代码缓存opcache。 9、支持Redis主从 立即下载

相关推荐

Keysight ADS新手必看:3分钟搞定TDR模拟的保姆级教程(附差分信号设置技巧)

本文为Keysight ADS新手提供TDR模拟的保姆级教程,详细介绍了从基础环境准备到差分信号设置的全流程。通过内置模板调用、待测器件连接和仿真结果解读,帮助用户快速掌握TDR模拟技术,特别包含差分信号配置技巧,提升信号完整性分析效率。

weixin_30872157的博客 195

用C语言写PHP扩展

用C语言写PHP扩展 1:预定义 在home目录,也可以其他任意目录,写一个文件,例如caleng_module.def 内容是你希望定义的函数名以及参数: int a(int x,int y)string b(string str,int n)2:到php源码目录的ext目录#cd /usr/local/php-5.4.0/ext/执行命令,生成对应扩展目录#./ext_skel --extna...

爱的海洋 444

瑞萨CS+仿真器高级配置指南:从原理到实战优化RX系列MCU调试

在嵌入式系统开发中,仿真器是进行早期验证和深度调试的核心工具。它通过精确模拟目标微控制器的指令集、内存和外设行为,构建了一个虚拟的硬件沙盒环境。其工作原理在于对CPU核心、时钟系统和外设接口的软件模拟,使开发者能在无物理硬件时进行代码逻辑验证、内存布局规划和时序分析。这项技术的核心价值在于大幅降低开发成本、加速问题定位,并支持复杂场景的复现与测试。在瑞萨RX系列MCU开发中,CS+集成开发环境内置的仿真器功能尤为强大。本文聚焦于**指令解码缓存**和**外设时钟比率**等关键配置的深度解析,阐述如何通过优化

cmff98425的博客 1119

利用php调用C语言 扩展函数

<br />第一步. 生成需要调用的so文件<br />1.  首先做一个简单的so文件:<br />/** * hello.c <br />* To compile, use following commands:<br /> *   gcc -O -c -fPIC -o hello.o hello.c<br />  *   gcc -shared -o libhello.so hello.o <br />*/<br />int hello_add(int a, int b)<br />{<br />  

hn3e21的专栏 829

TTL转RS422(B)工业级转换模块设计:从原理到实战部署

在工业自动化与嵌入式系统中,串行通信是实现设备间数据交换的基础。其核心原理在于通过特定的电气标准与协议,将数据位序列化后进行传输。RS422作为一种差分平衡传输协议,相比常见的TTL电平,在抗共模干扰与远距离传输能力上具有显著的技术优势,这使其成为工业现场总线、楼宇自动化等对可靠性要求严苛场景的优选方案。要实现TTL设备与RS422网络的稳定互联,关键在于设计一个能够完成单端信号到差分信号高质量转换的硬件模块。这涉及到差分总线收发器芯片的选型、包含终端电阻与TVS二极管的保护电路设计,以及遵循差分走线规则的

weixin_29195615的博客 340

电子工程师日记:用STM32F4的DCMI接口驱动OV2640时,那些数据同步的坑我都踩过了

本文分享了使用STM32F4的DCMI接口驱动OV2640摄像头时,在数据同步方面遇到的典型问题与解决方案。作者通过示波器分析PCLK相位、纠正DCMI_CR寄存器中同步信号极性的配置误区,并排查DMA传输瓶颈与FIFO溢出,最终实现了稳定的图像采集。文章为嵌入式工程师提供了宝贵的硬件调试经验与配置清单。

weixin_29189377的博客 156

c 的php扩展,如何用C写 PHP扩展

在我们编写自己的第一个php扩展之前,先了解一下php的整体架构和运行机制。 php的架构如图1所示。其中一个重要的就是SAPI(服务器端应用编程端口),它使得PHP可以和其他应用进行数据交互,把外部错综复杂的外部环境进行抽象化,为内部的php提供一套固定和统一的接口,使得php自身不受外部影响,保持一定的独立性。常见的SAPI有CGI,FastCGI,Shell的CLI,apache的mod_...

weixin_30227789的博客 345

Python3 ACM模式输入输出全攻略:从牛客网到华为机试的实战技巧

本文详细解析了Python3在ACM模式下的输入输出处理技巧,针对牛客网、华为机试等在线评测系统。文章从input()函数本质出发,总结了六种高频输入模式的处理模板,并提供了链表、二叉树等数据结构的I/O实战方案,最后给出性能优化与常见避坑指南,帮助开发者高效应对算法笔试。

zero1的博客 997

如何编写一个PHP的C扩展

为什么要用C扩展 C是静态编译的,执行效率比PHP代码高很多。同样的运算代码,使用C来开发,性能会比PHP要提升数百倍。IO操作如CURL,因为耗时主要在IOWait上,C扩展没有明显优势。 另外C扩展是在进程启动时加载的,PHP代码只能操作Request生命周期的数据,C扩展可操作的范围更广。 第一步 下载PHP的源代码,如php-5.4.16。解压后进入php-5.4.16\...

358

五子棋AI算法第一篇-我对谷歌Alphago的看法

最近Google宣布他们的围棋AI以5:0的战绩打败欧洲围棋三冠王。我一直对人工智能比较感兴趣,正好趁年前空闲的几天用JS写了一个五子棋的AI。其实很久以前就用自创的算法写过一个JAVA版的五子棋AI,不过棋力很不理想。这次用的是JS写的,所以无论任何平台上只要能打开网页的都可以玩。google爆出这个新闻之后,很多人觉得这是不是意味着电脑智商已经在人类之上了,围棋已经没有意义了之类的。甚至觉得这是

言川的博客 2万+

南方cass9.1【Frame主框架程序没有加载】解决方法(附安装包)

南方cass9.1【Frame主框架程序没有加载】解决方法。

weixin_46066938的博客 3万+

一步步入门编写PHP扩展

随着互联网飞速发展,lamp架构的流行,php支持的扩展也越来越多,这样直接促进了php的发展。 但是php也有脚本语言不可避免的问题,性能比例如C等编译型语言相差甚多,所以在考虑性能问题的时候最好还是通过php扩展来解决。

2301_77162959的博客 1153

[Unity开发] [PICO]避坑指南:PICO商店上传APP时PXR Platform APPID设定详解

PICO开发者上传Unity应用时常见的"APPID不符"问题,主要源于混淆了开发者后台两个不同位置的APPID。

每日出拳老爷子的博客 555

如何编写PHP扩展

 如何编写PHP扩展  翻译:taft@wjl.cn Ver 0.1 最后修改日期 2006/1/19 WJL Studio @ wjl.cn 2006                               目 录  

这就是我自己 5万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

php你都用过哪些扩展,用C编纂你自己的php扩展

用C编写你自己的php扩展本文链接:http://blog.youkuaiyun.com/ddjohn/article/details/42317675本文参考:http://blog.youkuaiyun.com/taft/article/details/596291如果你没写过php扩展,又是追求性能的极客,那么这篇文章肯定适合你:假如你有这样一个php程序function self_concat($string, ...

weixin_35275922的博客 98

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

PHP为什么必须使用C编写扩展?

维度解析架构匹配Zend Engine 是 C 项目,C 扩展可无缝集成性能极致绕过 PHP 层,直接操作内存与系统能力完整唯一能访问系统调用、C 库、Zend 内部结构生态成熟PECL、工具链、文档全部围绕 C哲学一致PHP 负责“表达业务”,C 负责“执行系统”如庖丁所言:“彼节者有间,而刀刃者无厚。C 语言正是那把“无厚之刃”——它不追求高级抽象,却能游走于 Zend Engine 与操作系统之间的天然缝隙将 PHP 的动态之美,锚定在系统性能的磐石之上。善用之,则“

长风破浪会有时的博客 884

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

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

编写一个简单的php C扩展

在项目中有时为了提高性能可能需要把一些商业逻辑编写成扩展来提高性能下面我们来编写一个简单的扩展吧环境 :下面开始具体的代码 下面我们来编写一个简单的扩展吧 注意此处生成的扩展是linux版的php扩展 故生成的扩展结尾是.so的文件 环境 : nginx:1.15.10 mysql:5.6.44 php:7.0 环境是LNMP 下面开始具体的代码 1. 找到php的安装目录下的ext文...

qq_35730500的博客 673

php c扩展的方式,如何用C 编写PHP扩展

如何用C 编写PHP扩展PHP取得成功的一个主要原因之一是她拥有大量的可用扩展。web开发者无论有何种需求,这种需求最有可能在PHP发行包里找到。PHP发行包包括支持各种数据库,图形文件格式,压缩,XML技术扩展在内的许多扩展。扩展API的引入使PHP取得了巨大的进展,扩展API机制使PHP开发社区很容易的开发出几十种扩展。。扩展主要的思想是:尽可能的从扩展编写者那里隐藏PHP的内部机制和脚本引擎...

weixin_42153615的博客 264

编写自己的php扩展函数

编写自己的php扩展函数Yorgo Sun 2002/01/22  php程序写的时间长了,自然对他所提供的功能了如指掌,他所提供的一大堆功能,真是觉得很好用,但有时候会发现php也缺少一些功能,自己总是会产生为php添加一些自定义的功能的想法。久而久之,终于今天憋不住了,开始动手研究如何添加。  下载一个php的源代码包,这里使用的是php 4.0.5版,解压后会看到php的

Yorgo Sun的园地 2355

c 写php扩展,如何用C语言编写PHP扩展的详解

1:预定义在home目录,也可以其他任意目录,写一个文件,例如caleng_module.def内容是你希望定义的函数名以及参数:int a(int x,int y)string b(string str,int n)2:到php源码目录的ext目录#cd /usr/local/php-5.4.0/ext/执行命令,生成对应扩展目录#./ext_skel --extname=caleng_modu...

weixin_39926191的博客 268

编写PHP扩展三步曲之一

简介如果你正在阅读这份指南,你大概已经有兴趣为php编写扩展了。如果没有兴趣...,唔,或许当你看完本文,你会发现这是一件你未曾尝试过的非常有趣的事情。这份指南假设你熟悉PHP语言和php解释器的编写语言:C。让我们来说说为什么要编写PHP扩展:1、由于抽象程度的问题,一些库或系统调用不能被PHP直接调用。2、在一些不常见的情况,你需要控制PHP的行为。3、你已经写好一些PHP代码,但你想让它运行

路 6898

c语言php扩展,如何用C语言编写PHP扩展的详解_PHP教程

1:预定义在home目录,也可以其他任意目录,写一个文件,例如caleng_module.def内容是你希望定义的函数名以及参数:int a(int x,int y)string b(string str,int n)2:到php源码目录的ext目录#cd /usr/local/php-5.4.0/ext/执行命令,生成对应扩展目录#./ext_skel --extname=caleng_modu...

weixin_42515101的博客 606

【PHP】编写php扩展

第一步下载PHP的源代码,如php-5.4.16。解压后进入php-5.4.16\ext目录。输入 ./ext_skel –extname=myext,myext就是扩展的名称,执行后生成myext目录。ext_skel是PHP官方提供的用于生成php扩展骨架代码的工具。cd myext。可以看到php_myext.h、myext.c、config.m4等几个文件。config.m4是AutoConf工具的配置文件,用来修改各种编译选项。第二步修改config.m4,将dnl PHP_ARG_WITH(my

红尘道,红尘练心 1062

给PHP编写扩展

给PHP编写扩展 PHP是一种脚本语言,好处是编程效率高,支持产品的快速迭代。但是与传统的编译语言相比,CPU和内存使用效率 不好。现在Ajax技术的广泛采用,加上SNS对动态要求较高,这些缺点更显得突出。常见的办法是直接用C/C++编写一个PHP扩展,重...

ddl_2014的博客 158
上一篇: 配置nginx支持PATH_INFO
下一篇: 为什么riak集群最好至少要五个节点以上
ddjohn
博客等级 码龄17年 36粉丝 135原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值