2017年2月10日 星期五

如何解決PHP Startup: Unable to load dynamic library

環境參數:

  • PHP:PHP 5.6.18

安裝了nextcloud之後,出現了錯誤訊息,簡單的寫支test.php來測試就看到錯誤:

<?php
# filename: test.php
echo "test";
?>

在命令列執行test.php

$ php test.php
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php/20131226/wddx.so' - /usr/local/lib/php/20131226/wddx.so: Undefined symbol "ps_globals" in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php/20131226/xsl.so' - /usr/local/lib/php/20131226/xsl.so: Undefined symbol "dom_node_class_entry" in Unknown on line 0
test

雖然這些錯誤不致影嚮其它的程式運行,但總是看了就不舒服,況且若不解決它,日後必有機會帶來困擾。
先查一下PHP extension的目錄如下:

$ ls /usr/local/etc/php
ext-20-exif.ini
ext-20-gd.ini
ext-20-gettext.ini
ext-20-intl.ini
ext-20-json.ini
ext-20-ldap.ini
ext-20-openssl.ini
ext-20-smbclient.ini
ext-30-wddx.ini
ext-30-xsl.ini
extensions.ini

php按照字母排列順序來載入延伸功能(extension),有些延伸套件是必需依靠在其它的套件先載入後才能成功載入,例如本例中的:wdxxxls這二個,觀察一下它們是在預設的extension.ini之前就載入,所以出現錯誤訊息,解決方式有二種:

更改延伸套件名稱

直接將有錯誤訊息的延伸套件檔名改變,使其在extension.ini之後再載入,

$ mv ext-30-wddx.ini  zext-30-wddx.ini
$ mv ext-30-xsl.ini  zext-30-xsl.ini 

排列順序就變成:

$ ls /usr/local/etc/php
ext-20-exif.ini
ext-20-gd.ini
ext-20-gettext.ini
ext-20-intl.ini
ext-20-json.ini
ext-20-ldap.ini
ext-20-openssl.ini
ext-20-smbclient.ini
extensions.ini
zext-30-wddx.ini
zext-30-xsl.ini

再次執行測試,

$ php test.php
test

正常沒有錯誤發生了。

手動變更extension.ini

/usr/local/etc/php的目錄下,將其它的延伸套件內容直接加入extension.ini檔案內,像這樣:

extension=pdo.so
extension=session.so
extension=xml.so
extension=tokenizer.so
extension=xmlreader.so
extension=pdo_sqlite.so
extension=iconv.so
extension=filter.so
zend_extension=/usr/local/lib/php/20131226/opcache.so
extension=posix.so
extension=simplexml.so
extension=phar.so
extension=zip.so
extension=zlib.so
extension=fileinfo.so
extension=apcu.so
extension=ftp.so
extension=mbstring.so
extension=mysqli.so
extension=mysql.so
extension=mcrypt.so
extension=wdxx.so #加入後,刪除原有的ext-30-wddx.ini
extension=xsl.so  #加入後,刪除原有的ext-30-xsl.ini
本文大網

活本來沒有什麼好與壞,只要你願意怎樣填滿它,它就隨同而行。


EmoticonEmoticon