c++开发php5 扩展


1,准备开发环境

      源码安装nginx, php, mysql

       nginx安装路径: /opt/server/nginx 源码路径: /home/leon/Downloads/nginx-1.5.6

       php路径: /opt/server/php 源码路径: /home/leon/Downloads/php-5.3.10

       mysql路径: /opt/server/mysql 源码路径: /home/leon/Downloads/mysql-5.1.63

2,开发PHP扩展


      a) 创建扩展工程

      cd /home/leon/Downloads/php-5.3.10/ext/

      ./ext_skel --extname=php5cpp     

      cd php5cpp/

      mv php5cpp.c php5cpp.cpp

      

     b) config.m4

     

      

PHP_ARG_ENABLE(php5cpp, whether to enable php5cpp support,
Make sure that the comment is aligned:
[  --enable-php5cpp           Enable php5cpp support])

if test "$PHP_PHP5CPP" != "no"; then
  PHP_REQUIRE_CXX()
  PHP_SUBST(PHP5CPP_SHARED_LIBADD)
  PHP_ADD_LIBRARY(stdc++, 1, PHP5CPP_SHARED_LIBADD)
  PHP_NEW_EXTENSION(php5cpp, php5cpp.cpp, $ext_shared)
fi

    c)  php_php5cpp.h

#ifndef PHP_PHP5CPP_H
#define PHP_PHP5CPP_H

#define PHP_VEHICLES_EXTNAME  "PHP5CPP"
#define PHP_VEHICLES_EXTVER   "0.1"

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

extern "C" {
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"

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

extern zend_module_entry php5cpp_module_entry;
#define phpext_php5cpp_ptr &php5cpp_module_entry

#ifdef PHP_WIN32
#	define PHP_PHP5CPP_API __declspec(dllexport)
#elif defined(__GNUC__) && __GNUC__ >= 4
#	define PHP_PHP5CPP_API __attribute__ ((visibility("default")))
#else
#	define PHP_PHP5CPP_API
#endif



PHP_MINIT_FUNCTION(php5cpp);
PHP_MSHUTDOWN_FUNCTION(php5cpp);
PHP_RINIT_FUNCTION(php5cpp);
PHP_RSHUTDOWN_FUNCTION(php5cpp);
PHP_MINFO_FUNCTION(php5cpp);

PHP_FUNCTION(confirm_php5cpp_compiled);	
PHP_FUNCTION(cpp_test_1);

#ifdef ZTS
#define PHP5CPP_G(v) TSRMG(php5cpp_globals_id, zend_php5cpp_globals *, v)
#else
#define PHP5CPP_G(v) (php5cpp_globals.v)
#endif

#endif	


d) php5cpp.cpp

#include "php_php5cpp.h"

static int le_php5cpp;

const zend_function_entry php5cpp_functions[] = {
	PHP_FE(confirm_php5cpp_compiled,	NULL)	
	PHP_FE(cpp_test_1, NULL)	
	PHP_FE_END	
};

zend_module_entry php5cpp_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
	STANDARD_MODULE_HEADER,
#endif
	"php5cpp",
	php5cpp_functions,
	PHP_MINIT(php5cpp),
	PHP_MSHUTDOWN(php5cpp),
	PHP_RINIT(php5cpp),		/* Replace with NULL if there's nothing to do at request start */
	PHP_RSHUTDOWN(php5cpp),	/* Replace with NULL if there's nothing to do at request end */
	PHP_MINFO(php5cpp),
#if ZEND_MODULE_API_NO >= 20010901
	"0.1", 
#endif
	STANDARD_MODULE_PROPERTIES
};


#ifdef COMPILE_DL_PHP5CPP
ZEND_GET_MODULE(php5cpp)
#endif

PHP_MINIT_FUNCTION(php5cpp)
{
	return SUCCESS;
}

PHP_MSHUTDOWN_FUNCTION(php5cpp)
{

	return SUCCESS;
}


PHP_RINIT_FUNCTION(php5cpp)
{
	return SUCCESS;
}

PHP_RSHUTDOWN_FUNCTION(php5cpp)
{
	return SUCCESS;
}

PHP_MINFO_FUNCTION(php5cpp)
{
	php_info_print_table_start();
	php_info_print_table_header(2, "php5cpp support", "enabled");
	php_info_print_table_end();

}


PHP_FUNCTION(confirm_php5cpp_compiled)
{
	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, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "php5cpp", arg);
	RETURN_STRINGL(strg, len, 0);
}

PHP_FUNCTION (cpp_test_1)
{
	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, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "php5cpp", arg);
	RETURN_STRINGL(strg, len, 0);
}


e) 编译安装

    phpize

    ./configure --with-php-config=/opt/server/php/bin/php-config

    make

    sudo make install


f) 修改php.ini

     sudo service php-fpm stop

     sudo gedit /opt/server/php/etc/php.ini

    加入 extension=php5cpp.so

    sudo service php-fpm start




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值