基于Swoole开发PHP扩展
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
Swoole-1.9.7增加了一個(gè)新特性,可以基于Swoole使用C++語(yǔ)言開發(fā)擴(kuò)展模塊,在擴(kuò)展模塊中可以注冊(cè)PHP內(nèi)置函數(shù)和類?,F(xiàn)在可以基于Swoole來(lái)編寫PHP擴(kuò)展了。Swoole使用了C++ 11封裝了ZendAPI,配合C++ IDE的自動(dòng)提示和自動(dòng)補(bǔ)齊,使PHP擴(kuò)展開發(fā)的效率得到了大幅提升,分分鐘寫出一個(gè)PHP擴(kuò)展。
環(huán)境準(zhǔn)備
- IDE建議使用Eclipse CDT
- 必須安裝Swoole-1.9.7或更高版本
- 必須要有Swoole源碼
編寫程序
#include <string> #include <iostream>#include "PHP_API.hpp" #include "module.h"using namespace std; using namespace PHP;extern "C" {int swModule_init(swModule *);void swModule_destory(swModule *); }//C++函數(shù)必須要在頭部聲明 void cpp_hello_world(Args &args, Variant &retval);int swModule_init(swModule *module) {module->name = (char *) "test";PHP::registerFunction(function(cpp_hello_world)); }void swModule_destory(swModule *module) {PHP::destory(); }//C++函數(shù)的實(shí)現(xiàn) void cpp_hello_world(Args &args, Variant &retval) {printf("SWOOLE_BASE=%ld\n", PHP::constant("SWOOLE_BASE").toInt());printf("swoole_table::TYPE_INT=%ld\n", PHP::constant("swoole_table::TYPE_INT").toInt());Variant argv = args.toArray();var_dump(argv);Array arr(retval);arr.set("key", "key");arr.set("value", 12345); }- PHP_API.hpp和module.h在Swoole包中
- swModule_init表示模塊初始化函數(shù)
- swModule_destory是模塊銷毀函數(shù)
- cpp_hello_world就是我們編寫的C++擴(kuò)展函數(shù),在PHP代碼中可以調(diào)用cpp_hello_world()來(lái)執(zhí)行
- 在swModule_init中調(diào)用了PHP::registerFunction注冊(cè)C++函數(shù)到PHP中
程序邏輯
cpp_hello_world函數(shù)中的代碼邏輯比較簡(jiǎn)單,首先cpp_hello_world函數(shù)一共2個(gè)參數(shù),argv表示傳入的參數(shù),retval是給PHP的返回值。
在代碼中可以直接使用數(shù)組的方式訪問參數(shù),如下:
void cpp_hello_world(Args &args, Variant &retval) {int a = argv[0].toInt();string b = argv[1].toString();double c = argv[2].toFloat(); }使用var_dump函數(shù)可以打印PHP變量的值。
Variant d = argv[3]; var_dump(d);返回值可以直接賦值。
retval = 1234; retval = "hello world";可以使用Array類實(shí)現(xiàn)數(shù)組操作。
//將返回值轉(zhuǎn)為數(shù)組 Array arr(retval); arr.set("key", 123); arr.set("value", "world");編譯程序
編寫Makefile
SWOOLE_SRC = "/home/htf/workspace/swoole" PHP_INCLUDE = `php-config --includes` PHP_LIBS = `php-config --libs` PHP_LDFLAGS = `php-config --ldflags`all: test.cppc++ -DHAVE_CONFIG_H -g -o test.so -O0 -fPIC -shared test.cpp ${PHP_INCLUDE} -std=c++11 -I${SWOOLE_SRC}/include -I${SWOOLE_SRC} clean: test.sorm test.so編譯模塊
make編譯完成后,會(huì)生成一個(gè)test.so,可以使用swoole_load_module方法來(lái)加載模塊
運(yùn)行程序
$module = swoole_load_module(__DIR__.'/test.so'); cpp_hello_world(1234, "hello", 3.1415, array("xxx", "eeee")); $module->destory();轉(zhuǎn)載于:https://my.oschina.net/matyhtf/blog/864656
總結(jié)
以上是生活随笔為你收集整理的基于Swoole开发PHP扩展的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springmvc的执行流程详解
- 下一篇: php 图片剪切