swoole擴充功能安裝失敗怎麼辦? swoole安裝報錯詳解
推薦學習: swoole教學
今天透過pecl安裝swoole
pecl install swoole
步驟很簡單,但最後安裝成功後來發現phpinfo()中未顯示swoole擴展,執行:
php -m | grep swoole
發現報錯如下:
##woole .so報出來的,說明在載入swoole.so的時候報的找不到mysqlnd_find_charset_nr ,這是一個以mysqlnd 打頭的一個關鍵字,而mysqlnd 又是PHP 的一個擴展,透過閱讀swoole/swoole.mysql.c的原始碼我們發現有以下一段:PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/ php/modules/swoole.so' - /usr/lib64/php/modules/swoole.so: undefined symbol: mysqlnd_find_charset_nr in Unknown on line 0
const MYSQLND_CHARSET* cset = mysqlnd_find_charset_nr(client->connector.character_set); if (cset == NULL) { swoole_php_fatal_error(E_ERROR, "unknown mysql charset[%s].", client->connector.character_set); RETURN_FALSE; }從上面的原始碼我們可以看出,原來swoole 是需要依賴msyqlnd 這個擴充的,我們發現phpinfo() 裡面msyqlnd 擴充功能是存在的為什麼還會報這個錯呢。 最後發現PHP預設載入的擴充都在/usr/lib64/php/modules/ 這個目錄裡在,這裡面的.so 檔案是預設載入的,關於這些擴充的配置不是在/etc/ php.ini 中,而是在/etc/php.d/ 這個目錄中,這個目錄當中的所有的.ini 檔案是在/etc/php.ini 載入完成後再載入的,而我們的extension=swoole. so 的配置是寫在/etc/php.ini 的檔案結尾,所以是先載入了swoole.so 然後再載入mysqlnd.so,這就導致了swoole 找不到mysqlnd_find_charset_nr 。
解決方法:
1、將/etc/php.d/ 目錄中的mysqlnd.ini檔案刪除3、重新啟動php-fpm#2、在/etc/php.ini 的extension=swoole.so 上面一行新增extension=mysqlnd.so
這樣可以解決問題了,同樣也可能會遇到以下報錯:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/swoole.so' - /usr/lib64/php/ modules/swoole.so: undefined symbol: php_sockets_le_socket in Unknown on line 0
##解決的方法也是類似的:###1、將/etc/php .d/ 目錄中的sockets.ini檔案刪除######2、在/etc/php.ini 的extension=swoole.so 上面一行新增extension=sockets.so######3、重新啟動php-fpm ###以上是swoole擴充安裝失敗怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!