PHP-CPP是一個用於開發PHP擴展的C++庫。PHP-CPP提供了一系列完善的文檔、易於使用和擴展的類,讓你可以相對快速的創建PHP的原生擴展。
系列筆記:
- PHP-CPP開發擴展(七)
- PHP-CPP開發擴展(六)
- PHP-CPP開發擴展(五)
- PHP-CPP開發擴展(四)
- PHP-CPP開發擴展(三)
- PHP-CPP開發擴展(二)
- PHP-CPP開發擴展(一)
為什么使用PHP-CPP
- 很快
用C++編寫的代碼很快:比用PHP編寫的代碼快得多。 - 簡單
用C++編寫的算法看起來幾乎與用PHP編寫的算法相同。如果你知道如何用PHP編程,你可以很容易地學習如何在C++中做同樣的事情。實際上,PHP和大多數PHP函數名的語法都直接來自C和C++語法。 - 無需Zend引擎知識
Zend引擎的內部結構過於復雜,Zend引擎的代碼很亂,而且大部分都沒有記錄。 - 完善的文檔
- 支持所有重要的PHP功能
使用PHP-CPP,你可以像使用普通的PHP腳本一樣輕松地處理變量、數組、函數、對象、類、接口、異常和命名空間。除此之外,你還可以使用C++的所有功能,包括線程,lambdas和異步編程。 - 免費的
PHP-CPP是一種開源技術,可供你免費使用。
環境准備
GCC版本不能太低,因為需要支持c++11特性。我使用的版本:
gcc version 7.2.0
如果你是CentOS的系統,可能GCC版本最高就是4.4.7,這時候只能通過手動編譯重新安裝了。
官方文檔:http://www.php-cpp.com/documentation/
安裝PHP-CPP
PHP-CPP區分PHP5和7系列,但是對外提供的API是一樣的。
PHP5:
$ git clone https://github.com/CopernicaMarketingSoftware/PHP-CPP-LEGACY.git
PHP7:
$ git clone https://github.com/CopernicaMarketingSoftware/PHP-CPP.git
然后編譯安裝:
$ make
$ sudo make install
Hello World
可以先clone下面這個例子來嘗鮮:
git clone https://github.com/elvisszhang/phpcpp_helloworld.git
進入helloworld源碼目錄,打開main.cpp,可以看到如下代碼結構:
/**
* User: 公眾號: 飛鴻影的博客(fhyblog)
* Date: 2018/7
*/
#include <phpcpp.h>
#include <iostream>
//這是PHP里面可以調用的接口函數
void say_hello()
{
//輸出一段歡迎文字
Php::out << "hello world from my first extension" << std::endl;
}
/**
* 告訴編譯器get_module是個純C函數
*/
extern "C" {
/**
* 本函數在PHP進程一打開就會被訪問,並返回一個描述擴展信息的PHP結構指針
*/
PHPCPP_EXPORT void *get_module()
{
// 必須是static類型,因為擴展對象需要在PHP進程內常駐內存
static Php::Extension extension("helloworld", "1.0.0");
//這里可以添加你要暴露給PHP調用的函數
extension.add<say_hello>("say_hello");
// 返回擴展對象指針
return extension;
}
}
PHP-CPP庫定義了一個PHPCPP_EXPORT
宏,它應該放在get_module()
函數的前面。此宏確保get_module()
函數是公共導出的,因此可由PHP調用。宏具有基於編譯器和操作系統的不同實現。
編譯這個擴展很簡單,在終端命令行下輸入make命令即可:
$ make
g++ -Wall -c -O2 -std=c++11 -fpic -o main.o main.cpp
g++ -shared -o helloworld.so main.o -lphpcpp
$ sudo make install
編譯完成會在源碼目錄下看到 helloworld.so 這個擴展文件。然后在php.ini文件添加擴展:
extension = helloworld.so
輸入:
php -m | grep helloworld
就可以看到擴展。
測試源碼目錄下有個test.php,執行:
$ php test.php
hello world from my first extension
(未完待續)
想第一時間獲取最新動態,歡迎關注關注飛鴻影的博客(fhyblog)
,不定期為您呈現技術干貨。