日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

基于Swoole开发PHP扩展

發(fā)布時(shí)間:2024/4/14 php 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Swoole开发PHP扩展 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。