PHP擴充套件開發教程2 – 編寫第一個擴充套件 hello world

嘉心嘉軟發表於2019-02-16

PHP擴充套件是高階PHP程式設計師必須瞭解的技能之一,對於一個初入門的PHP擴充套件開發者,怎麼才能開發一個成熟的擴充套件,進入PHP開發的高階領域呢?本系列開發教程將手把手帶您從入門進入高階階段。
本教程系列在linux下面開發(推薦使用centos),php版本用的是5.6,並假設您有一定的linux、git操作經驗和c/c++基礎。
有問題需要溝通的朋友請加QQ技術交流群32550793和我溝通。

我們使用容易上手的PHP-CPP框架來開發PHP擴充套件,如果您有一定的linux操作經驗和c++基礎,按照下面的步驟,相信用不了10分鐘就能做出屬於你自己的第一個擴充套件出來。
以下示範的操作都是在linux centos系統上完成的,並且已經事先安裝了php5.6系列。

一、下載並安裝 PHP-CPP

要想使用PHP-CPP編譯屬於您自己的php擴充套件,需要先下載PHP-CPP的原始碼並編譯安裝。
PHP-CPP有兩個框架原始碼,分別叫 PHP-CPP(新版) 和 PHP-CPP-LEGACY。
PHP-CPP(新版)適合開發PHP-7的擴充套件,PHP-CPP-LEGACY則適合開發5.X系列的擴充套件,兩套框架的介面一樣,學會了其中一個就很容易做出相容的PHP各版本的擴充套件出來。
下面我們的操作都以PHP-CPP-LEGACY為例。

如果你會git命令,可以直接在終端命令列敲入以下git命令即可。

# git clone https://github.com/CopernicaMarketingSoftware/PHP-CPP-LEGACY.git

如果不會git也沒關係,可以直接用瀏覽器開啟該原始碼的github倉庫網址,下載原始碼壓縮包並解壓即可,倉庫網址是
https://github.com/CopernicaM…

下載完成後,進入PHP-CPP-LEGACY的原始碼目錄,敲入make命令編譯原始碼,編譯完成後會生成開發擴充套件所需要的相關類庫。

# make

接著執行make install命令,把生成的類庫和相關開發的標頭檔案安裝到linux系統裡面去,一會兒編譯擴充套件的時候就可以不用配置標頭檔案和類庫目錄也能自動連線上了。

# sudo make install

二、下載第一個擴充套件 helloworld

第一個擴充套件 helloworld 的原始碼已經在github上準備好了,直接用git命令克隆,或者手工下載都可以。

# git clone https://github.com/elvisszhang/phpcpp_helloworld.git

進入helloworld原始碼目錄,開啟main.cpp,可以看到如下程式碼結構,已經都給加了中文註釋。
其中最重要的就是 get_module 函式,它是擴充套件的入口函式。

#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;
    }
}

test.php則是擴充套件測試用的一段php程式碼。

<?php
say_hello();

三、編譯第一個擴充套件 helloworld

編譯這個擴充套件很簡單,在終端命令列下輸入make命令即可。

# make
g++ -Wall -c -O2 -std=c++11 -fpic -o main.o main.cpp
g++ -shared -o helloworld.so main.o -lphpcpp

不出意料的話,就會在原始碼目錄下看到 helloworld.so 這個擴充套件檔案了,可以發現這個檔案很小,才14K而已。
不過現在如果你敲一下命令 php -m ,發現php的模組中並沒有 helloworld 這個擴充套件,因為我們還沒有把它安裝到php的執行環境裡。

四、安裝第一個擴充套件 helloworld

我們這裡暫時介紹手工安裝擴充套件的方式。

  • 第一步: 先用php-config命令確定一下擴充套件存放的位置
# php-config --extension-dir
/usr/local/php56/lib/php/extensions/no-debug-non-zts-20131226

上面顯示的是我伺服器上擴充套件安裝的位置,各人的伺服器可能配置不一樣。

  • 第二步:然後把 helloworld.so 拷貝到擴充套件存放目錄下。
# cp helloworld.so /usr/local/php56/lib/php/extensions/no-debug-non-zts-20131226/
  • 第三步:修改 php.ini 檔案,啟用 helloworld 擴充套件

開啟 php.ini檔案,加上以下配置項,在php.ini的任意地方新加一行即可。

extension = helloworld.so
  • 第四步:確認 helloworld擴充套件已經安裝成功

使用php -m命令可以檢視php目前已經安裝的所有擴充套件。

# php -m | grep helloworld
helloworld

從上面命令列的響應看,helloworld擴充套件已經安裝成功了。

  • 第五步:執行 test.php 確認註冊函式能使用

還是在擴充套件的原始碼目錄,執行以下命令

# php test.php
hello world from my first extension

從上面命令列的響應看,我們通過擴充套件向php註冊的say_hello函式已經成功執行了,是不是感覺很簡單,但現在的擴充套件只會打個招呼,還幹不了什麼正兒八經的事,我們後面給他完善一下,讓他能做更多的事情。

參考文獻

PHP-CPP安裝以及hello world
PHP-CPP官網教程

相關文章