PHP允許使用擴展的方式,直接使用C語言開發PHP的功能,由於編譯的問題,很多底層和框架的基礎工作如果用PHP必然會帶來額外的開銷,降低系統的吞吐量,必然yaf就是這樣的思路,把框架封裝在擴展里,讓系統開銷降低到最小,基本接近不用框架的性能水平。
首先是獲取PHP的源代碼,這里提供一個PHP源碼的下載地址,目前最新的是PHP7.1,不夠考慮到我一直在用的環境,這里選擇PHP 5.4.31為例。
第二是在Windows平台下的PHP編譯部署。在Windows下需要用到Visual Studio,PHP 5.4.31用到的是Visual Studio 2008,同時需要升級到vS2008 SP1編譯才能正常編譯使用。否則在部署之后就會出現無法加載的問題。
注意,在此之前,windows需要先安裝php,並把php加入到環境變量中,推薦安裝xampp,一步到位。
VS2008 SP1 :下載地址
PHP 5.4.31源碼:下載地址
PHP5ts.lib:下載地址
安裝完開發環境之后,就可以開始進行配置了。在Windows下開發擴展在創建項目時比在Ubuntu上要麻煩的多,一個是需要PHP的源代碼,還有一個就是配置需要先構建一個項目,然后手動配置,不能像Ubuntu下那么直接執行一個腳本就完事了。將源代碼部署在E:\Projects\php-5.4.45-src路徑下,然后使用管理員身份運行終端(cmd.exe)然后
cd E:\Projects\php-5.4.45-src\ext php ext_skel_win32.php --extname=hello
就可以構建一個PHP擴展的開發項目,(路徑在 E:\Projects\php-5.4.45-src\ext\hello)可以看到如下圖所示的項目文件
利用之前安裝好的VS2008SP1 打開這個項目。可以看到如下內容
右鍵選中項目 打開右鍵菜單-->屬性,如下
點擊C/C++-->常規,找到並打開如下圖紅圈所示
把這是個地址都修改成PHP源碼部署的絕對地址,這樣就不會出現稍微移動一下項目位置就會出現不能編譯的問題,修改后的地址如下
配置好之后,還需要在PHP源碼上做一些設置,
找不到..main\config.w32.h文件的錯誤
(2)需要單獨下載php5ts.lib並進行配置,否則會出現
1>LINK : fatal error LNK1181: 無法打開輸入文件“php5ts.lib”
錯誤,將php5ts.lib解壓到E:\Projects\php-5.4.45-src\build,然后打開項目屬性--->鏈接器--->輸入,然后把值改成如下圖標識的樣子。
到此為止,就可以開始編譯項目了。編譯出來的動態庫,通過在php.ini后增加擴展的方式,然后重啟xampp,就可以通過phpinfo()函數看到了。
第三是在Ubuntu平台下的編譯部署,在Ubuntu下開發php擴展要簡單的多,首先一樣先安裝xampp for Ubuntu,安裝方法可以參考我前一篇文章《Ubuntu16.04的PHP開發環境配置》。然后配置系統的php環境,執行如下命令
將系統php和xampp中的php鏈接在一起,這樣可以方便測試php擴展。系統的php命令路徑在 cd /usr/local/bin,所以先切換到該路徑下
cd /usr/local/bin sudo mv php php-5.4.45 sudo mv php-cgi php-cgi-5.4.45 sudo mv php-config php-config-5.4.45 sudo mv phpize phpize-5.4.45 sudo ln -s /opt/lampp/bin/php-5.4.31 php sudo ln -s /opt/lampp/bin/php-cgi-5.4.31 php-cgi sudo ln -s /opt/lampp/bin/php-config-5.4.31 php-config sudo ln -s /opt/lampp/bin/phpize-5.4.31 phpize
sudo ln -s /opt/lampp/etc/php.ini /usr/local/lib/php.ini
執行之后,xampp apache使用的php和終端使用的php就是同一個了。
接下來就可以開始創建項目了,設置PHP源碼放置在 home/Projects/php-5.4.45-src
注意 ext_skel 剛開始是沒有執行權限的,需要執行如下命令 給予執行權限
chmod 777 ext_skel
那么接下去創建項目可以執行如下的命令
cd /home/Projects/php-5.4.45-src/ext sudo ./ext_skel --extname=hello
cd hello
gedit config.m4 /*找到第16行和第18行去掉前面的dnl注釋,如下圖所示*/ sudo phpize sudo ./configure sudo make && make install sudo make test
注意保存文件之后,還需要執行phpize,否則還是會碰到不生成.so文件的問題。