转载请注明来源:https://www.cnblogs.com/hookjc/

PHP 5.2 环境的扩展(PHP Extension)

需求:比如开发一个叫做 heiyeluren  的扩展,扩展里就一个函数 heiyeluren_test(),输入一个字符串,函数返回:Your input string: xxxxx。
要求:了解C/C++编程,熟悉PHP编程
环境:下载一份php对应版本的源码,我这里是 php-5.2.6,先正常安装php,假设我们的php安装在 /usr/local/php 目录,源码在 /root/soft/php/php-5.2.6/,现在开始!

步骤一:生成扩展框架


cd /root/soft/php/php-5.2.6/ext
./ext_skel --extname=heiyeluren
cd /root/soft/php/php-5.2.6/ext/heiyeluren
vi config.m4
打开文件后去掉 dnl ,获得下面的信息:
PHP_ARG_ENABLE(heiyeluren, whether to enable heiyeluren support,
[  --enable-heiyeluren           Enable heiyeluren support])
保存退出.
(图01)

第二步:编写代码

vi php_heiyeluren.h
找到:PHP_FUNCTION(confirm_heiyeluren_compiled); ,新增一行:
PHP_FUNCTION(heiyeluren_test); 
保存退出。
(图02)

vi heiyeluren.c
数组里增加我们的函数,找到 zend_function_entry heiyeluren_functions[],增加:
PHP_FE(heiyeluren, NULL)
(图03)

再到 heiyeluren.c 文件最后面增加如下代码:
PHP_FUNCTION(heiyeluren_test)
{
    char *arg = NULL;
    int arg_len, len;
    char *strg;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
        return;
    }

len = spprintf(&strg, 0, "Your input string: %s/n", arg);
    RETURN_STRINGL(strg, len, 0);
}
保存退出。
(图04)

第三步:编译安装

1. gcc编译:

编译成.o文件 gcc -fpic -DCOMPILE_DL_HAOSOFT_PHP_MODULE=1 -I/usr/local/include -I. -I../main -I.. -I../TSRM -I../Zend -c -o heiyeluren/heiyeluren.o heiyeluren/heiyeluren.c

编译成.so文件 gcc -shared -L/usr/local/lib -rdynamic -o heiyeluren/heiyeluren.so heiyeluren/heiyeluren.o


2. make编译:
cd /root/soft/php/php-5.2.6/ext/heiyeluren
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install

现在看看是不是有个 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/heiyeluren.so
编辑php.ini,把扩展加入进去:
vi /usr/local/php/lib/php.ini
在[PHP]模块下增加:
extension = heiyeluren.so
保存退出。]

(图05)

注意:如果你不存在扩展文件目录,或者安装报错,那么可以自行建立这个目录,然后把扩展拷贝到目录下,然后记得把 php.ini 文件中的 extension_dir 修改为该目录:
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
(图06)

第四步:检查安装结果
现在看看模块加载了没有:
/usr/local/php/bin/php -m,应该会打印出:
[PHP Modules]
...
heiyeluren
...
[Zend Modules]

然后重启apache,输出 phpinfo() ,应该能够看到:
heiyeluren
heiyeluren support enabled 
(图07)

看看函数是否存在并且调用,在web目录下建立:heiyeluren.php
<?php
echo "<pre>";
print_r(get_loaded_extensions());
print_r(get_extension_funcs('heiyeluren'));
echo heiyeluren_test('My first php extension');
echo "</pre>";
?>
访问apache,应该能够看到:
Array
(
    ...
    [33] => heiyeluren
)
Array
(
    [0] => confirm_heiyeluren_compiled
    [1] => heiyeluren_test
)
Your input string: heiyeluren

查看详细信息:http://wdtxslqnn.blog.163.com/blog/static/44246485201291510413434/ 


Windows 下扩展

第一步:准备

1、php源码包和windows下的二进制包,以及安装Visual C++,并把Microsoft Visual Studio/Common/MSDev98/Bin的绝对路径添加到windows环境变量

2、解压源码包到d:/php_src

3、进入d:/php_src/ext目录,复制skeleton文件夹,并重命名为要开发扩展的名字,本例为“linvo”

4、把二进制包中dev目录下的php5ts.lib文件,拷入新建的linvo目录

5、编辑linvo目录中的php_skeleton.h、skeleton.c、skeleton.dsp这三个文件,替换内容中所有extname为linvo,EXTNAME为LINVO。(严格区分大小写)

第二步:编码

6、编辑php_skeleton.h文件(头文件)

在PHP_FUNCTION(confirm_linvo_compiled);下面编写

PHP_FUNCTION(hello);

声明一个hello函数

7、编辑skeleton.c文件(主文件)

在PHP_FE(confirm_linvo_compiled, NULL) 下面编写

PHP_FE(hello, NULL)

这是函数入口,下面该写函数主体了

找到PHP_FUNCTION(confirm_test_compiled)函数,该函数是测试函数,在该函数后面新写一个函数

PHP_FUNCTION(hello)

{

char *arg = NULL;

int arg_len, len;

char *strg;

/* 接收参数 */

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {

return;

}

len = spprintf(&strg, 0, "Hello,%s", arg);

RETURN_STRINGL(strg, len, 0);

}

第三步:编译

8、运行cmd命令行,进入d:/php_src/ext/linvo目录

9、输入 msdev linvo.dsp /MAKE "linvo - Win32 Release_TS"(找不到msdev命令的可以使用VC 6.0的绝对路径)

10、如果没有错误,则在php_src目录下会生成一个Release_TS文件夹,里面就是编译好的php_linvo.dll扩展

第四步:使用

11、将其拷入运行环境中的php扩展目录ext

12、编辑php.ini添加extension=php_linvo.dll,重启apache

13、在php文件中执行如下语句

echo hello('Linvo');

将输出

Hello,Linvo

14、通过echo phpinfo();也可看到扩展已加载的信息

linvo

linvo support enabled

来源:python脚本自动迁移

编写PHP扩展的更多相关文章

  1. 用Zephir编写PHP扩展

    自从NodeJS,和Golang出来后,很多人都投奔过去了.不为什么,冲着那牛X的性能.那PHP的性能什么时候能提升一下呢?要不然就会被人鄙视了.其实大牛们也深刻体会到了这些威胁,于是都在秘密开发各种 ...

  2. 使用golang 编写postgresql 扩展

      postgresql 的扩展可以帮助我们做好多强大的事情,支持的开发语言有lua.perl.java.js.c 社区有人开发了一个可以基于golang开发pg 扩展的项目,使用起来很方便,同时为我 ...

  3. 一步步入门编写PHP扩展

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

  4. 编写Postgres扩展之五:代码组织和版本控制

    原文:http://big-elephants.com/2015-11/writing-postgres-extensions-part-v/ 编译:Tacey Wong 在关于编写Postgres扩 ...

  5. 编写Postgres扩展之三:调试

    原文:http://big-elephants.com/2015-10/writing-postgres-extensions-part-iii/ 编译:Tacey Wong 在上一篇关于编写Post ...

  6. 编写Postgres扩展之四:测试

    原文:http://big-elephants.com/2015-11/writing-postgres-extensions-part-iv/ 编译:http://big-elephants.com ...

  7. 编写Postgres扩展之一:基础

    原文:http://big-elephants.com/2015-10/writing-postgres-extensions-part-i/ 编译:Tacey Wong Postgres提供了广泛的 ...

  8. 编写 Chrome 扩展——contextMenus 的快捷创建

    1 写在前面 最近使用 typescript 与 angular 编写 chrome 扩展, 对繁复的 contextMenus 创建步骤进行了提炼,并总结一个类 2 重构思路 2.1 一般方法 在编 ...

  9. 编写Chrome扩展程序

    Chrome的扩展程序很多,也很容易入门,可以来简单实现一下 看看,慢慢就能实现出一个扩展程序来 每个扩展程序应用一般会包含: 一个manifest清单文件 html文件 js文件 其他文件等 可以看 ...

  10. 【转】编写Chrome扩展程序

    Chrome的扩展程序很多,也很容易入门,可以来简单实现一下 看看,慢慢就能实现出一个扩展程序来 每个扩展程序应用一般会包含: 一个manifest清单文件 html文件 js文件 其他文件等 可以看 ...

随机推荐

  1. CS5211替代PS8625|设计EDP转LVDS转接屏方案|替代PS8625

    PS8625将作为DP或eDP接收器设备出现在视频源中,并将作为LVDS显示面板的LVDS源设备.该设备是一个完全集成的解决方案,不需要外部CPU.内存.时钟基准或电压调节器.PS8625可配置为从显 ...

  2. Java代码实体类生成SQL语句(Java实体类转数据库)

    有的时候把数据库删了,如果照着实体类重新创建数据库的话比较麻烦,可以使用这个工具,把代码复制到项目里面设置一下即可把Java代码中的实体类转换为SQL语句输出为一个文件,打开执行命令即可. 下载:ht ...

  3. 初识python:斐波拉契数(列表获取)

    使用 列表 获取斐波拉契数,代码如下: n = int(input('您想获取前几个斐波拉契数?\n')) li = [] for i in range(n): if i <= 1: li.ap ...

  4. django 字段默认值

    default 表示在页面中默认选中状态的值 页面为 来自为知笔记(Wiz)

  5. Nginx高并发简单配置

    https://www.cnblogs.com/sunjianguo/p/8298283.html 停用除SSH外的所有服务,仅保留nginx,优化思路主要包括两个层面:系统层面+nginx层面. 1 ...

  6. Python常用功能函数系列总结(一)

    本节目录 常用函数一:获取指定文件夹内所有文件 常用函数二:文件合并 常用函数三:将文件按时间划分 常用函数四:数据去重 写在前面 写代码也有很长时间了,总觉得应该做点什么有价值的事情,写代码初始阶段 ...

  7. Go语言中各种数据格式转换

    Go语言各种数据类型格式转换 package main import ( "encoding/json" "fmt" "reflect" & ...

  8. Python多线程、线程池及实际运用

    我们在写python爬虫的过程中,对于大量数据的抓取总是希望能获得更高的速度和效率,但由于网络请求的延迟.IO的限制,单线程的运行总是不能让人满意.因此有了多线程.异步协程等技术. 下面介绍一下pyt ...

  9. 【Java】IO

    文章目录 IO 说明 流的分类 关于相对路径 节点流 FileRead 对read()操作升级:使用read的重载方法 总结 FileWriter 复制操作 总结 FileInput(Output)S ...

  10. 基于Node和Electron开发了轻量版API接口请求调试工具——Post-Tool

    Electron 是一个使用 JavaScript.HTML 和 CSS 构建桌面应用程序的框架. 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 Java ...