再議 php-memcached 擴充套件的編譯,進一步理解 phpize
在寫完 ofollow,noindex" target="_blank">《php-memcached擴充套件升級小記》 這篇文章後,總覺得思考的還不夠深入,所以又仔細學習了下,從而對PHP有了進一步的理解。
《php-memcached擴充套件升級小記》 描述了 PECL 和 apt-get 安裝 php-memcached 擴充套件(其他的php擴充套件類似)的方法,這兩種都屬於比較傻瓜式的方法,隱藏了很多細節,一般情況下,不管採用原始碼編譯還是包安裝方式(比如apt-get)安裝 PHP 後,都面臨一個問題,如果需要安裝一個php擴充套件,需要重新編譯嗎?
如果你採用原始碼方式編譯 PHP,那麼可以通過 phpize 來編譯安裝擴充套件,無需重新編譯 PHP ;而如果 PHP 採用包安裝方式,那麼擴充套件安裝也非常方便,但內部好像並沒有採用了phpize來進行編譯(後面會提到)。
現在重點來了,重點講解 phpize 相關內容,它是一種安裝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擴充套件升級小記》 這篇文章的同學都知道,在 ECS 上我已經使用apt安裝了php-memcached擴充套件,首先先解除安裝它,然後手動使用phpize重新編譯安裝。
解除安裝命令如下:
$ apt-get purge php-memcached
注意該命令並不會解除安裝php-memcached擴充套件的依賴包libmemcached,如果你也想解除安裝,可以執行下列命令:
# 尋找依賴 $ apt-cachedepends php-memcached # 可以看出libmemcached最主要提供了一個.so檔案 $ dpkg -L libmemcached11 $ apt-get purgelibmemcached11
接下去尋找php-memcached擴充套件的原始碼,腦洞一下,如果你想安裝一個其他的php擴充套件,也可以去特定的倉庫尋找,php-memcached的包可以在 https://github.com/php-memcached-dev 找到。
執行下列命令:
$ 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,以此類推)提供,執行下列命令:
$ apt-get install php7.1-dev
php7.1-dev這個包定義如下:
This package provides the files from the PHP7.1 source needed for compilingadditional modules.
直白的說,提供了一些編譯環境,主要包含的兩個工具是php-config7.1和phpize7.1。
php-config7.1顯示apt-get安裝php7.1採用的編譯引數,可以執行下看看輸出。phpize則是本文講解的重點,有了phpize執行環境後,接著執行:
$ /usr/bin/phpize7.1 # 配置引數,需要連結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對應的標頭檔案,可以執行下列命令安裝:
$ apt-get install libmemcached-dev # 可以看到 /usr/include/libmemcached/memcached.h 標頭檔案 $ dpkg -L libmemcached-dev
現在妥妥的再一次執行:
$ ./configure--with-libmemcached-dir=/usr/lib/x86_64-linux-gnu
可還是報錯…,原因在於phpize要去php-memcached原始碼目錄尋找libmemcached的.h標頭檔案,執行下令命令就能解決:
$ 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
基本上講完了,學到哪兒就說到哪兒,進一步理解了phpize,當然還有很多知識待學習,比如php編譯到底發生了什麼?phpize內部到底怎麼運作的,有機會我還會持續分享的。
在 《php-memcached擴充套件升級小記》 文末提到我公眾號關注人數已經 500 個了,也做了一次送書 《深入淺出HTTPS:從原理到實戰》 活動 (留言點贊排名第一即可),截止時間是 本週末 ,大家可以去那篇文章中留言點贊,留言內容和那篇文章並無關係, 形式和內容隨意 ,比如對於這個公眾號的期望,或者對我書進行點評,謝謝大家轉發、留言、點贊。