在 Windows 上有兩種加載 PHP 擴(kuò)展的方式:把擴(kuò)展編譯進(jìn) PHP,或者加載 DLL。加載預(yù)編譯的擴(kuò)展是更簡(jiǎn)單更被推薦的方式。
要加載某擴(kuò)展,需要在系統(tǒng)中有其相對(duì)應(yīng)的 “.dll” 文件。所有擴(kuò)展都會(huì)由 PHP 小組定期自動(dòng)編譯(如何下載見(jiàn)下節(jié))。
要將一擴(kuò)展編譯入 PHP,請(qǐng)參考 從源程序編譯 一章。
要編譯一個(gè)獨(dú)立的擴(kuò)展(即 DLL 文件),請(qǐng)參考 從源程序編譯 一章。如果在 PHP 發(fā)行包和 PCEL 中都沒(méi)有某 DLL 文件,那可能需要自己編譯之后才能使用該擴(kuò)展。
PHP 擴(kuò)展庫(kù)通常稱為“php_*.dll”(其中星號(hào)代表具體某擴(kuò)展的名字),位于“PHP\ext”目錄下。
PHP 發(fā)行包中包括了大多數(shù)開(kāi)發(fā)者最常用到的擴(kuò)展庫(kù)。這些被稱為“核心”擴(kuò)展庫(kù)。
不過(guò)呢,如果用戶所需要的功能并沒(méi)有被任何核心擴(kuò)展提供,那還是有可能在 ? PECL 中找到。PHP Extension Community Library(PECL,PHP 擴(kuò)展社區(qū)庫(kù))是個(gè) PHP 擴(kuò)展的儲(chǔ)存室,提供了對(duì)于所有已知擴(kuò)展的下載及開(kāi)發(fā)途徑的指南。
如果用戶開(kāi)發(fā)了一個(gè)自己使用的擴(kuò)展,可以考慮將其發(fā)布到 PECL 中以便于其他有相同需求的用戶使用。一個(gè)很好的副作用是可以得到其他用戶的反饋,感謝,錯(cuò)誤報(bào)告甚至修正/更新。不過(guò)在向 PECL 發(fā)布擴(kuò)展之前,請(qǐng)先閱讀 ? PECL 提交指南。
用戶常常會(huì)發(fā)現(xiàn)每個(gè) DLL 都有好幾個(gè)版本:
其它
請(qǐng)記住用戶的擴(kuò)展設(shè)定應(yīng)該與所使用的 PHP 可執(zhí)行文件的設(shè)定都保持一致。以下腳本可以顯示所有 PHP 設(shè)定:
示例 #1 phpinfo() call
<?php
phpinfo();
?>
或者在命令行運(yùn)行:
drive:\\path\to\php\executable\php.exe -i
最常見(jiàn)的方式是在 php.ini 配置文件里包含一個(gè) PHP 擴(kuò)展。請(qǐng)注意很多擴(kuò)展已經(jīng)在 php.ini 里了,僅需要移除分號(hào)來(lái)激活它們。
需要注意,從 PHP 7.2.0 開(kāi)始,可以直接用擴(kuò)展的名稱,來(lái)替代擴(kuò)展的文件名。這樣配置文件就跟操作系統(tǒng)解耦了,也更容易理解。我們推薦采用此方式加載擴(kuò)展。為了與之前的版本保持兼容,直接寫(xiě)擴(kuò)展名的方式會(huì)仍然支持。
;extension=php_extname.dll
extension=php_extname.dll
; PHP version 7.2 開(kāi)始的推薦寫(xiě)法: extension=extname zend_extension=another_extension
不過(guò)呢,有些 web 服務(wù)器會(huì)搞混,因?yàn)槠洳⒉灰欢ㄊ褂煤?PHP 可執(zhí)行文件處于同一目錄下的 php.ini 文件。要搞清楚具體使用了哪一個(gè) php.ini 文件,在 phpinfo() 的輸出中查看:
Configuration File (php.ini) Path C:\WINDOWS
Loaded Configuration File C:\Program Files\PHP\5.2\php.ini
激活一個(gè)擴(kuò)展后,保存 php.ini 文件并重啟動(dòng) web 服務(wù)器,然后用 phpinfo() 再次查看確定。新的擴(kuò)展應(yīng)該有其自己的一節(jié)。
如果某擴(kuò)展并未在 phpinfo() 中顯示,應(yīng)該查看日志以確定問(wèn)題出在哪里。
如果是在命令行使用 PHP(CLI),擴(kuò)展加載出錯(cuò)信息會(huì)直接在屏幕顯示。
如果在 web 服務(wù)器中使用 PHP,則日志文件的位置與格式各不相同。請(qǐng)閱讀所使用的 web 服務(wù)器之文檔以確定日志文件的位置,這與 PHP 本身并無(wú)關(guān)系。
最常見(jiàn)的問(wèn)題是 DLL 和 DLL 依賴的文件的位置,php.ini 中“extension_dir”設(shè)定的值,以及編譯時(shí)的設(shè)置不匹配。
如果問(wèn)題出在編譯時(shí)設(shè)置不匹配,那可能所下載的 DLL 文件不對(duì)??梢試L試重新下載一個(gè)設(shè)置匹配的擴(kuò)展。此外,phpinfo() 可以起到很大幫助。