基于Swoole开发PHP扩展
生活随笔
收集整理的這篇文章主要介紹了
基于Swoole开发PHP扩展
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
Swoole-1.9.7增加了一個新特性,可以基于Swoole使用C++語言開發擴展模塊,在擴展模塊中可以注冊PHP內置函數和類。現在可以基于Swoole來編寫PHP擴展了。Swoole使用了C++ 11封裝了ZendAPI,配合C++ IDE的自動提示和自動補齊,使PHP擴展開發的效率得到了大幅提升,分分鐘寫出一個PHP擴展。
環境準備
- 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++函數必須要在頭部聲明 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++函數的實現 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表示模塊初始化函數
- swModule_destory是模塊銷毀函數
- cpp_hello_world就是我們編寫的C++擴展函數,在PHP代碼中可以調用cpp_hello_world()來執行
- 在swModule_init中調用了PHP::registerFunction注冊C++函數到PHP中
程序邏輯
cpp_hello_world函數中的代碼邏輯比較簡單,首先cpp_hello_world函數一共2個參數,argv表示傳入的參數,retval是給PHP的返回值。
在代碼中可以直接使用數組的方式訪問參數,如下:
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函數可以打印PHP變量的值。
Variant d = argv[3]; var_dump(d);返回值可以直接賦值。
retval = 1234; retval = "hello world";可以使用Array類實現數組操作。
//將返回值轉為數組 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編譯完成后,會生成一個test.so,可以使用swoole_load_module方法來加載模塊
運行程序
$module = swoole_load_module(__DIR__.'/test.so'); cpp_hello_world(1234, "hello", 3.1415, array("xxx", "eeee")); $module->destory();轉載于:https://my.oschina.net/matyhtf/blog/864656
總結
以上是生活随笔為你收集整理的基于Swoole开发PHP扩展的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springmvc的执行流程详解
- 下一篇: php 图片剪切