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
要想使用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爲例。linux
若是你會git命令,能夠直接在終端命令行敲入如下git命令便可。ios
# git clone https://github.com/CopernicaMarketingSoftware/PHP-CPP-LEGACY.git
若是不會git也不要緊,能夠直接用瀏覽器打開該源碼的github倉庫網址,下載源碼壓縮包並解壓便可,倉庫網址是
https://github.com/CopernicaM...。c++
下載完成後,進入PHP-CPP-LEGACY的源碼目錄,敲入make命令編譯源碼,編譯完成後會生成開發擴展所須要的相關類庫。git
# make
接着運行make install命令,把生成的類庫和相關開發的頭文件安裝到linux系統裏面去,一下子編譯擴展的時候就能夠不用配置頭文件和類庫目錄也能自動鏈接上了。程序員
# sudo make install
第一個擴展 helloworld 的源碼已經在github上準備好了,直接用git命令克隆,或者手工下載均可以。github
# git clone https://github.com/elvisszhang/phpcpp_helloworld.git
進入helloworld源碼目錄,打開main.cpp,能夠看到以下代碼結構,已經都給加了中文註釋。
其中最重要的就是 get_module 函數,它是擴展的入口函數。segmentfault
#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代碼。centos
<?php say_hello();
編譯這個擴展很簡單,在終端命令行下輸入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的運行環境裏。
咱們這裏暫時介紹手工安裝擴展的方式。
# php-config --extension-dir /usr/local/php56/lib/php/extensions/no-debug-non-zts-20131226
上面顯示的是我服務器上擴展安裝的位置,各人的服務器可能配置不同。
# cp helloworld.so /usr/local/php56/lib/php/extensions/no-debug-non-zts-20131226/
打開 php.ini文件,加上如下配置項,在php.ini的任意地方新加一行便可。
extension = helloworld.so
使用php -m命令能夠查看php目前已經安裝的全部擴展。
# php -m | grep helloworld helloworld
從上面命令行的響應看,helloworld擴展已經安裝成功了。
仍是在擴展的源碼目錄,運行如下命令
# php test.php hello world from my first extension
從上面命令行的響應看,咱們經過擴展向php註冊的say_hello函數已經成功運行了,是否是感受很簡單,但如今的擴展只會打個招呼,還幹不了什麼正兒八經的事,咱們後面給他完善一下,讓他能作更多的事情。