1. 程式人生 > >PHP-X介紹

PHP-X介紹

clas border 不用 hpc 效率 table 變量 art link

為什麽要開發PHP擴展

PHP-X是用來開發PHP擴展的庫。PHP代碼寫得好好的,為啥要開發PHP擴展呢?
1、我們知道PHP不擅長CPU密集型的操作,那麽把CPU密集型的相關代碼遷移到擴展上,就可以大幅提高效率了,比如加密mcrypt、序列化igbinary、圖像處理gd2等。

2、另外有些系統相關的操作,PHP沒有提供接口,那麽也可以通過擴展開提供,比如多進程PCNTL、多線程Pthread、文件事件inotify等。

3、追蹤PHP的調用,為代碼優化提供建議,比如各種監控APM。

大牛們說的從用戶空間沈降到內核空間,就是指從PHP代碼改為擴展。

開發擴展用的語言

PHP的解釋器ZendEngine提供了一些列C接口,可以用C、C++語言來開發接口。

由於擴展都是以動態庫的形式提供,理論上能生成動態庫並符合Zend接口的語言都可以,比如有人就用Rust來開發PHP擴展。
另外還可以用Zephir,專門用來開發PHP擴展的語言,著名的Phalcon就是用Zephir開發的。

使用C/C++開發擴展的姿勢

使用Zend提供的API來開發接口,實際上並不是很方便,具體的流程可以看這篇[教程](
http://www.php-internals.com/book/?p=chapt11/11-02-00-extension-hello-world)。

那麽我們怎麽開發呢?使用PHP-X,它是Swoole作者開源的,封裝了Zend的API,
可以方便的使用C\C++來開發PHP擴展。

安裝PHP7

PHP-X只支持PHP7以上,這裏我們使用PHP7.1來開發,測試發現PHP7.2暫時還不支持。
下面我們將在centos7環境上進行,你可以選擇自己喜歡的Linux系統。
自發現了remi源裏面有各種PHP相關的軟件包,我就變懶了,不再手工編譯了。
1.先安裝remi源 ,網址
yum install -y https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm
2.編輯remi配置 vi /etc/yum.repos.d/remi-php71.repo 打開PHP7.1
技術分享圖片


3.安裝PHP以及開發PHP的開發庫
yum install php php-devel -y
4.安裝cmake、gcc等
yum install cmake3 make gcc gcc-c++ git -y
5.編譯PHP-X
先下載PHP-X的代碼,git clone https://github.com/swoole/PHP-X
進入PHP-X文件夾

cmake .
make -j 4
sudo make install

可以看到如下輸出:
技術分享圖片

libphpx.so被安裝到了/usr/local/lib下
6.測試
進入example/cpp_ext 目錄下
make install
會自動把生成的cpp_ext.so復制到PHP的擴展目錄。
這時可以修改php.ini,remi源使用的是php.d文件夾中的ini,即每個擴展獨立的配置,這種做法比修改完整的php.ini更好。
我們也采用這種方式。
下查看一下配置目錄,如下:
技術分享圖片

然後新建cpp_ext.ini,內容為:

extension=cpp_ext.so

復制 cp cpp_ext.ini /etc/php.d/

運行 php -m | grep cpp_ext 如果有輸出,則安裝成功。

如果出現下面的錯誤,表示libphpx.so動態庫沒找到,我們需要配置一下動態庫的加載路徑。
技術分享圖片

使用ldd查看一下cpp_ext.so,確實沒找到libphpx.so。
技術分享圖片

配置動態庫加載路徑

  • 先查看環境echo $LD_LIBRARY_PATH變量,如果輸出為空,則配置為export LD_LIBRARY_PATH=/usr/local/lib/
    如果不為空,則export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/
  • 刷新環境變量 source ~/.bashrc
  • 刷新動態庫緩存 lddconfig

更多的文檔可以參考作者在PHPCon China 2017上使用C++開發PHP7擴展 的演講(PS:網頁上還有有其它演講者的ppt,值得一看,或者在這裏下載)以及官網文檔。

擴展

我們看到使用PHP-X編寫的擴展庫,並不能獨立運行,還需要libphpx.so才行。那麽可以做到擴展獨立嗎?

熟悉C\C++的人知道,庫分為動態庫,和靜態庫。如果編譯的時候把PHP-X編譯為靜態庫,並采用靜態鏈接的方式,就可以把我們的自己編寫的擴展獨立於libphpx.so了。

獨立的好處在於部署方便,發布後用戶就不用額外依賴PHP-X了;壞處在於如果都使用PHP-X,就造成了代碼冗余。

另外類似PHP-X的還有國外的PHP-CPP。

PHP-X介紹