包含phpextskel的词条

本文目录一览:

windows下开发并编译PHP扩展的方法

现在就简单说一在WINDOWS下开发PHP扩展的步骤:

首先需要准备的软件有:

cygwin

安装路径e:\app\cygwin

visual

studio

C++

6.0,

修改环境变量,把已经安装好的PHP路径设置为环境变量。在这里,假设我的PHP安装目录是:e:\app\php5.2.5,那么我把WINDOWS环境变量后面加上这个安装目录。方便一会儿使用php.exe。

PHP源代码,这里假设为e:\c_source_code\php-5.2.5

1、修改文件

“PHP源文件目录/ext/ext_skel_win32.php”,在这里就是:E:\c_source_code\php-5.2.5\ext,其中主要是修改其中的cygwin路径。$cygwin_path

=

‘e:\app\cygwin\bin’;

把$cygwin_path修改为你实际安装cygwin的路径。

2、在源代码ext目录也就是e:\c_source_code\php-5.2.5\ext下,执行

php

ext_skel_win32.php

–extname=EXT_NAME,此时会在ext目录下生成EXT_NAME目录,这个目录就是我们将要进行PHP扩展开发的框架。比如你运行php.exe

ext_skel_win32.php

–extname=foo,会在ext目录下生成foo目录。

3、将php-root\dev\php5ts.lib拷贝至

“ext/EXT_NAME”中。比如你要开发的PHP扩展名为foo,那么就需要把php-root\dev\php5ts.lib拷贝到PHP源文件目录\ext\foo中。

4、修改foo.c内容,编写我们需要的C代码。

5、进入EXT_NAME目录,打开EXT_NAME.dsp。

设置VC6工程,

设置菜单“组建”-“移除工程配置”,选中“Win

32

Release_TS”,

设置菜单“工程”,选中“Win

32

Release_TS”

打开Tab“连接”,设置“输出文件名”中的目录,

[可选]打开Tab“C/C++”,增加“预处理器定义”“,COMPILE_DL_EXT_NAME”(注意全大写,默认加入的),取消预定义“LIBZEND_EXPORTS”(否则不可引入zend函数)。

6、设置好以后,进行编译,会生成一个dll文件,文件名是EXT_NAME.dll,比如在我们的例子中就为foo.dll

把foo.dll拷到e:\app\ext目录下,并在php.ini里加上一行extension=foo.dll,重启一下apache,查看phpinfo();,会发现我们的PHP扩展foo()已经加载进来,已经可以使用这个foo扩展了。

CentOS 6.5 yum安装php后缺少ext_skel

如果是为了使用php的话建议使用lnmp一键安装包来安装,如果是要学习安装环境的过程,请忽略我的回答。

lnmp安装脚本:

wget -c h t t p://soft.vpser.net/lnmp/lnmp1.1-full.tar.gz tar zxf lnmp1.1-full.tar.gz cd lnmp1.1-full ./centos.sh

将上面网址中的http中间的空格删掉,防止被屏蔽,回车后会自动从官方下载并安装,详细教程可以去lnmp官方网站查看

如何编写PHP扩展

PHP取得成功的一个主要原因之一是她拥有大量的可用扩展。web开发者无论有何种需求,这种需求最有可能在PHP发行包里找到。PHP发行包包括支持各种数据库,图形文件格式,压缩,XML技术扩展在内的许多扩展。

扩展API的引入使PHP3取得了巨大的进展,扩展API机制使PHP开发社区很容易的开发出几十种扩展。现在,两个版本过去了,API仍然和PHP3时的非常相似。扩展主要的思想是:尽可能的从扩展编写者那里隐藏PHP的内部机制和脚本引擎本身,仅仅需要开发者熟悉API。

有两个理由需要自己编写PHP扩展。第一个理由是:PHP需要支持一项她还未支持的技术。这通常包括包裹一些现成的C函数库,以便提供PHP接口。例如,如果一个叫FooBase的数据库已推出市场,你需要建立一个PHP扩展帮助你从PHP里调用FooBase的C函数库。这个工作可能仅由一个人完成,然后被整个PHP社区共享(如果你愿意的话)。第二个不是很普遍的理由是:你需要从性能或功能的原因考虑来编写一些商业逻辑。

如果以上的两个理由都和你没什么关系,同时你感觉自己没有冒险精神,那么你可以跳过本章。

本章教你如何编写相对简单的PHP扩展,使用一部分扩展API函数。对于大多数打算开发自定义PHP扩展开发者而言,它含概了足够的资料。学习一门编程课程的最好方法之一就是动手做一些极其简单的例子,这些例子正是本章的线索。一旦你明白了基础的东西,你就可以在互联网上通过阅读文挡、原代码或参加邮件列表新闻组讨论来丰富自己。因此,本章集中在让你如何开始的话题。在UNIX下一个叫ext_skel的脚本被用于建立扩展的骨架,骨架信息从一个描述扩展接口的定义文件中取得。因此你需要利用UNIX来建立一个骨架。Windows开发者可以使用Windows ext_skel_win32.php代替ext_skel。

然而,本章关于用你开发的扩展编译PHP的指导仅涉及UNIX编译系统。本章中所有的对API的解释与UNIX和Windows下开发的扩展都有联系。

如何编写一个PHP的C扩展

一、首先下载PHP源码包,假设源码包目录为:/software/php-5.2.13

一、首先下载PHP源码包,假设源码包目录为:/software/php-5.2.13

# cd /software/php-5.2.13/ext

二、假设我们要开发一个名为caleng_module的扩展,该扩展包含两个函数:a–处理两个整型相加和b-处理字符串重复输出;

1、首先编写一个函数定义文件,该文件编写函数原型后缀为def,假设为:caleng_module.def

int a(int x, int y)

string b(string str, int n)

2、通过扩展骨架生成器,将在ext目录下自动建立扩展目录caleng_module

# ./ext_skel –extname=caleng_module –proto=caleng_module.def

3、修改配置文件: # vim /software/php-5.2.13/ext/caleng_module/config.m4,将如下行的注释标签”dnl”去掉,修改后如下所示:

PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support,

Make sure that the comment is aligned:

[ –enable-myfunctions Enable myfunctions support])

4、完善函数a和b的功能: # vim /software/php-5.2.13/ext/caleng_module/caleng_module.c

PHP_FUNCTION(a)

{

int x, y, z;

int argc = ZEND_NUM_ARGS();

if (zend_parse_parameters(argc TSRMLS_CC, “ll”, x, y) == FAILURE)

return;

z = x + y;

RETURN_LONG(z);

}

PHP_FUNCTION(b)

{

char *str = NULL;

int argc = ZEND_NUM_ARGS();

int str_len;

long n;

char *result;

char *ptr;

int result_length;

if (zend_parse_parameters(argc TSRMLS_CC, “sl”, str, str_len, n) == FAILURE)

return;

result_length = str_len * n;

result = (char *) emalloc(result_length + 1);

ptr = result;

while (n–) {

memcpy(ptr, str, str_len);

ptr += str_len;

}

*ptr = ‘\0’;

RETURN_STRINGL(result, result_length, 0);

}

三、编译安装,假设php的安装目录为:/usr/localhost/webserver/php

# cd /software/php-5.2.13/ext/caleng_module

# /usr/localhost/webserver/php/bin/phpize

# ./configure –with-php-config=/usr/localhost/webserver/php/bin/php-config

# make

# make install

现在将在/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613目录下生成caleng_module.so文件

在php.ini配置文件中加入: extension=caleng_module.so.

搞定收工

如何在php扩展中封装一个c++类

首先,要到了Query归一化的C++版本源代码。

query归一化

引用第三方的类库有两种方法,一种是静态引用,一种是动态引用,推荐使用静态引用,因为静态引用的情况下,会把类库打包到php的扩展.SO文件中,这样我们不必担心依赖关系,带着类库到处跑了。

先用gcc产生.o文件,再用.o产生 最终的静态库 .a 文件

gcc -c -fpic queryword.cpp tradmap.cpp transcode.cpp -I . -O2

ar -r libqueryword.a queryword.o tradmap.o transcode.o

上边图中有产生的.o 和 .a文件

如果要动态编译so的话,就是这个:

gcc -c -fpic -O3 queryword.cpp tradmap.cpp transcode.cpp -I .

gcc -shared queryword.o transcode.o tradmap.o -o libqueryword.so

好,现在有了libqueryword.a静态库,我们就可以开始做我们的扩展了。

先使用ext_skel工具生成我们框架的骨架.

./ext_skel –extname=queryword

把上边的静态库放到 ./lib 目录下。

然后修改config.m4文件。

去掉一些注释符 dnl, 再添加两行,最后config.m4里,有用的就是这几行。

PHP_ARG_ENABLE(queryword, whether to enable queryword support,

Make sure that the comment is aligned:

[ –enable-queryword Enable queryword support])

if test “$PHP_QUERYWORD” != “no”; then

PHP_ADD_INCLUDE(./lib)

PHP_ADD_LIBRARY(stdc++, 1, QUERYWORD_SHARED_LIBADD)

PHP_ADD_LIBRARY_WITH_PATH(queryword, ./lib, QUERYWORD_SHARED_LIBADD)

PHP_REQUIRE_CXX()

PHP_SUBST(QUERYWORD_SHARED_LIBADD)

PHP_NEW_EXTENSION(queryword, queryword.cpp, $ext_shared)

fi

其中:

PHP_REQUIRE_CXX()用于指定这个扩展用到了C++

PHP_ADD_LIBRARY(stdc++, 1, QUERYWORD_SHARED_LIBADD) 用于将标准C++库链接进入扩展

PHP_NEW_EXTENSION用于指定有哪些源文件应该被编译,文件和文件之间用空格隔开.ext_skel默认生成的模块框架是针对C的,我们要使用C++,那以上说明的两个宏就是必须的.另外还要把queryword.c改名成queryword.cpp,所以PHP_NEW_EXTENSION原本包括的queryword.c也要修改.

默认生成的queryword.c(现在改名为queryword.cpp)了,已经包含了一个测试性质的导出函数,通过那个例子就可以大概明白怎么添加自己的函数了. zend_function_entry是导出函数列表, zend_module_entry描述了模块的信息. 不过因为是C++了,还是有几点要修改的,否则跑不起来:

原创文章,作者:NUOS,如若转载,请注明出处:https://www.506064.com/n/147585.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
NUOSNUOS
上一篇 2024-11-01 14:10
下一篇 2024-11-01 14:10

相关推荐

发表回复

登录后才能评论