PHP 錯誤:Unable to load dynamic library


Unable to load dynamic library

錯誤訊息

Failed loading /usr/local/php5/lib/php/extensions/no-debug-non-zts-20160303/opcache.so:  dlopen(/usr/local/php5/lib/php/extensions/no-debug-non-zts-20160303/opcache.so, 9): Symbol not found: _pcre_globals
  Referenced from: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20160303/opcache.so
  Expected in: flat namespace
 in /usr/local/php5/lib/php/extensions/no-debug-non-zts-20160303/opcache.so
... 省略

遭遇過程:

最近將 PHP 從 PHP5.6 更新至 PHP7.1。使用 PHPStorm 要進行單元測試時,報錯了:

從錯誤訊息可看見有幾個 PHP 插件沒辦法被載入,導致我的 PHPUnit 沒辦法順利執行,並且得到一個提示訊息為:
Expected in: flat namespace

發生原因:

一番查證後,原來 Expected in: flat namespace 是 C++ 層級的錯誤例外訊息。
這段訊息會在「程式環境沒有辦法編譯插件」的時候跳出!(程式環境指的是 PHP5、PHP7、Python 等正在運行的程式。)
PHP 沒辦法順利編譯插件?但這些插件明明在啟動 Apache 時都被順利載入了,到底發生什麼事呢?
在一般情況下 PHP7.1 確實可以正常編譯這些套件,但在 PHP-CLI 模式下進行 PHPUnit 時卻又編譯失敗?這些跡象已經指出,一定是 PHP-CLI 的編譯器指錯版本了
打開 PHPStorm > Preferences > Language & Framework > PHP,檢查 PHP-CLI 版本是否有問題:

PHP7.1 與 PHP5.6 並不相容,所以兩個版本之間的插件也沒辦法並存。
上圖的設定,會在 PHP-CLI 模式時,使用 PHP5.6 的編譯器來編譯 PHP7.1 的插件,當然會發生錯誤囉!

解決方案:變更 PHP-CLI 的編譯器

既然已經知道是 PHP 版本不相容的問題,那麼只需要替換 PHP-CLI 模式的編譯器就可以解決問題了!

步驟1. 新增 PHP-CLI 的編譯器(沒有 PHP7 編譯器才需要)



步驟2. 替換 PHP-CLI 編譯器

解決問題
當 PHP-CLI 的編譯器被替換成 PHP7.1 版本後,插件也都正常被載入了,PHPUnit 也能正常運行了!

留言

張貼留言

這個網誌中的熱門文章

Git Commit Message 這樣寫會更好,替專案引入規範與範例

PHP OO 物件導向基礎教學

Gitlab 合併請求 Merge Request 是什麼?