为什么要学PHP扩展开发?学会PHP扩展开发后,能增加你解决问题的能力。如,别人用PHP实现了一个功能。执行一次需要耗时10毫秒。而你用扩展实现了同样的功能,可能就只用1毫秒。

PHP扩展的应用场景

第一:当原有的PHP代码实现出现性能瓶颈的时候,可以考虑通过PHP扩展的方式实现同样的功能。一般用于一些基础组件。如,解析xml为数组。

第二:纯PHP代码无法实现的功能,可以考虑通过PHP扩展调用其他相关库实现。如,我搞的tclip扩展。需要调用opencv的lib库。

目标:用扩展实现自定义函数输出hello word。

//自定义扩展 在扩展中实现一个myecho方法,调用myecho方法后,输出 hello word。

echo myecho();// 输出 hello word

?>

第一步:生成代码

PHP为我们提供了生成基本代码的工具 ext_skel。这个工具在PHP源代码的./ext目录下。

$ cd php_src/ext/

$ ./ext_skel --extname=myecho

extname参数的值就是扩展名称。执行ext_skel命令后,这样在当前目录下会生成一个与扩展名一样的目录。

第二步,修改config.m4配置文件

config.m4的作用就是配合phpize工具生成configure文件。configure文件是用于环境检测的。检测扩展编译运行所需的环境是否满足。现在我们开始修改config.m4文件。

$ cd ./myecho

$ vim ./config.m4

打开,config.m4文件后,你会发现这样一段文字。

dnl If your extension references something external, use with:

dnl PHP_ARG_WITH(myecho, for myecho support,

dnl Make sure that the comment is aligned:

dnl [ --with-myecho Include myecho support])

dnl Otherwise use enable:

dnl PHP_ARG_ENABLE(myecho, whether to enable myecho support,

dnl Make sure that the comment is aligned:

dnl [ --enable-myecho Enable myecho support])

其中,dnl 是注释符号。上面的代码说,如果你所编写的扩展如果依赖其它的扩展或者lib库,需要去掉PHP_ARG_WITH相关代码的注释。否则,去掉 PHP_ARG_ENABLE 相关代码段的注释。我们编写的扩展不需要依赖其他的扩展和lib库。因此,我们去掉PHP_ARG_ENABLE前面的注释。去掉注释后的代码如下:

dnl If your extension references something external, use with:

dnl PHP_ARG_WITH(myecho, for myecho support,

dnl Make sure that the comment is aligned:

dnl [ --with-myecho Include myecho support])

dnl Otherwise use enable:

PHP_ARG_ENABLE(myecho, whether to enable myecho support,

Make sure that the comment is aligned:

[ --enable-myecho Enable myecho support])

第三步,代码实现

修改myecho.c文件。实现myecho方法。 找到PHP_FUNCTION(confirm_myecho_compiled),在其上面增加如下代码:

PHP_FUNCTION(myecho)

{

zend_string *strg;

strg = strpprintf(0, "hello word");

RETURN_STR(strg);

}

找到PHP_FE(confirm_myecho_compiled,NULL), 在上面增加如下代码:

PHP_FE(myecho, NULL)

修改后的代码如下:

const zend_function_entry myecho_functions[] = {

PHP_FE(myecho, NULL)

PHP_FE(confirm_myecho_compiled,NULL)/* For testing, remove later. */

PHP_FE_END/* Must be the last line in myecho_functions[] */

};

第四步,编译安装

php安装完后在bin目录下有个php-config。

php-config是一个脚本文件。用于获取所安装的php配置的信息。

编译扩展的步骤如下:

$ phpize

$ ./configure --with-php-config=/usr/local/php/bin/php-config

$ make && make install

结果

编辑php.ini文档,创建extension_dir的目录(如果已经创建扩展目录请忽略),将编译好的扩展文件复制到extension下面

将extension_dir = “./” 改成

extension_dir = "/usr/local/php/lib/php/extensions"

修改php.ini文件,增加如下代码:

[myecho]

extension = myecho.so

然后执行,php -m 命令。在输出的内容中,你会看到myecho字样。

第五步,调用测试

调用ext/myecho/myecho.php 看输出的内容是否符合预期

输出:

Functions available in the test extension:

myecho

confirm_myecho_compiled

Congratulations! You have successfully modified ext/myecho/config.m4. Module myecho is now compiled into PHP.

或自己写php脚本调用myecho函数

echo myecho();

?>

输出内容:

myecho

Windows环境开发过程类似:

1、下载php源码

2、到ext目录下找到ext_skel_win32.php

在dos下运行

php ext_skel_win32.php --extname=myecho

//使用php解释这个php文件

//如果没有找PHP,说明你的PHP不在环境变量中,设置

3、如果成功会在ext目录下面生成一个myextension的目录,那么你的扩展的源码就在这个文件夹下面了

你会看到.dsp文件,用vc打开这个文件。

4、添加你自己的扩展函数

在h头文件中找到

PHP_FUNCTION(confirm_idict_compiled); /* For testing, remove later. */

在下面添加自己的函数

PHP_FUNCTION(myecho)

{

zend_string *strg;

strg = strpprintf(0, "hello word");

RETURN_STR(strg);

}

在:

PHP_FE(confirm_idict_compiled, NULL)下面添加自已的函数:

PHP_FE(myecho, NULL)

查找:

PHP_FUNCTION(confirm_idict_compiled)

按照这个函数在加入自己的函数

5、编译成功。

6、测试、加载:

将生成的myecho.dll拷贝到php的extension目录下

extension = myecho.dll

7、重启apache,在自己php中测试

echo myecho();

?>

8、成功

——————–

如果扩展是用VC6编译的,PHP是用VC9编译的,VC编译版本不匹配,造成无法加载成功。

解决方法:

在config.w32.h文件中加入编译版本

#define PHP_COMPILER_ID “VC9” //保持一致

编译成功

php7 ext skel_基于PHP7的PHP扩展开发之一(hello word)相关推荐

  1. php7 定义变量,基于PHP7的PHP扩展开发之七(定义变量)

    目的:熟悉在PHP扩展里面如何定义变量 要实现的PHP代码如下: class lostphp{} $lng = 2; $str = "abc"; $arr = array(1,'a ...

  2. 基于Mozilla Thunderbird的扩展开发(四)---修改Thunderbird源代码实现自动保存附件...

    <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace ...

  3. 基于Mozilla平台的扩展开发(续)----XPCOM组件篇

    源代码下载:HelloWorld示例.rar 在<浅谈基于Mozilla ThunderBird的扩展开发>这篇入门文章中简单介绍了基于Mozllia平台进行扩展开发的基础知识,但仍然欠缺 ...

  4. php7自定义异常处理,基于PHP7错误处理与异常处理方法(详解)

    PHP7错误处理 PHP 7 改变了大多数错误的报告方式.不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出. 这种 Error 异常可以像 Exception 异常一 ...

  5. ibm java 工具_Eclipse是由IBM开发的一款功能完整且成熟的IDE集成开发环境,它是一个开源的、基于Java的可扩展开发平台,是目前最流行的Java语言开发工具。...

    [判断题]由运放组成的任何应用电路都可以采用 " 虚短 " 和 " 虚断 " 分析法.( ) [单选题]某污水厂初沉池设计流量为10000m2/d,进水悬浮物浓 ...

  6. php 扩展 返回字符串,基于PHP7的PHP扩展开发之四(字符串的处理)

    目的:熟悉字符串在PHP扩展里面如何处理 要实现的PHP代码如下: 1.当字符串不包含指定前缀字符串时,把前缀字符串和被检测字符合并返回. 2.当字符串包含指定前缀字符串时,原样返回. 我们将使用PH ...

  7. 于Mozilla平台的扩展开发

    [url]http://www.cnblogs.com/phinecos/archive/2008/04/25/1171614.html[/url] 于Mozilla平台的扩展开发(续)----XPC ...

  8. php7 有ext skel吗,PHP扩展开发系列02 - 老司机起步之函数

    上一篇扩展开发引导文章中.创建了编写扩展的三个基本文件.或许你会有个疑问 PHP没有类似的自动生成项目框架的工具吗? 当然有. 这篇文章就开始介绍使用 "php-ext-cli" ...

  9. php7扩展开发教程,Linux下PHP7扩展开发入门教程1:扩展开发流程

    本文将会基于PHP7开发一个最简单的扩展,随便取个名learn_ext,编译生成一个learn_ext.so文件,最终调用可以在php中调用learn_ext扩展中的函数来输出一个hello worl ...

最新文章

  1. 中文发音关系频谱的猜想
  2. 百度不收录你网站的原因
  3. 执行游戏时出现0xc000007b错误的解决方法
  4. Linux Socket通信 C/S模型
  5. Python-Flask实现电影系统管理后台
  6. what's the differences between readonly const in C# 在C#中readonly和const的区别
  7. USB-C 端口在您的 Mac 上无法使用如何解决?
  8. ECSHOP首页调用指定分类推荐商品/热卖商品/新品商品
  9. C# 把文件和文件夹 放到回收站 (出现Unknown err (0x402) 无法删除 文件:无法读取源文件或磁盘 解决)
  10. vue富文本编辑器组件
  11. PS常用快捷键(持续更新)
  12. python量化策略——改进的美林时钟轮动策略(三)
  13. 【Linux】动态库与静态库
  14. 【cocos2d-x制作别踩白块儿】第六期:游戏交互实现
  15. Pushed master to new branch origin/master
  16. linux账户密码 群组放在,linux基础命令学习(四)用户与群组
  17. APP架构一般性分类
  18. blackarch linux 的安装(vmware虚拟机)
  19. 基于环境小卫星的湖泊水质遥感监测
  20. TensorFlow 中的 BatchToSpaceOp

热门文章

  1. Android基础之Java接口
  2. TypeScript 2.0 已发布
  3. Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求
  4. 团队项目第一阶段冲刺站立会议11(4月28日)
  5. hdu 5273 Dylans loves sequence 逆序数简单递推
  6. 2、String相关问题
  7. 运维提升首选技能KubernetesPrometheus,你了解多少?(文末福利)
  8. 某程序员吐槽:免费教妹子Java编程,妹子却不让自己找她闲聊!
  9. 大型网站压力测试及优化方案
  10. 2018程序员必备碎片化学习工具(年度精选)