PHP-CPP是一个用于开发PHP扩展的C++库。PHP-CPP提供了一系列完善的文档、易于使用和扩展的类,让你可以相对快速的创建PHP的原生扩展。

系列笔记:

为什么使用PHP-CPP

  • 很快

    用C++编写的代码很快:比用PHP编写的代码快得多。
  • 简单

    用C++编写的算法看起来几乎与用PHP编写的算法相同。如果你知道如何用PHP编程,你可以很容易地学习如何在C++中做同样的事情。实际上,PHP和大多数PHP函数名的语法都直接来自C和C++语法。
  • 无需Zend引擎知识

    Zend引擎的内部结构过于复杂,Zend引擎的代码很乱,而且大部分都没有记录。
  • 完善的文档
  • 支持所有重要的PHP功能

    使用PHP-CPP,你可以像使用普通的PHP脚本一样轻松地处理变量、数组、函数、对象、类、接口、异常和命名空间。除此之外,你还可以使用C++的所有功能,包括线程,lambdas和异步编程。
  • 免费的

    PHP-CPP是一种开源技术,可供你免费使用。

环境准备

GCC版本不能太低,因为需要支持c++11特性。我使用的版本:

gcc version 7.2.0

如果你是CentOS的系统,可能GCC版本最高就是4.4.7,这时候只能通过手动编译重新安装了。

官方文档:http://www.php-cpp.com/documentation/

安装PHP-CPP

PHP-CPP区分PHP5和7系列,但是对外提供的API是一样的。

PHP5:

$ git clone https://github.com/CopernicaMarketingSoftware/PHP-CPP-LEGACY.git

PHP7:

$ git clone https://github.com/CopernicaMarketingSoftware/PHP-CPP.git

然后编译安装:

$ make
$ sudo make install

Hello World

可以先clone下面这个例子来尝鲜:

git clone https://github.com/elvisszhang/phpcpp_helloworld.git

进入helloworld源码目录,打开main.cpp,可以看到如下代码结构:

/**
* User: 公众号: 飞鸿影的博客(fhyblog)
* Date: 2018/7
*/ #include <phpcpp.h>
#include <iostream> //这是PHP里面可以调用的接口函数
void say_hello()
{
//输出一段欢迎文字
Php::out << "hello world from my first extension" << std::endl;
} /**
* 告诉编译器get_module是个纯C函数
*/
extern "C" { /**
* 本函数在PHP进程一打开就会被访问,并返回一个描述扩展信息的PHP结构指针
*/
PHPCPP_EXPORT void *get_module()
{
// 必须是static类型,因为扩展对象需要在PHP进程内常驻内存
static Php::Extension extension("helloworld", "1.0.0"); //这里可以添加你要暴露给PHP调用的函数
extension.add<say_hello>("say_hello"); // 返回扩展对象指针
return extension;
}
}

PHP-CPP库定义了一个PHPCPP_EXPORT宏,它应该放在get_module()函数的前面。此宏确保get_module()函数是公共导出的,因此可由PHP调用。宏具有基于编译器和操作系统的不同实现。

编译这个扩展很简单,在终端命令行下输入make命令即可:

$ make
g++ -Wall -c -O2 -std=c++11 -fpic -o main.o main.cpp
g++ -shared -o helloworld.so main.o -lphpcpp $ sudo make install

编译完成会在源码目录下看到 helloworld.so 这个扩展文件。然后在php.ini文件添加扩展:

extension = helloworld.so

输入:

php -m | grep helloworld

就可以看到扩展。

测试源码目录下有个test.php,执行:

$ php test.php
hello world from my first extension

(未完待续)

想第一时间获取最新动态,欢迎关注关注飞鸿影的博客(fhyblog),不定期为您呈现技术干货。

PHP-CPP开发扩展(一)的更多相关文章

  1. Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)

    最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...

  2. EditPlus 配置 Java & C/CPP 开发环境

    0.1安装EditPlus 0.2安装Java 0.3安装MinGW 0.4配置Java和MinGW环境变量 1.配置Java开发环境 1.1 Tool-->Preferences 1.2 Ja ...

  3. 【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序

    关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...

  4. ----转载----【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序

    关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...

  5. 搭配 VS Code Remote 远程开发扩展在 WSL 下开发

    ❗ 注意:远程开发扩展需要在 Visual Studio Code Insiders 上使用. Visual Studio Code Remote - WSL 扩展允许你直接借助 VS Code 令  ...

  6. php开发扩展环境的搭建(Windows)

    php开发扩展环境的搭建(Windows) 前期准备: (1) 下载php-5.3.10源码包(php-5.3.10.tar.bz2)并解压到C:\php-5.3.10:下载二进制包php-5.3.1 ...

  7. PHP-CPP开发扩展(五)

    PHP-CPP是一个用于开发PHP扩展的C++库.本节讲解如何在C++中实现PHP类. 类和对象 类和对象 怎样在PHP-CPP里写出PHP的类呢?很简单,看下面的例子: main.cpp /** * ...

  8. eclipse mingw cpp开发环境

    Eclipse开发c++ 对比:微软的VC++6.0:太老了,对win7兼容不好, 现在微软的Visual Studio:安装包太大,好几个G,装了一堆你不需要的东西,要钱,教 育版申请麻烦 DOS下 ...

  9. PHP-CPP开发扩展(六)

    PHP-CPP是一个用于开发PHP扩展的C++库.本节讲解在C++中PHP异常.变量.常量的实现相关知识. 异常 PHP和C++都支持异常,而PHP-CPP库这两种语言之间的异常处理是完全透明的.你在 ...

随机推荐

  1. Swift 从OC入门

    前言:断断续续学了蛮多天的Swift,感触还是蛮多的~~ 1.OC是以C语言为基础的语言,学习之前有C语言的基础,所以对于 `*` 这些指针还是比较容易理解的.问过其他程序员,对OC里面的 `*` 指 ...

  2. js 库

    plupload.full.min.js 前端上传利器 jQuery WeUI - V1.0.1 微信公众号开发利器

  3. ajax的另一种成功和失败回调函数

    第一种: function engline(){ var oldmsg = $('#lineso').val() if(oldmsg == null || oldmsg == '' || oldmsg ...

  4. Netsharp配置文件

    一.总体说明 netsharp下需要配置的项目一般是需要独立启动的项目,主要有四个 netsharp-web netsharp-test netsharp-elephant netsharp-donk ...

  5. Java多线程系列1 线程创建以及状态切换

    我们知道线程线程有三种创建方式 1实现Runnable接口 2 继承Thread类 3使用Callable和Future接口创建线程.具体是创建Callable接口的实现类,并实现clall()方法. ...

  6. python 练习1

    题目: 1.输入用户名密码2.认证成功后显示欢迎信息3.输错三次后锁定 #!/usr/bin/env python import sys,pickle account = {'wyh':123,'cl ...

  7. Activity 重载方法 onStart和onResume、onPause和onStop的区别

    Activity 重载方法 onStart和onResume.onPause和onStop的区别 首先了解Activity的四种状态 Running状态:一个新的Activity启动入栈后,它在屏幕最 ...

  8. selenium_unittest框架,TestCase引用

    新手,纯属个人理解,有问题可以给出建议奥~谢谢. 如以下代码,每一个test的类都是一个测试方法而测试方法必须由test_xxx开头命名,非test开头可能会执行不到,执行顺序如test1,test2 ...

  9. JS验证码邮件

    js var time = 30; var canSend = true; function f5() { if (canSend) {//判断是否要ajax发送刷新验证码 验证码在后台刷新 //al ...

  10. 网易易盾最新一代Java2c加固究竟有什么厉害之处?

    导语:几个月前,网易易盾正式推出Java2c加固.它以独有的"静态保护"技术,使得应用程序中的代码出现"下沉",达到不可逆的效果,兼顾"冷热启动时间& ...