编写php扩展的步骤:
1.使用php-src中ext文件夹中的ext_skel生成项目框架
2.编辑config.m4,将其中三句话前面的dnl删除,改成下面这样。
PHP_ARG_WITH(md2pic, for md2pic support,
Make sure that the comment is aligned:
[ --with-md2pic Include md2pic support])
3.执行phpize
4.执行./configure
5.使用make
编译
6.使用make install
安装扩展
7.将扩展加入php.ini中
8.使用php -m
检查扩展是否正常加载
关于config.m4
config.m4相当于一个构建系统,在php扩展的开发中,我的理解就是它可以用来配置lib,include,flags等编译时的属性以及其他的一些功能。这里给出一个配置了其他的lib和include信息的config.m4文件
dnl Id
dnl config.m4 for extension md2pic
dnl Comments in this file start with the string 'dnl'.
dnl Remove where necessary. This file will not work
dnl without editing.
dnl If your extension references something external, use with:
PHP_ARG_WITH(md2pic, for md2pic support,
Make sure that the comment is aligned:
[ --with-md2pic Include md2pic support])
dnl Otherwise use enable:
dnl PHP_ARG_ENABLE(md2pic, whether to enable md2pic support,
dnl Make sure that the comment is aligned:
dnl [ --enable-md2pic Enable md2pic support])
if test "PHP_MD2PIC" != "no"; then
dnl Write more examples of tests here...
dnl # --with-md2pic -> check with-path
dnl SEARCH_PATH="/usr/local /usr" # you might want to change this
dnl SEARCH_FOR="/include/md2pic.h" # you most likely want to change this
dnl if test -rPHP_MD2PIC/SEARCH_FOR; then # path given as parameter
dnl MD2PIC_DIR=PHP_MD2PIC
dnl else # search default path list
dnl AC_MSG_CHECKING([for md2pic files in default path])
dnl for i in SEARCH_PATH ; do
dnl if test -ri/SEARCH_FOR; then
dnl MD2PIC_DIR=i
dnl AC_MSG_RESULT(found in i)
dnl fi
dnl done
dnl fi
dnl
dnl if test -z "MD2PIC_DIR"; then
dnl AC_MSG_RESULT([not found])
dnl AC_MSG_ERROR([Please reinstall the md2pic distribution])
dnl fi
dnl # --with-md2pic -> add include path
PHP_ADD_INCLUDE(src/libMultiMarkdown/include)
LIBNAME=gd # you may want to change this
LIBSYMBOL=gdImageCreate # you most likely want to change this
PHP_CHECK_LIBRARY(LIBNAME,LIBSYMBOL,
[
PHP_ADD_LIBRARY_WITH_PATH(gd,"/usr/lib", MD2PIC_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(curl,"/usr/lib", MD2PIC_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(png,"/usr/lib", MD2PIC_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(z,"/usr/lib", MD2PIC_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(jpeg,"/usr/lib", MD2PIC_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(freetype,"/usr/lib", MD2PIC_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(m,"/usr/lib", MD2PIC_SHARED_LIBADD)
AC_DEFINE(HAVE_MD2PICLIB,1,[ ])
],[
AC_MSG_ERROR([wrong md2pic lib version or lib not found])
],[
])
dnl
PHP_SUBST(MD2PIC_SHARED_LIBADD)
PHP_NEW_EXTENSION(md2pic, [md2pic.c \
src/libMultiMarkdown/aho-corasick.c \
src/libMultiMarkdown/beamer.c \
src/libMultiMarkdown/char.c \
src/libMultiMarkdown/critic_markup.c \
src/libMultiMarkdown/d_string.c \
src/libMultiMarkdown/epub.c \
src/libMultiMarkdown/file.c \
src/libMultiMarkdown/html.c \
src/libMultiMarkdown/latex.c \
src/libMultiMarkdown/lexer.c \
src/libMultiMarkdown/memoir.c \
src/libMultiMarkdown/miniz.c \
src/libMultiMarkdown/mmd.c \
src/libMultiMarkdown/object_pool.c \
src/libMultiMarkdown/opendocument-content.c \
src/libMultiMarkdown/opendocument.c \
src/libMultiMarkdown/scanners.c \
src/libMultiMarkdown/stack.c \
src/libMultiMarkdown/textbundle.c \
src/libMultiMarkdown/token_pairs.c \
src/libMultiMarkdown/token.c \
src/libMultiMarkdown/transclude.c \
src/libMultiMarkdown/rng.c \
src/libMultiMarkdown/uuid.c \
src/libMultiMarkdown/writer.c \
src/libMultiMarkdown/zip.c \
src/libMultiMarkdown/parser.c \
src/libMultiMarkdown/pic.c], $ext_shared,, [-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 ] )
fi
编写php扩展的资料
我这里主要参考的是 php内核剖析这本书。
php的扩展其实也可以用c++开发。这里有一个很好的项目php-x,并且开发扩展也要容易很多。