如何利用C自定义实现PHP扩展
由于有一部分代码需要加解密,所以需要扩展PHP模块,于是简单的使用base64来实现简单的加密算法。因为时间的关系,这里主要是对如何实现PHP扩展做一个概述和记录,并不涉及到加密算法的具体实现,等有空再补上。
1、环境:
centos 5
php 5.1.6
autoconf 2.59
automake 1.96
libtool
bison
flex
re2c
2、创建模块
2.1 转到php源码目录扩展包目录下
cd /usr/include/php/ext
2.2 创建一个叫做itbeing的文件夹(这里我们的模块名称就叫做itbeing了)
mkdir itbeing
cd itbeing
2.3 创建config.m4文件,config.m4 文件使用 GNU autoconf 语法编写,该文件的主要作用是 文件告诉系统构建系统哪些扩展 configure 选项是支持的,你需要哪些扩展库,以及哪些源文件要编译成它的一部分。
- PHP_ARG_ENABLE(itbeing,
- ?? ? ? ?[Whether to enable the "itbeing" extension],
- ?? ? ? ?[? --enable-itbeing? ? ? ?Enable "itbeing" extension support])
- ?
- if test $PHP_ITBEING != "no"; then
- ?? ? ? ?PHP_SUBST(ITBEING_SHARED_LIBADD)
- ?? ? ? ?PHP_NEW_EXTENSION(itbeing, itbeing.c, $ext_shared)
- fi
2.4 创建php_itbeing.h 头文件
- #ifndef PHP_ITBEING_H
- /* Prevent double inclusion */
- #define PHP_ITBEING_H
- ?
- /* Define extension properties */
- #define PHP_ITBEING_EXTNAME "itbeing"
- #define PHP_ITBEING_EXTVER "1.0"
- ?
- /* Import configure options
- ?* when building outside of the
- ?* PHP source tree */
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
- ?
- /* Include PHP standard Header */
- #include "php.h"
- /*
- ?* define the entry point symbole
- ?* Zend will use when loading this module
- ?*/
- extern zend_module_entry itbeing_module_entry;
- #define phpext_itbeing_ptr &itbeing_module_entry
- ?
- #endif /* PHP_ITBEING_H */
2.5 创建itbeing.c 文件
- #include "php_itbeing.h"
- ?
- PHP_FUNCTION(itbeing_sayhi)
- {
- ?? ? ? ?char *name;
- ?? ? ? ?int name_len;
- ?
- ?? ? ? ?if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
- ?? ? ? ? ? ? ? ?&name, &name_len) == FAILURE)
- ?? ? ? ?{
- ?? ? ? ? ? ? ? ?RETURN_NULL();
- ?? ? ? ?}
- ?
- ?? ? ? ?php_printf("Hi, ");
- ?? ? ? ?PHPWRITE(name, name_len);
- ?? ? ? ?php_printf("!\n");
- }
- ?
- static function_entry php_itbeing_functions[] = {
- ?? ? ? ?PHP_FE(itbeing_sayhi, NULL)
- ?? ? ? ?{ NULL, NULL, NULL }
- };
- ?
- zend_module_entry itbeing_module_entry = {
- #if ZEND_MODULE_API_NO >= 20010901
- ?? ? ? ?STANDARD_MODULE_HEADER,
- #endif
- ?? ? ? ?PHP_ITBEING_EXTNAME,
- ?? ? ? ?php_itbeing_functions, /* Functions */
- ?? ? ? ?NULL, /* MINIT */
- ?? ? ? ?NULL, /* MSHUTDOWN */
- ?? ? ? ?NULL, /* RINIT */
- ?? ? ? ?NULL, /* RSHUTDOWN */
- ?? ? ? ?NULL, /* MINFO */
- #if ZEND_MODULE_API_NO >= 20010901
- ?? ? ? ?PHP_ITBEING_EXTVER,
- #endif
- ?? ? ? ?STANDARD_MODULE_PROPERTIES
- };
- ?
- #ifdef COMPILE_DL_ITBEING
- ZEND_GET_MODULE(itbeing)
- #endif
3、编译模块
3.1 phpize
3.2 ./config -enable-itbeing
3.3 make
3.4 cp modules/itbeing.so /usr/lib/php/modules
3.5 vim /etc/php.ini 添加extension = itbeing.so
测试:php -r “itbeing_sayhi(’kokko’)”
结果:Hi,kokko
?
原文:http://www.kokkowon.com/archives/981
Statement:The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn