Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

LNMP PHP 升級錯誤排除

前陣子幫這台主機升級 PHP 的時候,失敗了幾次,
從 log 檔裡面發現了幾個跳錯的點,順手記下來,下次可以先注意一下。

雖然使用的是 lnmp.org 提供的堆疊指令碼 (stack scripts),照理說不應該會有什麼太大問題,
但是這中間我曾經將主機的作業系統,從 Ubuntu 16 升級到 18.04,
所以可能有些函式庫的連結出錯,導致這樣的結果。
但因為時間有點久遠,當初也沒做紀錄,所以很多珍貴的錯誤都沒辦法留存。

回到正題,這次主要出現錯誤的原因有三個(分別各解了一次),在這裡先說結論:
在編譯階段出問題的時候,先檢查 /usr/lib 裡面是否缺乏所需函式庫,沒有的話先安裝,如果有的話,再檢查是否為同步連結的問題(連結到不存在的路徑)。

本次實作環境

由於不同版本與不同指令碼安裝的主機環境不盡相同,產生的結果也會不同,
因此在這裡先說明主機環境,方便有興趣的人進行再現 (represent)。

  • 作業系統:Ubuntu 18.04 (自 Ubuntu 16 LTS 升級)
  • 伺服器建置:LNMP 指令碼 (https://lnmp.org)
  • 透過 ./upgrade.sh 指令進行 PHP 版本升級

無法執行 cURL

checking for libcurl.pc... using default path
checking for cURL 7.15.5 or greater... configure: error: cURL version 7.15.5 or later is required to compile php with cURL support
make: *** No targets specified and no makefile found.  Stop.
make: *** No targets specified and no makefile found.  Stop.
make: *** No rule to make target 'install'.  Stop.
Copy new php configure file...

這個原因比較有可能是當初升級 Ubuntu 的時候,
便宜行事使用舊版的 cURL(當時好像有部分程式與 cURL 4 不相容,所以硬是手動安裝了 cURL 3)所導致的結果,不難解決,只要安裝該套件就好。

$ sudo apt-get install libcurl4-gnutls-dev

Error: png.h not found

If configure fails try --with-webp-dir=<DIR>
checking for jpeg_read_header in -ljpeg... yes
configure: error: png.h not found.

Google 了之後發現,有可能是 libpng 這個函示庫沒有正確安裝。因此手動安裝了一下:

$ sudo apt-get install libpng-dev

/usr/bin/ld: cannot find -lpng12

/usr/bin/ld: cannot find -lpng12
collect2: error: ld returned 1 exit status
Makefile:293: recipe for target 'sapi/cli/php' failed
make: *** [sapi/cli/php] Error 1

這個問題稍微花了一點時間。
錯誤的原因是無法找到名為 libpng12 的函式庫, ( -lxxx 代表 libxxx 函式庫)
但照理說前一個步驟應該就將函式庫安裝好了才對。
於是前往 /usr/lib 看是哪裡發生問題,發現原本的 libpng12.so 連結的位置並不存在,
因此重新做了同步連結:

$ sudo ln /usr/lib/libpng12.so.0 libpng12.so

完成了上述的修改後,再重新升級 PHP,這次就能完整編譯了。

Ubuntu 18 與 Ubuntu 16 的差異

處理完問題,並再仔細回顧了幾則 Stack Overflow 之後,根本的問題也有可能是 Ubuntu 18 的函式庫路徑和原本不同。

以 libpng 而言,/usr/include/png.h 有可能被移至 /usr/include/libpng/png.h,導致無法使用該指令。解決方式之一,是用 symlink 的方式,將該路徑與正確路徑做同步連結:

$ ln -s /usr/include/libpng/png.h /usr/include/png.h

參考資料

Eric Chuang
Eric Chuang

正職是廣告行銷人員,因為 Google Tag Manager 的關係開始踏入網站製作的領域,進一步把 WordPress 當成 PHP + HTML + CSS + JavaScript 的學習教材。此外,因為工作的關係,曾經用 Automattic 的 Underscores (_s) 替客戶與公司官網進行全客製化佈景主題開發。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料