PHP 板


LINE

看板 PHP  RSS
如果 PHP 程式的速行速度無法滿足需求 將其改寫成 PHP extension 或許可以處理這個議題 傳統上,要寫 PHP extension 要用 C,而且要懂 Zend C API 說實在,還蠻費心力的 幸好有工程師開發了替代的方案,讓後人不需再和 Zend C API 奮戰 經 google 可知大致上有兩種方案: 1. Zephir:一個新的 PHP-like 編譯語言,寫完後程式碼可編譯成 PHP extension 是由 Phalcon 團隊開發的,Phalcon 本身也有使用這個語言 2. PHP-CPP:一個 C++ 函式庫,加入特有的 PHP 相關物件 由於 PHP-CPP 的寫法,和原來的 C++ 略有不同,筆者將其視為一種 DSL 使用這個方案的好處在易於橋接外部 C/C++ 函式庫 預計會寫兩篇,這是第一篇 首先,要實作 doubler 這個 toy library 這個函式庫是用 Rust 撰寫,輸出成 C shared library 如果不想用 Rust,也可用其他語言,能輸出 C/C++ shared library 即可 目前這個 library 已完成 但是,Rust 不會自動生成 header,要自己撰寫 撰寫 header 時要注意,我們會輸出到 C++ 中 要用 extern "C" 避免 name mangling #ifndef _DOUBLER_H_ #define _DOUBLER_H_ #ifdef __cplusplus extern "C" { #endif int double_int(int); double double_float(double); char* double_str(char*); void str_free(char*); #ifdef __cplusplus } #endif #endif // _DOUBLER_H_ 接著,要到 PHP-CPP 官網下載 EmptyExtension 這個專案骨架,再自行修改 目前仍要手動改 Makefile,還沒有自動化的流程 這部分請板友參考小弟的 repo 自行修改 接著,實作 C++ 程式碼的部分 要注意的是,PHP-CPP 的撰寫方式,和一般的 C++ 程式碼略有不同 我們看一下實際的範例 #include <phpcpp.h> #include <string> #include "doubler.h" using std::string; class Doubler : public Php::Base { public: Doubler() = default; virtual ~Doubler() = default; static Php::Value int_number(Php::Parameters&); static Php::Value float_number(Php::Parameters&); static Php::Value str(Php::Parameters&); }; Php::Value Doubler::int_number(Php::Parameters& params) { return double_int((int32_t)params[0]); } Php::Value Doubler::float_number(Php::Parameters& params) { return double_float((double)params[0]); } Php::Value Doubler::str(Php::Parameters& params) { char* s = double_str((char*)params[0].rawValue()); string output = string(s); str_free(s); return output; } 由以上程式碼,可發現撰寫 PHP-CPP 專案時,使用了特別的 Php::Parameters 表示 PHP 參數,回傳值也是特別的 Php::Value。另外,非基本型別要另外釋放記憶體。 其實我們這個 library 沒有物件,都是 static method,用類別只是當成命名空間 PHP-CPP 也支援非物件的函式和 PHP 的命名空間,可自行參考官網的說明 最後,要輸出該物件到 PHP。以下的 get_module 函式是每個 PHP-CPP 專案都有的 extern "C" { PHPCPP_EXPORT void *get_module() { static Php::Extension extension("doubler", "1.0"); // Put your library here Php::Class<Doubler> doubler("Doubler"); doubler.method<&Doubler::int_number>("int_number", { Php::ByVal("x", Php::Type::Numeric) }); doubler.method<&Doubler::float_number>("float_number", { Php::ByVal("x", Php::Type::Float) }); doubler.method<&Doubler::str>("str", { Php::ByVal("x", Php::Type::String) }); extension.add(std::move(doubler)); return extension; } } 撰寫完相關程式碼後,再編譯即可得到 PHP extension。 可以寫一個簡單的 PHP 程式呼叫此 extension <?php // main.php echo Doubler::int_number(2), "\n"; echo Doubler::float_number(1.3), "\n"; echo Doubler::str("Hi"), "\n"; 如果只是要測試,不想安裝 extension,可從命令列呼叫此 extension $ php -dextension=`pwd`/doubler.so main.php 這個範例到這裡算是告一段落了 接下來,我們會用另一個範例繼續展示 PHP-CPP 的使用 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.36.80
※ 文章網址: https://webptt.com/m.aspx?n=bbs/PHP/M.1481079805.A.F1A.html
1F:推 xdraculax: 純推不下 12/07 13:00
2F:推 shadowjohn: 離上一次寫extension是6年前作手寫輸入法... 12/07 13:04
3F:推 locklose: 推 12/07 16:30
※ 編輯: Neisseria (60.251.46.166), 12/24/2018 16:06:39







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP