本篇文章更新時間:2019/02/16
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
前言
這東西神到一個沒話說! 絕對是現在開發 PHP extension (延伸外掛模組),最好用的辦法!沒有之一。
會用到它的緣由主要是手邊正在開發一個網站端工具,Github 上面也找得到部分原始碼,不過因為是採用 C 語言撰寫,所以就花了點時間 porting PHP 版本。
問題來了,一樣的演算法,怎麼最後算出來結果誤差這麼大?這麼慢?
C 語言的答案: 2458123.909763
PHP 語言的答案: 2458489.14831
原來是 PHP 有浮點數「精度」問題,所以遞迴逼近求精準的時候在小數點後面第五位就停住了,這樣該如何是好勒~
文件中有提示可以使用 GMP 函數,但這樣替換比對方法後效能也不會快到哪,何不乾脆直接利用原始 C 語言程式碼做成 extension 就好了? 速度絕對是嚇嚇叫。
這套工具是以 C++ 為主,不過 C++ 有向下相容 C ,所以可以說直接套用都沒問題!
開發環境建立流程
- 首先會需要編譯出一個 PHP 環境
- 下載 PHP-CPP 框架
- 設定 PHP-CPP 框架中的 Makefile,符合 PHP 環境參數(phpize 與 php-config 路徑)
- 編譯 PHP-CPP 框架,並安裝
以上四個步驟有幾點注意:
一、如果你要開發的 PHP 延伸套件是採用 PHP 5.x 版本,要前往 PHP-CPP-LEGACY 版本下載。目前的版本是支援 PHP 7 以上的!
二、下載 PHP 原始碼包位置在這
三、作業系統支援度問題,個人實測 Mac 10.12.6 與 Ubuntu 16.04 都沒問題。
四、Mac 上使用,編譯前 Makefile 需要更改一些設定,可以參考這 issue。
開發流程
- 下載延伸套件模板
- 修改模板 Makefile 檔案中,extension 名稱、php-config 路徑 等
- 看文件參考包裝寫法
- 編譯、測試、安裝(make & make install)
注意事項:
一、除了文件中沒有特別舉例 PHP function 回傳資料的範例,要參考類別與物件這點外,文件其他部分也已經滿詳細說明了!仔細看文件就對惹~
二、安裝是指如果也有指定好執行環境的話,這框架也會幫你自動處理。記得安裝好後要 reload 一下 config!
三、測試的方法可以使用 php -d extension=$PWD/yourtestextension.so -f test.php
指令,絕對路徑指向 extension 所在地,套用上後執行撰寫好測試方法的 test.php 檔案,看輸出確認結果。
後記
至少超過五年沒寫 C / C++ 了,突然間都陌生了起來,不過沒辦法,花時間 proting 過去的版本發生這種嚴重架構問題,自然是要想辦法解了(眼神死)。
PHP 版本執行時間: Result:2458489.14831(0.119075059891s)
PHP extension 版本執行時間: Result:2458123.909763(0.000473022460938s)
差距有 0.1 秒之多,且在維護層面上更方便了! 可以說是無痛移植 C 語言版本的演算法到 PHP 上,往後有類似的開發就可以比照辦理。
哦對了,如果要「不用這種開發框架」的原生 PHP extension 寫法可以參考這簡報,就會知道有多麻煩(誤), 但觀念面這簡報還是很不錯的,值得一讀!