2019年12月17日 星期二

使用 Homebrew 安裝 PHP


移除使用 Homebrew/PHP Tap 安裝的舊版本 PHP


自 2018 年 3 月 31 日起,原屬於 Main Taps 的 Homebrew/PHP 版本庫被封存;所有的 Formulae 會被遷移至主要版本庫 Homebrew/core 中或是被刪除。因為 Homebrew 不再支援舊的 Homebrew/PHP Tap,如果之前有使用 Homebrew/PHP Tap 安裝過 PHP,需要先將其完整的移除。如果是新安裝或是使用  Homebrew/core 安裝 PHP,可以跳過本小節。

首先,需要更新所有的 Formulae、升級已安裝的軟體、以及移除所有舊的 Formulae:
brew update
brew upgrade
brew cleanup


(Homebrew 的簡介請參考。)


檢查目前安裝的套件中有那些跟 PHP 有關聯:
brew list | grep php


找到已安裝的 PHP 以及相關的套件後,使用 brew uninstall 將它們解除安裝;例如,之前安裝了 PHP 5.6 以及延伸套件 xdebug:
brew uninstall --force php56 php56-xdebug
brew cleanup


可以再次檢查是否完整的移除相關的 PHP 套件:
brew list | grep php


最後,清除 PHP 設定檔:
rm -Rf /usr/local/etc/php/*



安裝 PHP


PHP 有多個發行分支 (Release Branch),分屬於不同的主要版本 (Major Version)。每一個發行分支都會有兩年的完整支援,再加上一年的關鍵安全問題支援。PHP 5 的最後一個發行分支 PHP 5.6 在 2018 年 12 月 31 日停止了所有的支援,使得目前仍有支援的主要版本只剩下了 PHP 7。下表列出了 PHP 目前支援的發行分支(參考自):


分支 初始發行日 完整支援到 安全問題支援到
7.2 2017 年 11 月 30 日 2019 年 11 月 30 日 2020 年 11 月 30 日
7.3 2018 年 12 月 6 日 2020  年 12 月 6 日 2021 年 12 月 6 日
7.4 2019 年 11 月 28 日 2021 年 11 月 28 日 2022 年 11 月 28 日


因為 PHP 7.2 的完整支援已經在 2019 年 11 月 30 日到期,所以目前 Homebrew/core 只提供 PHP 7.3 以及 PHP 7.4 的安裝。下列令可以安裝 Homebrew/core 上的 PHP 7.4:
brew update
brew upgrade
brew install php@7.41


註1. Homebrew 現在改用 "php@發行分支" (例如 PHP@7.3) 取代原來的 "PHP發行分支無句點" (例如 PHP74);如果不指定要安裝的發行分支,預設會安裝最新的發行分支。


使用 PHP 的 Apache 2 Handler 模組


在 "PHP 與伺服器之間的應用程式介面" 一文中,介紹了 PHP 共有 4 種不同 SAPIs。針對不同的開發環境,可以選擇適合的SAPI。如果是做為個人網頁開發,建議可以選擇設定上較為簡便的 Apache 2 Handler 模組


1. 設定 httpd.conf


根據 PHP 手冊,使用 PHP 的 Apache 2 Handler 模組,不建議 httpd 使用執行緒類型的 MPM (請參考);而且使用 Homebrew/core 安裝的 PHP 也不再支援執行緒安全 (Thread Safty) 選項2。因此,httpd 的 MPM 模組3使用預設的 Prefork 模組即可。


確認 httpd.conf 載入的是 Prefork 模組:
LoadModule mpm_prefork_module lib/httpd/modules/mod_mpm_prefork.so


要讓 httpd 能夠處理 php 文件,需要:
1) 在啟動時就戴入 Apache 2 Handler (libphp) 模組,
2) 讓 httpd 知道副檔名為 php 的檔案要交由 php 模組處理,
3) 執行完 php 後生成的文件的內容類型 (Content Type) 是 text/html。


在 IfModule mpm_prefork_module 區塊加上下列的設定4
<IfModule mpm_prefork_module>
    LoadModule php7_module /usr/local/opt/php/lib/httpd/modules/libphp7.so
    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
    </FilesMatch>
    AddType text/html .php
</IfModule>



最後,確認 httpd 在尋找目錄首頁的順序與類別:
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>


重新啟動 HTTP Server:
sudo apachectl -k stop
sudo apachectl start



2. 測試 PHP 網頁是否正常

在文件根目錄檔案夾新增 index.php,內容如下:
<?php

phpinfo();


在瀏覽器的網址列輸入:
http://localhost/info.php


應該可以看到系統和 PHP 的相關資訊。

(如果網站要提供服務給其他人,在測試完後記得要將 index.php 刪除。)


註2. 之前的 Homebrew/php tap 可以使用 --with-thread-safety 或是 --enable-maintainer-zts 選項,讓 Apache 2 Handler 模組可以在多執行緒環境下執行。

註3. 在 "Apache HTTP Server 的多程序處理模組 (Multi-Processing Module, MPM)" 一文中介紹了 httpd 在 unix 系統的 3 種 MPM。在不同的 MPM 模組下,要使用不同的 SAPI。

註4. 考量安全因素,建議使用 SetHandler 取代 AddHandler;因為使用 AddHandler 時只要檔案名稱中有 .php (例如 test.php.png),就會被送到 PHP 解析器執行。這讓惡意的使用者可以利用這個方式上傳惡意的程式碼,並且加以執行。

沒有留言: