在寫完《php-memcached擴展升級小記》這篇文章后混滔,總覺得思考的還不夠深入洒疚,所以又仔細學(xué)習(xí)了下,從而對PHP有了進一步的理解遍坟。
《php-memcached擴展升級小記》描述了 PECL 和 apt-get 安裝 php-memcached 擴展(其他的php擴展類似)的方法拳亿,這兩種都屬于比較傻瓜式的方法,隱藏了很多細節(jié)愿伴,一般情況下肺魁,不管采用源代碼編譯還是包安裝方式(比如apt-get)安裝 PHP 后,都面臨一個問題隔节,如果需要安裝一個php擴展鹅经,需要重新編譯嗎?
如果你采用源代碼方式編譯 PHP怎诫,那么可以通過 phpize 來編譯安裝擴展瘾晃,無需重新編譯 PHP ;而如果 PHP 采用包安裝方式幻妓,那么擴展安裝也非常方便蹦误,但內(nèi)部好像并沒有采用了phpize來進行編譯(后面會提到)。
現(xiàn)在重點來了肉津,重點講解 phpize 相關(guān)內(nèi)容强胰,它是一種安裝php擴展的工具,如果想安裝一個php擴展妹沙,但 PECL 沒有支持該擴展偶洋;或者該擴展版本比較高,apt-get包安裝不支持該版本距糖,那么只能通過 phpize 安裝了玄窝。
如何描述 phpize 呢?可以參考:
phpize is a shell script to prepare PHP extension for compiling.
接下去我在ECS(Ubuntu)上講解如何使用 phpize悍引,演示的例子還是php-memcached擴展的安裝恩脂,使用的 PHP 版本是php 7.1,通過 apt-get 安裝趣斤。
看過《php-memcached擴展升級小記》這篇文章的同學(xué)都知道俩块,在 ECS 上我已經(jīng)使用apt安裝了php-memcached擴展,首先先卸載它,然后手動使用phpize重新編譯安裝典阵。
卸載命令如下:
$ apt-get purge php-memcached
注意該命令并不會卸載php-memcached擴展的依賴包libmemcached,如果你也想卸載镊逝,可以執(zhí)行下列命令:
# 尋找依賴
$ apt-cache depends php-memcached
# 可以看出libmemcached最主要提供了一個.so文件
$ dpkg -L libmemcached11
$ apt-get purge libmemcached11
接下去尋找php-memcached擴展的源代碼壮啊,腦洞一下,如果你想安裝一個其他的php擴展撑蒜,也可以去特定的倉庫尋找歹啼,php-memcached的包可以在 https://github.com/php-memcached-dev 找到。
執(zhí)行下列命令:
$ git clone https://github.com/php-memcached-dev/php-memcached memcached
$ cd memcached/
$ phpize
在我的ECS上運行上列命令座菠,顯示 phpize 不存在狸眼,這也說明我使用apt-get安裝php的時候,并沒有提供phpize浴滴,那么如何安裝 phpize 呢拓萌?
其實它由php7.1-dev包(php7.2,則是php7.2-dev升略,以此類推)提供微王,執(zhí)行下列命令:
$ apt-get install php7.1-dev
php7.1-dev這個包定義如下:
This package provides the files from the PHP7.1 source needed for compiling
additional modules.
直白的說,提供了一些編譯環(huán)境品嚣,主要包含的兩個工具是php-config7.1和phpize7.1炕倘。
php-config7.1顯示apt-get安裝php7.1采用的編譯參數(shù),可以執(zhí)行下看看輸出翰撑。phpize則是本文講解的重點罩旋,有了phpize執(zhí)行環(huán)境后,接著運行:
$ /usr/bin/phpize7.1
# 配置參數(shù)眶诈,需要鏈接libmemcached
$ ./configure --with-libmemcached-dir=/usr/lib/x86_64-linux-gnu
還是會提示錯誤涨醋,手動查看/usr/lib/x86_64-linux-gnu/libmemcached.so.11 文件也存在啊,這個so是由apt-get install libmemcached11
提供的册养。
采用phpize編譯东帅,必須連接.h頭文件,為了提供libmemcahced對應(yīng)的頭文件球拦,可以執(zhí)行下列命令安裝:
$ apt-get install libmemcached-dev
# 可以看到 /usr/include/libmemcached/memcached.h 頭文件
$ dpkg -L libmemcached-dev
現(xiàn)在妥妥的再一次執(zhí)行:
$ ./configure --with-libmemcached-dir=/usr/lib/x86_64-linux-gnu
可還是報錯...靠闭,原因在于phpize要去php-memcached源代碼目錄尋找libmemcached的.h頭文件,執(zhí)行下令命令就能解決:
$ mkdir -p /usr/lib/x86_64-linux-gnu/include/libmemcached/
$ ln -s /usr/include/libmemcached/memcached.h /usr/lib/x86_64-linux-gnu/include/libmemcached/memcached.h
$ ./configure --with-libmemcached-dir=/usr/lib/x86_64-linux-gnu
$ make
$ make install
成功編譯后坎炼,安裝的php-memcached擴展存儲在 /etc/php/7.1/mods-available 目錄下愧膀,那么如何啟用php-memcached呢?不用手動配置谣光,一個命令就能夠解決:
# 可以對php所有的sapi(cli檩淋、php-fpm等等)啟用該模塊
$ phpenmod php-memcached
phpenmod 來源于哪兒呢?php7.1-common 包提供了很多有用的命令,比如:
$ phpdismod php-memcached
$ phpquery -v 7.1 -s cli -M
基本上講完了蟀悦,學(xué)到哪兒就說到哪兒媚朦,進一步理解了phpize,當(dāng)然還有很多知識待學(xué)習(xí)日戈,比如php編譯到底發(fā)生了什么询张?phpize內(nèi)部到底怎么運作的,有機會我還會持續(xù)分享的浙炼。
【這篇文章于2018-10-17號發(fā)表于公眾號,地址https://mp.weixin.qq.com/s/v2FvcJd_SDob19ToXxLWIA份氧,也可以關(guān)注我的公眾號(ID:yudadanwx,虞大膽的嘰嘰喳喳)】