原文:http://kimi.it/496.html

http://blog.csdn.net/u011957758/article/details/72234075

----------------------------------------------------------------------

在上一篇文章《PHP扩展开发:安装PHP》我们已经将开发PHP扩展的PHP环境安装成功,那么接下来采用最简单直接的方式创建第一个扩展。

我们先假设业务场景,是需要有这么一个扩展,提供一个叫ccvita_string的函数,他的主要作用是返回一段字符。(这个业务场景实在太假,大家就这么看看吧)对应的PHP代码可能是这样:

function ccvita_string($str){
     $result = '<a href="'.$str.'">Link</a>';
     return $result;
}

第一步,生成代码
PHP为了扩展开发的方便,提供了一个类似代码生成器的工具ext_skel,具体可以参见说明
首先我们创建一个文件ccvita.skel,它的内容为

string ccvita_string(string str)

就是告诉ext_skel这个东西,我们要做的扩展里面有个函数叫ccvita_string。然后执行

cd MooENV/src/php-5.3.8/ext/
./ext_skel --extname=ccvita --proto=ccvita.skel
cd ccvita/

这时候,ccvita这个扩展的代码框架就已经出来了。

第二步,修改配置
然后修改config.m4文件将10、11、12三行最前面的dnl删除掉,就是将

dnl PHP_ARG_WITH(ccvita, for ccvita support,
dnl Make sure that the comment is aligned:
dnl [  --with-ccvita             Include ccvita support])

修改为

PHP_ARG_WITH(ccvita, for ccvita support,
Make sure that the comment is aligned:
[  --with-ccvita             Include ccvita support])

第三步,实现功能
修改源码ccvita.c文件
找到将ccvita_string这个函数修改为

PHP_FUNCTION(ccvita_string)
{
    char *str = NULL;
    int argc = ZEND_NUM_ARGS();
    int str_len;
    char *result;
 
    if (zend_parse_parameters(argc TSRMLS_CC, "s", &str, &str_len) == FAILURE)
        return;
 
    str_len = spprintf(&result, 0, "<a href=\"%.78s\">Link</a>", str);
    RETURN_STRINGL(result, str_len, 0);
}

第四步,编译扩展
保存后,开始编译

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

第五步,添加扩展
这时候,一切顺利的话,该扩展已经在modules/ccvita.so这个位置了。下面就是将这个扩展加入到PHP中去,让我们PHP程序可以调用到。

cp modules/ccvita.so /usr/local/php/ext/
vim /usr/local/php/etc/php.ini
extension=/usr/local/php/ext/ccvita.so #在php.ini文件最后增加这一行
service php-fpm restart #重启PHP服务
cp ccvita.php /data/www/wwwroot/default/

接下来就可以访问ccvita.php这个文件,测试扩展了。下一篇,将会涉及一些更深入的内容。

相关代码,可以在我的github上clone出来,地址:https://github.com/KimiChen/PHP-EXT

PHP扩展开发-测验成功的更多相关文章

  1. PHP扩展开发--实验成功

    原文:http://kimi.it/496.html http://blog.csdn.net/u011957758/article/details/72234075 ---------------- ...

  2. Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  3. PHP扩展开发(1):入门

    有关PHP扩展开发的文章.博客已经很多了,比较经典的有: TIPI项目(http://www.php-internals.com/,强烈推荐) <Extending and Embedding ...

  4. centos php扩展开发流程

    原文:centos php扩展开发流程 一.安装php centos 默认 yum 安装 php 版本为 5.3, 很多php框架基本上要求5.4以上版本,这时候不能直接 用 yum install ...

  5. 常见浏览器扩展开发笔记(chrome firefox 360 baidu qq sougou liebao uc opera)

    浏览器扩展开发貌似时下很冷门啊,但是不少企业还是有类似的应用,360的抢票插件啊,笔者最近在做的网页翻译扩展之类的.笔者在开发的过程中,遇到了不少坑,说是坑,说白了就是各个厂商支持的API不统一导致的 ...

  6. PHP扩展开发-1

    开发环境信息 1.基本环境信息如下: [root@localhost lib]# cat /etc/os-release NAME="CentOS Linux" VERSION=& ...

  7. 【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)

    写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均在这个demo里面:https://github ...

  8. php扩展开发实战教程(1)

    我的开发环境: Ubuntu16.04 apt方式安装的php5.6, apache,mysql等 由于我的本机用的是apt方式安装的php,所以我这里从头开始用最精简的方式,编译安装一个php5.4 ...

  9. 利用Visual Studio 2017的扩展开发(VSIX、ItemTemplate) 快速实现项目的半自动化搭建

    目录 0.引言 1.什么是Visual Studio项目模板 2.IWizad接口 3.通过Visual Studio扩展开发实现领域驱动开发 3.1 使用VSIX+ProjectTemplate创建 ...

随机推荐

  1. Drainage Ditches(网络流(EK算法))

    计算最大流,EK算法模板题. #include <stdio.h> #include <string.h> #include <queue> using names ...

  2. 通过JS制作一个简易数码时钟

    设计思路: 数码时钟即通过图片数字来显示当前时间,需要显示的图片的URL根据时间变化而变化. a.获取当前时间Date()并将当前时间信息转换为一个6位的字符串; b.根据时间字符串每个位置对应的数字 ...

  3. 【DP】书的复制

    原题链接__戳我噢 [思路] (区间)DP F[I][J]表示前i本书分给j个人用的最短时间 由于每一次j的状态由比j小的状态得出,所以要先枚举j,然后枚举i,接着枚举上一次抄书的人是谁 我觉得,难点 ...

  4. 脑洞大开加偏执人格——可持久化treap版的Link Cut Tree

    一直没有点动态树这个科技树,因为听说只能用Splay,用Treap的话多一个log.有一天脑洞大开,想到也许Treap也能从底向上Split.仔细思考了一下,发现翻转标记不好写,再仔细思考了一下,发现 ...

  5. D - Vanya and Fence

    Problem description Vanya and his friends are walking along the fence of height h and they do not wa ...

  6. jQuery获取及设置单选框、多选框、文本框

    获取一组radio被选中项的值 var item = $("input[@name=items][@checked]").val(); 获取select被选中项的文本 var it ...

  7. NoSQL概念

    NoSQL是非关系型数据库,即not only sql,key/value键值对存储. 现有Nosql DB产品:Redis/MongoDB/Memcached等等. SQL Sever是关系型数据库 ...

  8. Electron结合React开发环境遇到的问题

    链接 将create-react-app与electron集成在了一个项目中.但是在React中无法使用electron 当在React中使用require('electron')时就会报TypeEr ...

  9. servlet-后台获取form表单传的参数

    前台代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> & ...

  10. 复习java基础第四天(集合:List、Map、Collections、Enumeration)

    一.List: List 代表一个元素有序.且可重复的集合,集合中的每个元素都有其对应的顺序索引 List 允许使用重复元素,可以通过索引来访问指定位置的集合元素. List 默认按元素的添加顺序设置 ...