您的位置:首页 > 编程语言 > PHP开发

ubuntu 下第一个php扩展开发记录

2014-06-23 21:48 525 查看
今天尝试了我的第一个php扩展开发,记录下过程以及遇到的问题

一、环境准备

以前我已经用以下命令安装过php了

[plain] view
plaincopy

$ sudo apt-get install php5

其安装位置是

[plain] view
plaincopy

$ whereis php

php: /usr/bin/php /usr/lib/php /usr/bin/X11/php /usr/share/man/man1/php.1.gz

这种方式安装的php并不能直接进行php扩展开发,我们还需要

(1)安装php5-dev,不然没有编译扩展需要的phpize

[plain] view
plaincopy

$ sudo apt-get install php5-dev

[plain] view
plaincopy

$ whereis phpize

phpize: /usr/bin/phpize /usr/bin/X11/phpize /usr/share/man/man1/phpize.1.gz

(2)下载php5源码, 我准备保存在 ~/code/ 目录下

[plain] view
plaincopy

$ cd ~/code/

$ sudo apt-get source php5

下载的文件如下

[plain] view
plaincopy

$ ls

php5-5.4.9 php5_5.4.9-4ubuntu2.dsc

php5_5.4.9-4ubuntu2.debian.tar.gz php5_5.4.9.orig.tar.xz

二、生成扩展骨架文件

进入php的ext目录

[plain] view
plaincopy

$ cd ~/code/php5-5.4.9/ext/

执行一下命令

[plain] view
plaincopy

$ ./ext_skel --extname=xw

发现没有ext下权限没有权限创建目录,于是修改ext目录的权限

[plain] view
plaincopy

$ chmod 0777 ~/code/php5-5.4.9/ext

再次执行

[plain] view
plaincopy

$ ./ext_skel --extname=xw

ext下正常生成了xw目录,但目录中没有c文件,这和网络上教程所说有些不一样啊,仔细看了看命令的输出,发现有些报错说一些文件没有找到

[plain] view
plaincopy

cannot open /skeleton.c: No such file

vim 打开ext_skel文件

搜索“skeleton.c”,得

[plain] view
plaincopy

sed -f sedscript < $skel_dir/skeleton.c > $extname.c

继续搜索“skel_dir”

[plain] view
plaincopy

if test -z "$skel_dir"; then

skel_dir="/usr/lib/php5/<span style="font-family: Arial, Helvetica, sans-serif;">"</span>

fi

原来是这个路径,查看我的电脑确实没有这个目录,那搜索一下是否是在其他地方呢

[plain] view
plaincopy

$ locate /skeleton

/usr/share/php5/skeleton

这个路径应该是可以配置的,试试help看看

[plain] view
plaincopy

$ ./ext_skel --help

./ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]]

[--skel=dir] [--full-xml] [--no-help]

--extname=module module is the name of your extension

--proto=file file contains prototypes of functions to create

--stubs=file generate only function stubs in file

--xml generate xml documentation to be added to phpdoc-cvs

--skel=dir path to the skeleton directory

--full-xml generate xml documentation for a self-contained extension

(not yet implemented)

--no-help don't try to be nice and create comments in the code

and helper functions to test if the module compiled

明白了,修改原来的命令,增加--skel参数再次执行

[plain] view
plaincopy

$ ./ext_skel --extname=xw --skel=/usr/share/php5/skeleton

ok了,生成的文件正常了

三、编译扩展

进入xw目录 ,vim config.m4 把

[plain] view
plaincopy

dnl PHP_ARG_ENABLE(xw, whether to enable xw support,

dnl Make sure that the comment is aligned:

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

这3行前面的“dnl”注释去掉,变成

[plain] view
plaincopy

PHP_ARG_ENABLE(xw, whether to enable xw support,

Make sure that the comment is aligned:

[ --enable-xw Enable xw support])

依次执行

[plain] view
plaincopy

$ phpize

$ ./configure

$ make

$ sudo make install

若执行成功了,会显示

[plain] view
plaincopy

Installing shared extensions: /usr/lib/php5/20100525/

这时你在 /usr/lib/php5/20100525/ 目录找到 xw.so

四、修改php配置,运行检测

修改php.ini 配置文件,把xw.so扩展加入进去(这个就多不多说了)。若你不知道ini文件在哪,可以执行以下命令查看

[plain] view
plaincopy

$ php -ini

重启后,执行

[plain] view
plaincopy

$ php -r 'echo confirm_xw_compiled("xw"),"\n";'

若你能看到如下输出则你的扩展编译安装配置成功了

[plain] view
plaincopy

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

其实,这句话就是xw.c里面函数返回给php的,你可以找到,并尝试修改它,然后重复 make和make install 步骤

函数confirm_xw_compiled()是扩展骨架自带的一个自定义函数,是一个例子,也可用于检查是否安成功安装了扩展。其中“xw”是扩展名
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: