更多的情况是业务中已经有独立的 api 库,形式为 libxxx.a / libxxx.so,PHP程序中需要调用这些 api,所以这时就要编写PHP扩展来实现。这时是使用静态库 libxxx.a ,还是使用 libxxx.so 呢 ?常见的做法是使用静态库 libxxx.a ,下面一步一步介绍:

1. 创建静态库

1.1 执行命令及内容如下:

[root@localhost ~]# mkdir libhello
[root@localhost ~]# cd libhello/
[root@localhost libhello]# vim hello.h
[root@localhost libhello]# vim hello.cpp

hello.h

#include <string>
using namespace std; string say();

hello.cpp

#include "hello.h"

string say()
{
string str = "Hello World!!!!!";
return str;
}

1.2 编译为 libhello.a (可参考:C++动态库和静态库

2. 使用骨架脚本生成PHP扩展 discuz(可参考:如何使用C++开发PHP扩展(上)

3. 把 hello.h,libhello.a 放到 PHP扩展文件夹中,如下:

[root@localhost ~]# cp libhello/libhello.a php-5.3.24/ext/discuz/lib
cp:是否覆盖“php-5.3.24/ext/discuz/lib/libhello.a”? y
[root@localhost ~]# cp libhello/hello.h php-5.3.24/ext/discuz/include/
cp:是否覆盖“php-5.3.24/ext/discuz/include/hello.h”? y

4. 修改 config.m4,内容如下:

dnl $Id$
dnl config.m4 for extension discuz PHP_ARG_ENABLE(discuz, whether to enable discuz support,
Make sure that the comment is aligned:
[ --enable-discuz Enable discuz support]) if test "$PHP_DISCUZ" != "no"; then
PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, 1, EXTRA_LDFLAGS) dnl set include path
PHP_ADD_INCLUDE(./include) dnl checking libhello.a is exists or not
AC_MSG_CHECKING([for lib/libhello.a])
if test -f ./lib/libhello.a; then
AC_MSG_RESULT([yes])
PHP_ADD_LIBRARY_WITH_PATH(hello, ./lib, EXTRA_LDFLAGS)
else
AC_MSG_RESULT([not found])
AC_MSG_ERROR([Plaese check ./lib/libhello.a])
fi PHP_NEW_EXTENSION(discuz, discuz.cpp, $ext_shared)
fi

5. 修改discuz.cpp

5.1 添加头文件

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif #include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_discuz.h" #include <string>
#include "hello.h"

5.2 修改 discuz_say 函数,如下:

/* {{{ proto string discuz_say()
*/
PHP_FUNCTION(discuz_say)
{
string str = say();
RETURN_STRINGL(str.c_str(), str.length(), 1);
}

6. 编译扩展(可参考:编译PHP扩展的两种方式

7. 开始测试吧

[root@localhost ~]# /usr/local/php-5.3.24/bin/php hi.php
Hello World!!!!!

来源:python脚本自动迁移

如何使用C++开发PHP扩展(下)的更多相关文章

  1. windows下开发PHP扩展dll(无需Cygwin)

    windows下开发php扩展网上很多资料都说需要Cygwin,其实完全可以不必安装该东东.没错,是可以在linux下生成骨架后拷到windos下来用,但是,如果没有linux环境呢?什么,装虚拟机? ...

  2. 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单   手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩 ...

  3. 【翻译】我钟爱的Visual Studio前端开发工具/扩展

    原文:[翻译]我钟爱的Visual Studio前端开发工具/扩展 怎么样让Visual Studio更好地编写HTML5, CSS3, JavaScript, jQuery,换句话说就是如何更好地做 ...

  4. 开发 chrome 扩展 GitHub-Remarks 的一些想法以及遗憾

    前文 对于单页应用中如何监听 URL 变化的思考 说到我在开发 chrome 扩展 GitHub Remarks 中遇到的一个问题,本文来聊聊开发这个扩展的前后心路历程. 为什么开发这个扩展?前文说到 ...

  5. 手把手教你开发chrome扩展

    转载:http://www.cnblogs.com/walkingp/archive/2011/04/04/2003875.html 手把手教你开发chrome扩展一:开发Chrome Extenst ...

  6. 如何开发 Laravel 扩展包并发布到 Composer

    如何开发 Laravel 扩展包并发布到 Composer  发布于 2019-01-22 cxp1539  1074 Vie   开发扩展包 我们来做一个根据第一个字符或者汉字生成头像的larave ...

  7. 手把手教你开发Chrome扩展二:为html添加行为

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 上一节我们 ...

  8. 使用C++开发PHP扩展

    目前,PHP编程语言也是相当成熟,各种文档,各种问题,只要Google一下,总有你想要的答案.当然"如何开发PHP扩展"的文章也不少,但是很少有专门来介绍使用C++开发PHP扩展的 ...

  9. 如何有效地开发 Jmix 扩展组件

    扩展组件的概念在使用 Jmix 框架开发中扮演着非常重要的角色.我们将在本文探索什么是扩展组件以及 Jmix Studio 在扩展组件开发和应用程序模块化方面能给开发者带来什么帮助. Jmix 中的扩 ...

随机推荐

  1. JavaScript交互式网页设计作业目录(作业笔记)

    JavaScript交互式网页设计笔记 • [目录] 我的大学笔记>>> 第1章 JavaScript基本语法>>> 1.1.4 使用 JavaScript 的 H ...

  2. Java:对一个对象序列化和反序列化的简单实现

    名词解释 序列化:将Java对象转化成字节的过程 反序列化:将字节转化成Java对象的过程 字节:1字节(byte)= 8bit,bit就是计算机认识的二进制 序列化的作用 Java对象是在Java虚 ...

  3. unittest_TestSuite测试套件(2)

    在前面一章中演示了unittest如何执行一个简单的测试,但有两个问题: 我们知道测试用例的执行顺序是根据测试用例名称顺序执行的,在不改变用例名称的情况下,我们怎么来控制用例执行的顺序呢? 一个测试文 ...

  4. Flask + UnitTest(十五)

    被测试视图 # coding:utf-8 from flask import Flask, request, jsonify app = Flask(__name__) @app.route(&quo ...

  5. [ vue ] 解耦vuex(按照组件来组织vuex的结构)

    问题描述 随着应用复杂度的增加,vuex用一个 store/index.js 文件来描述已经很难维护了,我们想把这些状态分割到单独文件里面. 参考1:https://vuex.vuejs.org/zh ...

  6. mysql 5.7.29 在centos7.6下超简单的本地yum源安装与配置

    目录 生成yum源元数据 从网易镜像站下载MySQL 5.7 的 bundle包 创建文件 mysql-local.repo 执行yum install命令 生成yum源元数据 createrepo ...

  7. $.ajax传输js数组,spring接收异常

    今天测试,出现一个奇怪的问题 $.ajax传输js数组,spring接收这个数组,出现奇怪的现象,如果数组只有一个元素,且这个元素字符串最后一个字符是以逗号,结尾的话, spring会自动把这个逗号去 ...

  8. Spring cloud 框架 --- Eureka 心得

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 (1)接触了spring cloud 框架 ,首先要知道Eureka是什 ...

  9. FIS本地发布-其他同事通过IP访问

    方法很简单,只需在fis的配置文件那里进行修改即可. 文件路径在 C:\Users\Su\AppData\Roaming\npm\node_modules\fis\node_modules\fis-c ...

  10. 介绍一下主流的浏览器的开发者工具(js调试和查看网络请求)

    1.打开开发者工具:右键-->检查 (快捷键 f12) 2.开发者工具介绍: (1): 选择页面的dom进行查看 (2):设备适配 (3)元素: ① 可以查找到界面对应的dom: ② 通过计算样 ...