PHP-CPP開發擴展(一)


PHP-CPP是一個用於開發PHP擴展的C++庫。PHP-CPP提供了一系列完善的文檔、易於使用和擴展的類,讓你可以相對快速的創建PHP的原生擴展。

系列筆記:

為什么使用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),不定期為您呈現技術干貨。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM