<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[实践ok]Linux下C++实现PHP扩展中级应用]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Fri, 19 Nov 2010 15:14:43 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	 我觉得首先还是看这位兄弟的两篇文章后实践Ok后再接着看吧，那两篇文章写得很好，如下：<br/><br/>http://hi.baidu.com/doyoueat/blog/item/2593153a88604b3371cf6c65.html<br/>http://hi.baidu.com/doyoueat/blog/item/f3b48320f13f2e0f4d088d5a.html<br/><br/>以上两篇文章，博主是实践Ok了的。。。。：）<br/><br/><br/>下载php源码<br/><br/>进入源码路径假如说是 /data/soft/php-5.2.5/<br/><br/>进入ext 目录<br/><br/>./ext_skel --extname=cpptest<br/><br/>进入 cpptest 目录 修改 config.m4<br/><br/>变化主要是这几行<br/>PHP_ARG_ENABLE(cpptest, whether to enable cpptest support,<br/>Make sure that the comment is aligned:<br/>[ --enable-cpptest&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable cpptest support])<br/><br/>以下几行主要用来指定源代码是 c++的<br/><br/>PHP_REQUIRE_CXX()<br/>PHP_ADD_LIBRARY(stdc++, &quot;&quot;, EXTRA_LDFLAGS)<br/>PHP_NEW_EXTENSION(cpptest, cpptest.cpp, $ext_shared)<br/><br/><br/><br/>然后 mv cpptest.c cpptest.cpp<br/><br/>修改 cpptest.cpp<br/><br/>20 extern &quot;C&quot; &#123;<br/>21 #ifdef HAVE_CONFIG_H<br/>22 #include &quot;config.h&quot;<br/>23 #endif<br/>24 <br/>25 #include &quot;php.h&quot;<br/>26 #include &quot;php_ini.h&quot;<br/>27 #include &quot;ext/standard/info.h&quot;<br/>28 #include &quot;php_cpptest.h&quot;<br/>29 &#125;<br/><br/>用 extern c 把原来的c 的 头文件包起来 让其兼容c++<br/><br/>#ifdef COMPILE_DL_CPPTEST<br/>ZEND_GET_MODULE(cpptest)<br/>#endif<br/>修改为如下：<br/>72 BEGIN_EXTERN_C()<br/>73 ZEND_GET_MODULE(cpptest)<br/>74 END_EXTERN_C()<br/><br/>用 BEGIN_EXTERN_C() 还有 END_EXTERN_C() 把 ZEND_GET_MODULE(cpptest) 包起来,最关键是：<br/>#include &quot;cpptest.h&quot;<br/>这个cpp的头文件要放在：<br/>extern &quot;C&quot; &#123; 的花括号里！！！<br/>using std::string;<br/>extern &quot;C&quot; &#123;<br/>#ifdef HAVE_CONFIG_H<br/>#include &quot;config.h&quot;<br/>#include &quot;cpptest.h&quot;<br/>否则会出现编译错误：错误：‘char* PHP_HELLO()’的早先声明有‘C++’链接 错误：与带有‘C’链接的新声明冲突，<br/>再加入：<br/>#ifdef COMPILE_DL_EXT_NAME<br/>&nbsp;&nbsp;BEGIN_EXTERN_C()<br/>&nbsp;&nbsp;ZEND_GET_MODULE(ext_name)<br/>&nbsp;&nbsp;END_EXTERN_C()<br/>#endif<br/>为此，特别注意！！！<br/>------------------------------------------------------------------------------------------------------------<br/>然后可以 随便测试进入几个c++的 头文件<br/><br/>30 #include &lt;iostream&gt;<br/>31 #include &lt;string&gt;<br/>32 #include &quot;cpptest.h&quot;<br/>33 using std::string;<br/><br/>修改一下示例<br/><br/>160 PHP_FUNCTION(confirm_cpptest_compiled)<br/>161 &#123;<br/>174&nbsp;&nbsp;&nbsp;&nbsp; int len;<br/>175&nbsp;&nbsp;&nbsp;&nbsp; char *strg;<br/>176&nbsp;&nbsp;&nbsp;&nbsp; strg=estrdup(PHP_HELLO());<br/>177&nbsp;&nbsp;&nbsp;&nbsp; std::cout&lt;&lt;strg&lt;&lt;std::endl;<br/>178&nbsp;&nbsp;&nbsp;&nbsp; len=strlen(strg);<br/>179&nbsp;&nbsp;&nbsp;&nbsp; RETURN_STRINGL(strg, len, 0);<br/>180&nbsp;&nbsp;&nbsp;&nbsp;// std::cout&lt;&lt;&quot;hello world&quot;&lt;&lt;std::endl;<br/>181 &#125;<br/>182 char * PHP_HELLO()<br/>183 &#123;<br/>184&nbsp;&nbsp; string str(&quot;aaaaaa&quot;);<br/>186&nbsp;&nbsp; char * cp;<br/>187&nbsp;&nbsp; cp=estrdup(str.c_str());<br/>188&nbsp;&nbsp; return cp;<br/>190 <br/>191 &#125;<br/><br/>然后添加 cpptest.h<br/><br/>定义 PHP_HELLO()<br/>char * PHP_HELLO()；<br/><br/>然后 phpize<br/><br/>./configure --with-php-config=/data/app/php/bin/php-config<br/><br/>make<br/><br/>makeinstall<br/><br/>在 phpini中 引用 so文件<br/><br/>下边就可以测试啦<br/><br/>继续参考下面：<br/><br/>来源：http://hi.baidu.com/lostdays/blog/item/e7efc488b9a5629da5c2722a.html<br/>篇文章准备分2个部分来讲述：<br/>第一部分主要详细讲述一下怎么构建一个完成的C++应用扩展模块；<br/>第二部分主要讲述在PHP及Zend框架下怎么使用Zend API和C++语言来实现自己所要的功能以及项目的开发；<br/>此篇文章所运用的环境在Linux 2.4.21-4.ELsmp(Red Hat Linux 3.2.3-20)，Apache/2.2.8，gcc version 3.2.3 20030502，PHP 5.2.5 (cli)，Zend Engine v2.2.0下进行。<br/>一、前言<br/><br/>以前写过一些使用C语言来扩展PHP的应用[1]。在淘宝使用C++做PHP的扩展做项目的过程中，遇到了一些问题，从Google中查找，使用C++来开发PHP的中文文章少之又少，而且没有一个手册来告诉用户怎么写m4[2]文件，怎么使用zend[3]引擎的一套api函数去写相关PHP的接口，这里就怎么用C++语言来开发PHP的一些心得介绍给大家，希望有心人能够有所收获；<br/><br/>二、为什么要用C++开发PHP<br/><br/>使用C++比用C语言开发PHP主要有2个好处：<br/>使用C++能够很方便的操作string类型，本身的一些容器和模板[4]、以及面对对象的功能让开发者能够节省大量开发的时间，这是比较重要的一点；<br/>C++可以直接使用C的库，只需要extern “C” &#123;&#125;将其C的头文件和库定义包含起来就可以，不需要太多的移植工作，可以重复利用前人的代码或者库进行后续的工作；<br/>用C++开发PHP是快速、迅捷的，熟悉了相关的定义以及语法，相信开发PHP不是难事。<br/>三、书写config文件<br/><br/>config.m4[5]或config.w32[6]文件是编译基础中最核心的文件，这个文件主要是用autoconf[7]来产生configure[8]配置文件，继而自动生成大家所熟悉的Makefile文件，以Linux系统为例：<br/><br/>你可以自己书写config.m4文件，也可以由Shell脚本 ext_skel[9] 来生成样板：<br/><br/>[cnangel@localhost ~]$wget http://docs.php.net/get/php-5.2.5.tar.bz2/from/cn.php.net/mirror<br/>&nbsp;&nbsp;[cnangel@localhost ~]$tar -jxf php-5.2.5.tar.bz2<br/>&nbsp;&nbsp;[cnangel@localhost ~]$cd php-5.2.6/ext<br/>&nbsp;&nbsp;[cnangel@localhost ext]./ext_skel --extname=extern_name<br/>接着你会发现在ext目录下多了一个叫extern_name的目录。进入该目录，会发现目录下有几个文件：<br/><br/>[cnangel@localhost ext_name]$ls -l<br/>&nbsp;&nbsp;总计 32<br/>&nbsp;&nbsp;-rw-r--r-- 1 cnangel cnangel 2103 06-29 19:00 config.m4<br/>&nbsp;&nbsp;-rw-r--r-- 1 cnangel cnangel&nbsp;&nbsp;310 06-29 19:00 config.w32<br/>&nbsp;&nbsp;-rw-r--r-- 1 cnangel cnangel&nbsp;&nbsp;&nbsp;&nbsp;8 06-29 19:00 CREDITS<br/>&nbsp;&nbsp;-rw-r--r-- 1 cnangel cnangel&nbsp;&nbsp;&nbsp;&nbsp;0 06-29 19:00 EXPERIMENTAL<br/>&nbsp;&nbsp;-rw-r--r-- 1 cnangel cnangel 5305 06-29 19:00 ext_name.c<br/>&nbsp;&nbsp;-rw-r--r-- 1 cnangel cnangel&nbsp;&nbsp;508 06-29 19:00 ext_name.php<br/>&nbsp;&nbsp;-rw-r--r-- 1 cnangel cnangel 2766 06-29 19:00 php_ext_name.h<br/>&nbsp;&nbsp;drwxr-xr-x 2 cnangel cnangel 4096 06-29 19:00 tests<br/>然后可以根据提示来修改config.m4文件，这里有几个重要的宏命令如下：<br/><br/>dnl 是注释；<br/>PHP_ARG_WITH 或者 PHP_ARG_ENABLE 指定了PHP扩展模块的工作方式，前者意味着不需要第三方库，后者正好相反；<br/>PHP_REQUIRE_CXX 用于指定这个扩展用到了C++；<br/>PHP_ADD_INCLUDE 指定PHP扩展模块用到的头文件目录；<br/>PHP_CHECK_LIBRARY 指定PHP扩展模块PHP_ADD_LIBRARY_WITH_PATH定义以及库连接错误信息等；<br/>PHP_ADD_LIBRARY(stdc++,”&quot;,EXTERN_NAME_LIBADD)用于将标准C++库链接进入扩展<br/>PHP_SUBST(EXTERN_NAME_SHARED_LIBADD) 用于说明这个扩展编译成动态链接库的形式；<br/>PHP_NEW_EXTENSION 用于指定有哪些源文件应该被编译,文件和文件之间用空格隔开；<br/>ext_skel默认生成的模块框架是针对C的,我们要使用C++进行PHP扩展, 那除以上的PHP_REQUIRE_CXX, PHP_ADD_LIBRARY两个宏必需外，还要把extern_name.c改名成extern_name.cpp。<br/><br/>需要注意的是，在config.m4里面可以使用类似的Makefile语法，片段如下：<br/><br/>PHP_REQUIRE_CXX()<br/>&nbsp;&nbsp;INCLUDES=&quot;$INCLUDES `mysql_config --cflags`&quot;<br/>&nbsp;&nbsp;PHP_ADD_LIBRARY(stdc++, &quot;&quot;, EXTRA_LDFLAGS)<br/>&nbsp;&nbsp;EXTRA_LDFLAGS=&quot;$EXTRA_LDFLAGS `mysql_config --libs` -lmemcached&quot;<br/>&nbsp;&nbsp;AC_CHECK_HEADERS([mysql/mysql.h])<br/>&nbsp;&nbsp;CPPFILE=&quot;ext_name.cpp antiForbitWord.cpp antiBaseDict.cpp Trie.cpp Logger.cpp antiEncodeConverter.cpp strnormalize.cpp&quot;<br/>&nbsp;&nbsp;PHP_NEW_EXTENSION(ext_name, $CPPFILE, $ext_shared)<br/>四、书写.h文件<br/><br/>这里指修改php_ext_name.h这个头文件。<br/><br/>由于TSRM.h这个文件所包含的函数和类都是用纯C语言写的，故应该使用extern来说明如下：<br/><br/>extern &quot;C&quot; &#123;<br/>&nbsp;&nbsp;#ifdef ZTS<br/>&nbsp;&nbsp;#include &quot;TSRM.h&quot;<br/>&nbsp;&nbsp;#endif<br/>&nbsp;&nbsp;&#125;<br/>如果该php_ext_name.h头文件或者ext_name.cpp文件用到了C++语言中的一些容器或者一些函数，则需要在头文件中包含相应的c++库的头文件，否则会出现找不到相应的C++函数错误。<br/><br/>五、书写.cpp文件<br/><br/>这里指修改ext_name.cpp这个cpp文件。<br/><br/>由于config.h、php.h、php_ini.h和ext/standard/info.h中包含的函数和类如TSRM.h一样，都是用纯C语言写的，所以也需要用extern说明如下：<br/><br/>extern &quot;C&quot; &#123;<br/>&nbsp;&nbsp;#ifdef HAVE_CONFIG_H<br/>&nbsp;&nbsp;#include &quot;config.h&quot;<br/>&nbsp;&nbsp;#endif<br/>#include &quot;php.h&quot;<br/>&nbsp;&nbsp;#include &quot;php_ini.h&quot;<br/>&nbsp;&nbsp;#include &quot;ext/standard/info.h&quot;<br/>&nbsp;&nbsp;&#125;<br/>而 #include “php_ext_name.h” 这句则已经不需要包含在extern “C”内，另外，ZEND_GET_MODULE这个宏命令也是需要特别申明如下：<br/><br/>#ifdef COMPILE_DL_EXT_NAME<br/>&nbsp;&nbsp;BEGIN_EXTERN_C()<br/>&nbsp;&nbsp;ZEND_GET_MODULE(ext_name)<br/>&nbsp;&nbsp;END_EXTERN_C()<br/>&nbsp;&nbsp;#endif<br/>总之，把一些C写的库或轰用兼容的方式给解决。<br/><br/>六、初步执行<br/><br/>这里需要用到一个命令：phpize[10]，命令如下：<br/><br/>[cnangel@localhost ext_name]$phpize<br/>&nbsp;&nbsp;[cnangel@localhost ext_name]$./configure<br/>&nbsp;&nbsp;[cnangel@localhost ext_name]$make<br/>注意：可以使用用phpize生成configure执行文件后，可以使用./configure –help查看帮助信息，修改config.m4文件可以修改configure的帮助信息。每次修改了config.m4文件，需要使用清除临时文件 命令phpize –clean来完成消除configure。<br/><br/>七、初步应用<br/><br/>怎么应用到php上，把刚才的扩展模块当作一个普通的php函数调用呢？简单的应用直接使用命令：<br/><br/>[cnangel@localhost ext_name]$sudo make install<br/>如果有多个php版本，则寻找扩展库目录显得没有那么好找了，比如，你的php执行文件的路径在/usr/local/php/bin/目录下，想知道php扩展模块所在的目录的话，那么执行(PHP5.0以上)：<br/><br/>[cnangel@localhost ext_name]$/usr/local/php/bin/php-config &#124; grep extension-dir &#124; sed &#039;s/.*[(.*)]/1/&#039;`<br/>PHP5.0以下执行：<br/><br/>[cnangel@localhost ext_name]$/usr/local/php/bin/php-config --extension-dir<br/>这样你可以发现你的扩展库的路径：<br/><br/>/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613<br/>当然，你可以修改php.ini，找到php安装的配置文件，修改extension_dir的值为你想要的一个路径另外，需要将你的扩展写入php.ini，像这样：<br/><br/>extension=ext_name.so<br/><br/>最后，找到扩展库的路径后，将modules下面的extern_name.so文件复制到扩展库的目录下，重新启动一下Apache进程：<br/><br/>[cnangel@localhost ext_name]$which httpd<br/>&nbsp;&nbsp;/usr/bin/httpd<br/>&nbsp;&nbsp;[cnangel@localhost ext_name]$sudo /usr/bin/httpd -k stop<br/>&nbsp;&nbsp;[cnangel@localhost ext_name]$sudo /usr/bin/httpd -k start<br/>把这个样例ext_name.php复制到web路径上去，看看是否好使啦？下一节我们将详细讲一些Zend API的宏在ext_name.cpp中的一些复杂应用。<br/><br/>Linux下C++实现PHP扩展中级应用（二）<br/><br/>这里主要讲述在PHP及Zend框架下怎么使用Zend API和C++语言来实现自己所要的功能以及项目的开发。<br/>此篇文章所运用的环境在Linux 2.4.21-4.ELsmp(Red Hat Linux<br/>3.2.3-20)，Apache/2.2.8，gcc version 3.2.3 20030502，PHP 5.2.5 (cli)，Zend<br/>Engine v2.2.0下进行。<br/><br/>前言<br/><br/>上次我们说到使用c++写一个完整的php扩展，这里以ext_name模块为例复习一下：<br/><br/>首先仍然修改config.m4文件，由于没有引用外面的模块或者相关库，所以不需要使用PHP_ARG_WITH的方式，使用PHP_ARG_ENABLE方式。找到<br/><br/>PHP_NEW_EXTENSION(ext_name, ext_name.c, $ext_shared)<br/>修改成<br/><br/>PHP_REQUIRE_CXX()<br/>&nbsp;&nbsp;PHP_ADD_LIBRARY(stdc++, &quot;&quot;, EXTRA_LDFLAGS)<br/>&nbsp;&nbsp;PHP_NEW_EXTENSION(ext_name, ext_name.cpp, $ext_shared)<br/>并将ext_name.c重新命名为ext_name.cpp，接着修改其内容，将<br/><br/>#include &quot;php.h&quot;<br/>&nbsp;&nbsp;#include &quot;php_ini.h&quot;<br/>&nbsp;&nbsp;#include &quot;ext/standard/info.h&quot;<br/>用extern “C”将其用大括号括起来，修改<br/><br/>ZEND_GET_MODULE(ext_name)<br/>为<br/><br/>BEGIN_EXTERN_C()<br/>&nbsp;&nbsp;ZEND_GET_MODULE(ext_name)<br/>&nbsp;&nbsp;END_EXTERN_C()<br/>到此为止，这就是我们第一章内容，第二章比较庞大，这里还是分节来叙述吧。<br/><br/>概述<br/><br/>概述里面主要简单介绍PHP扩展中的一些大致结构和需要注意的事项，做过C扩展PHP的都会知道 PHP_FE是一个宏把这个宏标识的函数，例如：helloworld，这个函数可以直接作用于PHP解释器，比如<br/><br/>&lt;?php<br/>&nbsp;&nbsp;helloworld();<br/>&nbsp;&nbsp;?&gt;<br/>安装ext_name样板后，系统会自动有一个函数confirm_ext_name_compiled，这个函数是可以自行修改的，当然，PHP_FE可以定义多个函数，这些函数都必须在之前进行申明，一般在php_ext_name.h头文件进行申明。<br/><br/>我们还知道，仅仅有头文件和PHP_FE宏来申明这个函数是不行的，这个函数还没有内容，怎么编写这个函数的内容呢？这个在接下来会讲到。<br/><br/>其实，稍微细心的人看了ext_name.cpp就知道，去掉注释后，还有很多的宏命令，比如zend_module_entry、ZEND_GET_MODULE、PHP_MINIT_FUNCTION等等，读者不要着急，下面会一一道来。<br/><br/>关于ext_name.cpp文件中一些变量的命名，通常是PHP模块名（eg:ext_name）前面或者后面有一串字符，比如 le_ext_name、ext_name_functions、这是一种习惯，最好我们在书写的时候遵循这种习惯，这样写出来的代码不仅仅让你自己明 白，让其他的开发人员也能够很快熟悉你的代码。通常一些定义的常量会大写，比如要定义这个模块的名字和版本，可以在头文件中添加：<br/><br/>#define PHP_EXT_NAME_EXTNAME &quot;ext_name&quot;<br/>&nbsp;&nbsp;#define PHP_EXT_NAME_VERSION &quot;0.1&quot;<br/>然后修改ext_name_module_entry的内容，将”ext_name”和”0.1″分别用PHP_EXT_NAME_EXTNAME和PHP_EXT_NAME_VERSION来替换，这样具有方便且通用。<br/><br/>如果你可能在代码中可能需要用到stl之类的或者c++的一些库，那么你可以在ext_name.cpp文件中添加<br/><br/>#ifndef __APP_CPP__<br/>&nbsp;&nbsp;#define __APP_CPP__<br/>&nbsp;&nbsp;#include &lt;iostream&gt;<br/>&nbsp;&nbsp;#include &lt;fstream&gt;<br/>&nbsp;&nbsp;#include &lt;string&gt;<br/>&nbsp;&nbsp;/*<br/>&nbsp;&nbsp;#include &lt;sstream&gt;<br/>&nbsp;&nbsp;#include &lt;list&gt;<br/>&nbsp;&nbsp;#include &lt;vector&gt;<br/>&nbsp;&nbsp;#include &lt;map&gt;<br/>&nbsp;&nbsp;#include &lt;hashmap&gt;<br/>&nbsp;&nbsp;#include &lt;set&gt;<br/>&nbsp;&nbsp;#include &lt;bitset&gt;<br/>&nbsp;&nbsp;*/<br/>&nbsp;&nbsp;#endif<br/>PHP 与 Zend API<br/><br/>引用一句经典的原文来说明PHP和Zend API之间的关系<br/><br/>PHP的核心由两部分组成。最底层是Zend引擎（ZE）。ZE把人类易读的脚本解析成机器可读的符号，<br/>&nbsp;&nbsp;然后在进程空间内执行这些符号。ZE也处理内存管理、变量作用域及调度程序调用。另一部分是PHP内核，<br/>&nbsp;&nbsp;它绑定了SAPI层（Server Application Programming Interface，通常涉及主机环境，如Apache，IIS，CLI，CGI等），<br/>&nbsp;&nbsp;并处理与它的通信。它同时对safe_mode和open_basedir的检测提供一致的控制层，就像流层将fopen()、fread()和<br/>&nbsp;&nbsp;fwrite()等用户空间的函数与文件和网络I/O联系起来一样。<br/>模块信息<br/><br/>模块信息主要体现在ext_name_module_entry结构上，它包含了<br/><br/>1, 标准模块的头<br/><br/>通常用 “STANDARD_MODULE_HEADER” 来填充，它指定了模块的四个成员：<br/><br/>标识整个模块结构大小的 size<br/>值为 ZEND_MODULE_API_NO 常量的 zend_api<br/>标识是否为调试版本（使用 ZEND_DEBUG 进行编译）的 zend_debug<br/>还有一个用来标识是否启用了 ZTS （Zend 线程安全，使用 ZTS 或USING_ZTS 进行编译）的 zts。<br/>2, 模块名称<br/><br/>模块名称这个名字就是使用 phpinfo() 函数后在“Additional Modules”部分所显示的名称。<br/><br/>3, PHP扩展可用到的函数或类<br/><br/>zend函数块的指针<br/><br/>4, 模块启动函数<br/><br/>5, 模块关闭函数<br/><br/>6, 请求启动函数<br/><br/>7, 请求关闭函数<br/><br/>8, 模块信息函数<br/><br/>9, 模块的版本号<br/><br/>10,　其它结构元素<br/><br/>首先和C初使的操作一样. ./ext_skel –extname=hahacpp 创建一个模块.<br/><br/>进入后修改config.m4文件，由于没有引用外面的模块或者相关库，所以不需要使用PHP_ARG_WITH的方式，使用PHP_ARG_ENABLE方式。<br/><br/>找到<br/><br/>PHP_NEW_EXTENSION(ext_name, ext_name.c, $ext_shared)修改成<br/><br/>PHP_REQUIRE_CXX()<br/>PHP_ADD_LIBRARY(stdc++, “”, EXTRA_LDFLAGS)<br/>PHP_NEW_EXTENSION(ext_name, hahacpp.cpp, $ext_shared)<br/><br/>注意: 在第三句括号内的第二个参数,将hahacpp.c重新命名为hahacpp.cpp，<br/><br/>接着修改其内容，在hahacpp.c中将<br/><br/>#include “php.h”<br/>#include “php_ini.h”<br/>#include “ext/standard/info.h”<br/><br/>用extern “C”将其用大括号括起来，接着修改<br/><br/>ZEND_GET_MODULE(ext_name)为<br/><br/>BEGIN_EXTERN_C()<br/>ZEND_GET_MODULE(ext_name)<br/>END_EXTERN_C()<br/><br/>完成.保存退出.<br/><br/>phpize<br/><br/>./configure<br/><br/>make<br/><br/>make install<br/><br/>完成C++框架的开发. 下一篇继续扩展…<br/><br/>上一篇说到C++做了一个简单的框架.<br/><br/>今天整了一个下午.加入了文件包含及相关的调用.<br/><br/>步骤如下:<br/><br/>首先需要使用这一句:phpize –clean 清除上次编译的配置.<br/><br/>编辑 haha.h<br/><br/>bool iswork();<br/><br/>编辑 haha.cpp<br/><br/>#include “haha.h”<br/>bool iswork()&#123;<br/>return true;<br/>&#125;<br/><br/>编辑hahacpp.cpp ,添加<br/><br/>#incude “haha.h”<br/><br/>增加一个函数:<br/><br/>zend_function_entry mycpp_functions[] = &#123;<br/>PHP_FE(confirm_mycpp_compiled, NULL) /* For testing, remove later.<br/>*/<br/>PHP_FE(helloHAHA, NULL)<br/>&#123;NULL, NULL, NULL&#125; /* Must be the last line in mycpp_functions[] */<br/>&#125;;<br/><br/>增加函数实现:<br/><br/>PHP_FUNCTION(helloHAHA)&#123;<br/>char *strg;<br/>int len=0;<br/><br/>len = spprintf(&amp;strg, 0, “wahaha!!! cpp!!!”); php_printf(”wahaah,cpp!!!n”);<br/><br/>if(iswork())&#123;<br/>php_printf(”can work!!n”);<br/>&#125;<br/>else&#123;<br/>php_printf(”can’tn”);<br/>&#125;<br/><br/>&#125;<br/><br/>保存退出. 编辑config.m4, 找到文件中的:<br/><br/>PHP_REQUIRE_CXX()<br/>PHP_ADD_LIBRARY(stdc++,”&quot;,EXTRA_LDFLAGS)<br/>PHP_NEW_EXTENSION(hahacpp,hahacpp.cpp,$ext_shared)<br/><br/>将最后一行改为:<br/><br/>PHP_NEW_EXTENSION(hahacpp,hahacpp.cpp haha.cpp,$ext_shared)<br/><br/>保存退出,执行<br/>phpize<br/>./configure<br/>make<br/>make install<br/>完成!!~在PHP中执行 helloHAHA() 试试吧~~哈!<br/>继续参考：<br/>http://www.laruence.com/2009/04/28/719.html
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践ok]Linux下C++实现PHP扩展中级应用]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>