博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP-CPP开发扩展(一)
阅读量:6583 次
发布时间:2019-06-24

本文共 2010 字,大约阅读时间需要 6 分钟。

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,这时候只能通过手动编译重新安装了。

官方文档:

安装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 
#include
//这是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"); // 返回扩展对象指针 return extension; }}

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

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

$ makeg++ -Wall -c -O2 -std=c++11 -fpic -o main.o main.cppg++ -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.phphello world from my first extension

(未完待续)

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

转载地址:http://nxxno.baihongyu.com/

你可能感兴趣的文章
10-JavaScript之DOM的事件操作
查看>>
[ZJb417]区间众数
查看>>
陶哲轩实分析习题8.5.12
查看>>
陶哲轩实分析 命题7.2.5 证明
查看>>
UIImageView02
查看>>
WebRTC开发者必备 | 《WebRTC1.0: 浏览器间实时通讯》中文版免费下载
查看>>
ASP.NET MVC 4 Ajax上传文件
查看>>
C#Contains方法的错误理解
查看>>
SQL Server JDBC 驱动中sqljdbc.jar和sqljdbc4.jar的区别
查看>>
软件的可移植性
查看>>
webpack打包项目时typescript报错The 'files' list in config file 'tsconfig.json' is empty.的解决方法...
查看>>
关于absolute 和 relative 定位的定义
查看>>
Robolectric结合Android Studio的使用
查看>>
c#控制台中如何实现回车键退出任意键继续
查看>>
历届试题 错误票据
查看>>
评论功能
查看>>
常见ES6新属性
查看>>
cesium primitive方式 ————http://blog.sina.com.cn/s/blog_15e866bbe0102y0ji.html
查看>>
BZOJ 1211 [HNOI2004]树的计数
查看>>
读《用户故事与敏捷方法》
查看>>