前言

這東西神到一個沒話說! 絕對是現在開發 PHP extension (延伸外掛模組),最好用的辦法!沒有之一。

會用到它的緣由主要是手邊正在開發一個網站端工具,Github 上面也找得到部分原始碼,不過因為是採用 C 語言撰寫,所以就花了點時間 porting PHP 版本。

問題來了,一樣的演算法,怎麼最後算出來結果誤差這麼大?這麼慢?

C 語言的答案: 2458123.909763

PHP 語言的答案: 2458489.14831

原來是 PHP 有浮點數「精度」問題,所以遞迴逼近求精準的時候在小數點後面第五位就停住了,這樣該如何是好勒~

文件中有提示可以使用 GMP 函數,但這樣替換比對方法後效能也不會快到哪,何不乾脆直接利用原始 C 語言程式碼做成 extension 就好了? 速度絕對是嚇嚇叫。

這套工具是以 C++ 為主,不過 C++ 有向下相容 C ,所以可以說直接套用都沒問題!

開發環境建立流程

  1. 首先會需要編譯出一個 PHP 環境
  2. 下載 PHP-CPP 框架
  3. 設定 PHP-CPP 框架中的 Makefile,符合 PHP 環境參數(phpize 與 php-config 路徑)
  4. 編譯 PHP-CPP 框架,並安裝

以上四個步驟有幾點注意:

一、如果你要開發的 PHP 延伸套件是採用 PHP 5.x 版本,要前往 PHP-CPP-LEGACY 版本下載。目前的版本是支援 PHP 7 以上的!

二、下載 PHP 原始碼包位置在

三、作業系統支援度問題,個人實測 Mac 10.12.6 與 Ubuntu 16.04 都沒問題。

四、Mac 上使用,編譯前 Makefile 需要更改一些設定,可以參考這 issue

開發流程

  1. 下載延伸套件模板
  2. 修改模板 Makefile 檔案中,extension 名稱、php-config 路徑 等
  3. 看文件參考包裝寫法
  4. 編譯、測試、安裝(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 寫法可以參考這簡報,就會知道有多麻煩(誤), 但觀念面這簡報還是很不錯的,值得一讀!

Facebook 外掛功能


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[//////////____30%_________]