最近在公司做的事情就是php扩展开发,虽然我只负责c++代码的编写,但是了解扩展开发的流程还是很有必要的。

(本文介绍的是动态扩展,对静态扩展有兴趣的读者可自行google)

php扩展开发环境搭建可参考:

CentOS安装配置nginx和php

假设我们需要增加一个函数echodemo_string,对应的php代码如下:

function echodemo_string($param) {
$result = "your input is $param";
return $result;
}

1. 创建扩展框架

这里要用到一个工具:ext_skel,它位于php源码目录的ext目录下。

假设扩展的名字为echodemo。

首先进入ext目录,

创建文件echodemo.skel,编辑文件内容

string echodemo_string(string param)

然后执行:

./ext_skel --extname=echodemo --proto=echodemo.skel

执行完毕会生成 echodemo 目录,目录包含如下内容:

2. 修改配置

打开config.m4,将第10、11、12行前面的dnl去掉,dnl表示注释。

3. 实现功能

打开echodemo.c,echodemo_string函数定义如下:

修改该函数实现我们需要的功能,最终实现如下:

(vim主题太丑了,我得换换。。。)

4. 编译安装扩展

这里需要用到phpize生成configure文件,在我的机器上,phpize位于/usr/local/php/bin目录。

phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install

当出现 "Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/",表示新的扩展 echodemo.so 已经安装完成。

此时还需要做的一件事就是修改 php.ini 文件。

不知道 php.ini 文件在哪?直接 php -i | grep php.ini 。我的在 /usr/local/php/lib 目录下。

文件末尾追加一行:

extension=echodemo.so

5. 验证安装

重启php-fpm:service php-fpm restart,

检查扩展是否加载:

php -m | grep echodemo

如果顺利,终端会输出 echodemo。

检查扩展代码是否正确:

php -r "echo echodemo_string('hello world');"

注意,我外部用的双引号,函数参数用的单引号,这是为了避免一些转义错误。

参考资料:

PHP扩展开发:第一个扩展

Linux 下PHP扩展开发系列:二. 一个典型的扩展开发

最后配张图:

php扩展开发之hello world的更多相关文章

  1. PHP扩展开发之PHP的启动与终止

    PHP程序的启动可以看做是两个概念上的启动,终止也有两个概念上的终止.其中一个是PHP作为Apache(拿它举例,板砖勿扔)的一个模块的启动与终止, 这次启动php会初始化一些必要数据,比如与宿主Ap ...

  2. PHP 扩展开发之Zephir

    最近对代码进行性能分析后,发现两个耗时的地方:自动加载文件数太多:参数验证函数调用超过1000次.这也是许多php语言框架面临的问题,所以发展出来诸如Yaf,Swoole,Phalcon这些C语言扩展 ...

  3. 一次失败的PHP扩展开发之旅

    一次失败的PHP扩展开发之旅 By warezhou 2014.11.19 缘起 经过不断的持续迭代.我们部门的协程版网络框架(CoSvrFrame)最终出炉了!这本来是件喜大普奔的事情.可是随着新业 ...

  4. Android开发之ExpandableListView扩展(BaseExpandableListAdapter的使用)(完整版)

    Android开发之ExpandableListView扩展(BaseExpandableListAdapter的使用)(完整版)

  5. Android混合开发之WebView使用总结

    前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结. 混合开发相关博客: Android混合开发之WebView使用总结 Android混合开 ...

  6. Android Studio快速开发之道

    概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. P ...

  7. Cocos2d-x 3.x游戏开发之旅

    Cocos2d-x 3.x游戏开发之旅 钟迪龙 著   ISBN 978-7-121-24276-2 2014年10月出版 定价:79.00元 516页 16开 内容提要 <Cocos2d-x ...

  8. DarkStone - 跨平台移动应用开发之 Flex 的崛起

    我的好友Ds 发布一个flex的消息.我帮忙转发 DarkStone - 跨平台移动应用开发之 Flex 的崛起 (2013-08-20 22:28:32)     此文章由 周戈 (DarkSton ...

  9. 【转载】浅谈游戏开发之2D手游工具

    浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android  程序设计: 其它  编程语言:   引擎/SDK ...

随机推荐

  1. python3(七)dict list

    # dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. # dict内部存放的顺序和key放入的顺序是没有关系的 # 根据同学的名字 ...

  2. spark本地开发环境搭建及打包配置

    在idea中新建工程 删除新项目的src,创建moudle 在父pom中添加spark和scala依赖,我们项目中用scala开发模型,建议scala,开发体验会更好(java.python也可以) ...

  3. 使用 Python 查看局域网内存活主机

    1 安装 (如果误用了 pip insatll nmap的话,要先 pip uninstall nmap) pip install python-nmap Nmap 是一款用于网络发现和安全审计的网络 ...

  4. tf.train.AdamOptimizer 优化器

    adaptive moment estimation(自适应矩估计) tf.train.AdamOptimizer( learning_rate=0.001, beta1=0.9, beta2=0.9 ...

  5. springboot项目war包部署及出现的问题Failed to bind properties under 'mybatis.configuration.mapped-statements[0].

    1.修改pom文件 修改打包方式 为war: 添加tomcat使用范围,provided的意思即在发布的时候有外部提供,内置的tomcat就不会打包进去 <groupId>com.scho ...

  6. 怎么高效学习python?其实只需要这个方法,快速掌握不叫事儿

    很多人想学python,并且希望能快速高效的学习python,但一直都没有找到合适的方法,下面谈一下我的方法. 首先,高效入门python 怎么高效学习python?想要高效,就要先搞清楚你这个阶段, ...

  7. layoutInflater参数解析与源码分析

    关于LayoutInflater方法,无论是在listview的适配器中,还是在动态添加view的时候,都会出现它的身影,最开始我在看<第一行代码>时,不知道这个方法实际的参数到底指的是什 ...

  8. 对于之间不平凡的我,为什么会选择IT!(上)

    我相信有很多小伙伴看了我发布的文章后,不知道对大家有无启发,在这里我都非常感谢大家的收看,因为现在收疫情影响,我也看到很多朋友私信我,看你经历这么多是经历了什么,如果大家在上一篇发现的时候会看见我父亲 ...

  9. Sentry实时应用错误跟踪系统在Kubernetes中私有化部署

    应用错误跟踪系统:对软件系统运行过程中产生的错误日志进行收集从而实现监控告警. 虽然软件错误❌是不可避免的,但是可以降低错误数. 提高对错误的治理能力能让错误带来的损失降到最低 ​

  10. Python程序设计实验报告四:循环结构程序设计(设计型实验)

    安徽工程大学 Python程序设计 实验报告 班级   物流191   姓名  姚彩琴  学号3190505129 成绩 日期     2020.4.8     指导老师       修宇 [实验名称 ...