本文地址:http://www.cnblogs.com/aiweixiao/p/8202365.html 原文地址: 歡迎關註微信公眾號 程式員的文娛情懷 一、主要內容: 1️⃣php擴展的概念和底層實現 2️⃣編寫一個php擴展的步驟 3️⃣php底層,Zend 引擎API的介紹 ,HashTab ...
本文地址:http://www.cnblogs.com/aiweixiao/p/8202365.html
原文地址:
歡迎關註微信公眾號 程式員的文娛情懷
一、主要內容:
1️⃣php擴展的概念和底層實現
2️⃣編寫一個php擴展的步驟
3️⃣php底層,Zend 引擎API的介紹 ,HashTable 原理
二、相關概念
1.【php擴展】
php的插件,也就是php的擴展,因為php的底層就是C語言。
php –m 或者 php –i 都可以查看擴展。
其實,xhproh, curl都是php的擴展。
php的擴展圖phpinfo()
2.【為什麼要有擴展?】
1)【效率高】複雜的圖像演算法,需要寫成PHP擴展
2)【操作底層,未支持的技術】1)PHP需要支持一項她還未支持的技術。這通常包括包裹一些現成的C函數庫,以便提供PHP介面。 2)有些系統調用不能用PHP直接訪問,需要編寫成擴展,比如使用Linux下的fork()函數創建一個進程。
3)【商業化,保護源碼】想商業話一個應用,但是又不想暴露源代碼,就可以編寫成擴展。
3.【PHP核心組成?】
Zend引擎:1)核心、基礎設施 2)PHP語法實現 3)腳本編譯執行 4)擴展機制 5)記憶體管理
SAPI:伺服器抽象層, 上層調用它
php核心構成圖二、走向開發(編寫擴展)
總體步驟
①下載PHP源碼
要開發PHP擴展,第一步要下載PHP源代碼,因為裡面有開發擴展需要的工具。
下載地址: wget http://cn2.php.net/get/php-5.5.38.tar.gz/from/this/mirror
②生成擴展組件框架
ext_skel 命令
./ext_skel --extname=myext 會生成擴展基礎文件夾及文件 php-5.5.38/ext/myext/
③修改配置文件
修改config.m4文件,去掉配置前的dnl
config.m4: 這是Unix環境下的Build System配置文件,後面將會通過它生成配置和安裝。
修改配置config.m4
④編寫核心函數(可用預設的)
步驟如下(myext.c):
1、使用巨集PHP_FE將函數加入到myext_functions中
2、使用巨集PHP_FUNCTION定義函數體
擴展c文件myext.c
⑤編譯擴展+重啟
1、調用phpize程式生成編譯配置文件 cd myext && phpize
2、編譯擴展庫 ./configure --with-php-config=/Data/apps/php/bin/php-config
3、make
4、make test
5、sudo make install 生成myext.so 文件
6、 sudo vim /Data/apps/php/lib/php.ini 加上 extension=myext.so
7、 sudo /Data/apps/php/sbin/php-fpm reload
修改php配置文件,添加擴展
三、瞭解原理
php的生命周期 php的變數在內核--寫時複製 php的變數在內核--底層代碼對比 php的變數在內核--結構體表示 HashTable分析--結構體 HashTable分析--繪圖表示 Zend引擎API
四、寫在最後
php的核心是C語言,核心引擎是Zend,瞭解HashTable就能瞭解php的精髓。php的擴展開發說到底是C語言的編寫,更見底層功力,希望大家都能成為技術大牛。
最後,預祝大家2018年萬事如意,心想事成!