sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install php7.0 # for PHP 7.0
sudo apt-get install php5.6 # for PHP 5.6
sudo apt-get install php5.5 # for PHP 5.5
./configure --enable-debug --enable-maintainer-zts --disable-cgi --enable-cli --disable-pear --disable-xml --disable-sqlite --without-mysql --enable-embed
出现错误 error: xml2-config not found. Please check your libxml2 installation
安装
sudo apt-get install libxml2-dev
make all install
配置文件
在ext/目录下 “sample” 目录(实际上可以位于其他位置),
在sample目录下 建立文件“config.m4”,内容为:
PHP_ARG_ENABLE(sample,
[Whether to enable the "sample" extension],
[ enable-sample Enable "sample" extension support])
if test $PHP_SAMPLE != "no"; then
PHP_SUBST(SAMPLE_SHARED_LIBADD)
PHP_NEW_EXTENSION(sample, sample.c,$ext_shared)
fi
为./configure 设置了一个 enable-sample的选项,PHP_ARG_ENABLE的第二个参数用于显示,第三个参数用于./configure help
如果使用 ./configure --enable-sample 那么$PHP_SAMPLE会被设置为yes。PHP_SUBST php的宏用于创建一个共享模块。
PHP_NEW_EXTENSION 声明模块,和需要编译的源文件(如果有多个源文件时,使用空格分隔),第三个参数与PHP_SUBST相对应。
头文件
php_sample.h
#ifndef PHP_SAMPLE_H
/* Prevent double inclusion */
#define PHP_SAMPLE_H
/* Define Extension Properties */
#define PHP_SAMPLE_EXTNAME "sample"
#define PHP_SAMPLE_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 symbol
* Zend will use when loading this module */
extern zend_module_entry sample_module_entry;
#define phpext_sample_ptr &sample_module_entry
#endif /* PHP_SAMPLE_H */
zend_module_entry用于确保当使用 extension= 时,dlopen() 和dlsym()能够使用模块。
源文件
sample.c
#include "php_sample.h"
zend_module_entry sample_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
PHP_SAMPLE_EXTNAME,
NULL, /* Functions */
NULL, /* MINIT */
NULL, /* MSHUTDOWN */
NULL, /* RINIT */
NULL, /* RSHUTDOWN */
NULL, /* MINFO */
#if ZEND_MODULE_API_NO >= 20010901
PHP_SAMPLE_EXTVER,
#endif
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_SAMPLE
ZEND_GET_MODULE(sample)
#endif
建立第一个扩展
首先,使用 phpize 命令以config.m4 为模板生成./configure 脚本。
其次,使用 ./configure –enable-sample
然后,使用 make 会在 modules文件夹下生成 so 文件
加载so
使用 php -i 查看查找 config 文件的路径
第一种方法,使用 dl(‘sample.so’);
第二种方法,使用 php.ini 文件中的 extension_dir 或者 extension
建立静态模块
使用 ./buildconf 来重新生成 ./configure
功能函数
PHP_FUNCTION()
在 sample.c 文件中 #include "php_sample.h"
PHP_FUNCTION(sample_hello_world)
{
php_printf("Hello World!\n");
}