总结一下php5.2.16与apache2.0的扩展开发整个过程

开发环境:ubuntu 11(虚拟机环境) 开发平台: php-5.2.16.tar+apache2.0
PHP API 	20041225
PHP Extension 	20060613
Zend Extension 	220060519
说明一下为什么要用这么旧的版本,没原因,因为公司官方服务器是用这个版本... 之前用php5.3.10稳定版本已经做过一次,可是移植到php5.2.16上却用不了。发现原因应该是PHP与ZEND API不同!所以开发扩展时版本一定要一致啊! 一致的意思是:都是PHP5.2.X 或 PHP5.3.X 等等... 一:安装开发环境 如果用ubuntu自身的apt-get install 来安装apache与php的话不一定是你需要开发的版本!所以还是要自己下载源代码编译安装。 关于编译安装的问题这篇文章帮了我很大的忙 http://wangyan.org/blog/install-php-from-source.html 步骤如下:
  1. 下载源代码,建立好文件夹解压 ,例如我解压在 /home/fei/phpex/apache ,/home/fei/phpex/php5.2.16
  2. 先安装apache,
    • cd httpd-2.2.17/
    • ./configure --prefix=/usr/local/apache 
      
      (--prefix是安装到哪个目录,其他的就暂时不用了) 然后 make -> make install
    • 再配置apache : 将httpd 加入系统变量中,即直接编辑/etc/environment文件,或者新建软链接。建立软链接命令如下:
      ln -s /usr/local/apache/bin/httpd /usr/local/bin
      
    • 将apache加入开机自启动项:
       ln -s /usr/local/apache/bin/apachectl /etc/init.d/
                    update-rc.d apachectl defaults
      
      OK,下面可以用 httpd -k start(或restart)对apache服务器进行操作,至此,apache安装完。
  3. 再看PHP的安装:
    •            cd php-5.2.16 
                ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs
      
      后面还有很多项都是不太需要的... 然后 make -> make install
    • 将Apache与PHP5联系起来,在些之前,需要将php5也加到系统的环境变量中 同样方法,建立软链接:
                 ln -s /usr/local/php/bin/php /usr/local/bin
                 ln -s /usr/local/php/bin/phpize /usr/local/bin  (将phpize也加进去,等下要用)
      
      接下来设置apache的配置文件:/usr/local/apache/conf/httpd.conf 查找"AddType application/x-gzip .gz .tgz",在下面添加:
      AddType application/x-httpd-php .php
      
    • 到此,php与apache的连接完成,可以试一下 重启apache ,和运行 php -i
接下来开始我们真正的工作——开发PHP扩展
  1. 进入到php源代码目录ext目录下, cd /home/fei/phpex/php-5.2.16/ext/ 运行:
    ./ext_skel --extname=myext
    
    ext目录下会生成一个myext的文件夹
  2. 修改config.m4文件,去掉这三行的dnl注释
     PHP_ARG_ENABLE(myext, whether to enable myext support,
            Make sure that the comment is aligned:
            [  --enable-myext           Enable myext support])
    
    再在最后面加上C++的库引用声明:
    PHP_REQUIRE_CXX()
      PHP_SUBST(MYEXT_SHARED_LIBADD)
      PHP_ADD_LIBRARY_WITH_PATH(stdc++, "", MYEXT_SHARED_LIBADD)
      PHP_ADD_LIBRARY(stdc++,EXTRA_LDFLAGS)
      PHP_NEW_EXTENSION(myext, myext.cpp, $ext_shared)
    
  3. 下面就可以测试一下,看能不能用: 运行 phpize ,如果提示没装autoconf,就apt-get install autoconf装上就是 再./configure --with-php-config=/usr/local/php/bin/php-config (如果是apt-get install安装的php则不用--with那段了) 再make -> make install ; 会提示你的扩展 .so文件在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/目录下,
  4. 接下来要配置php.ini文件。这里建议大家先写一个测试文件
       
       
    
    这样可以一目了然的看到加载的到底是哪个php.ini文件 配置php.ini主要就是加上两句,这里extension_dir也要加上
    extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613"
          extension=myext.so
    
  5. 重启apache : httpd -k restart , 将myext文件夹下的myext.php复制到www文件夹下
  6. 浏览即可看到模块加载的消息 。
关于扩展文件php_myext.h , myext.cpp文件的具体写法: 头文件就是用来写函数声明的,其实并不用写太多,只写一个接收PHP代码中的参数的函数就可以了,例如 我的模块的主要处理函数是foo_main.cpp
 double foo(int a , int b)
{
    return (a+b)  ; 
}
这样我们只需要包含这个文件,再写一个接口函数如 php_foo() 首先在我们需要将引用包含的文件加上 extern "C" {} 分别是:php_myext.h头文件的
extern "C" {

#ifdef ZTS
#include "TSRM.h"
#endif

}
myext.cpp文件的:
extern "C" {

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
}

还有这里:
#ifdef COMPILE_DL_MATCHCMD
BEGIN_EXTERN_C()
ZEND_GET_MODULE(matchCmd)
END_EXTERN_C()
#endif
然后在php_myext.h头文件中加入函数声明:PHP_FUNCTION(php_foo);
#include "foo_main.cpp"
//添加到函数入口数组中
zend_function_entry myext_functions[] = {
	PHP_FE(php_foo,	NULL)
	{NULL, NULL, NULL}	/* 最后一行必须是这个,在windows下做dll时用复制skeleton的方法也需要改成这个 */
};
//再写函数主体
PHP_FUNCTION(php_foo)
{
	int a = 0 ;
        int b =0; 
        //参数在此处用zend_parse_parameters()接收,参数说明:看前面的文章...
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
		return;
	}	
        double rs = foo(a,b) ;//调用我们的cpp处理函数 
	RETURN_DOUBLE( rs );
}

这样就做好了接口了,当然php内核博大精深,可以去看一下这个手册: 《PHP扩展开发及内核应用》 接收在调用的地方使用php_foo(int,int)即可使用 例如:
 
 
如果上传到服务器上,一定要修改好权限!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值