macOS [Big Sur] 安裝新版 Apache 2.4+PHP 8.2+MySQL教學

自從 2020 年 Apple silicon (M1) 問世後,原本採用 intel 的 maxOS 一定會面臨到被加速淘汰的問題,當遇到Apple不再支援更新後,很多東西可能要手動自行安裝了,如果你沒有使用 VM 或者 docker,只想直接安裝在本機上,也不見得是件輕鬆事了

現狀是 MacBook Pro (MBP) 2014 已經因為 intel 晶片的關係無法再更新了,所以版本卡在Big Sur,原生版本也卡在Apache 2.4.59 以及 PHP 7.3,其實我主要是為了將Php 升到 8 以上版本,不過基於安全Apache就一併升至最新版吧。

安裝Homebrew

Homebrew 為macOS 系統的套件管理工具,接下來的安裝都會透過它來操作,若你還沒安裝過可以打開終端機執行以下指令

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

或者到其網站 https://brew.sh/ 首頁找到Install Homebrew所附的語法

如果你曾經安裝過,在往下進行前建議先利用下面指令更新一下

brew update

安裝PHP

當安裝好 Homebrew 後,我們可以利用 brew 指令進行安裝,安裝前我們先看看有哪些php 版本可以安裝

brew search php
==> Formulae
brew-php-switcher   php@8.0             phpmd               pup
php                 php@8.1             phpmyadmin          pop
php-code-sniffer    php@8.2             phpstan             pcp
php-cs-fixer        phpbrew             phpunit

==> Casks
eclipse-php         phpstorm            phpwebstudy         pop

確定有 php@8.2 版本後我們透過下面指令安裝

brew install php@8.2

這將會是一個很漫長的過程,而且還可能中途失敗,假設不幸中圖安裝某個元件失敗時,沒關係,你可以透過 brew install <該套件名稱>,先進行安裝,沒意外大多可以安裝成功

原因有二:

電腦隨著使用需求,用不同方式安裝各種東西後,很容易讓整個程序相依性混亂,若沒有好好移除,會導致無法正常更新,我正是因為多年使用下來還歷經app位元轉換,有這些問題,所以我對整台電腦做了重置,不然光是要安裝 php 就遇到一堆套件出現問題無法正常安裝,逐一解決實在不切實際,甚至還未必能解。

如果你像我一樣都重置了還是發生,那可能是另一種原因—— homebrew 的緩存出了問題,因此上述的單獨安裝或是清除緩存可以解決

brew cleanup -s
brew doctor

當你安裝好導致原本安裝php失敗的套件後你可以透過下面指令繼續安裝php

brew reinstall php@8.2

當你安裝完成後你可以利用指令確認 php 版本

php -v

然後你就會發現你的版本是 php 7.3 而不是 8.2,這是因為目前mac執行 php 的位置設置在原生安裝的 php 上(這是沒法移除的),因此我們必須要告訴作業系統我們要改變php路徑,那我們剛剛透過 homebrew 安裝的 php 會在哪裡呢?

假設你用的是 silicon 版本的macOS 那麼你的 homebrew 預設安裝路徑會位於 /opt/homebrew

如果你跟我一樣是 intel 版本的macOS 那麼你的 homebrew 預設安裝路徑會位於 /usr/local

你也可以透過 brew --prefix 找到 homebew 預設的安裝位置

因此你就能在 /opt/homebrew/opt/php@8.2 或者 /usr/local/opt/php@8.2 找到剛剛安裝的php

接下來透過下面指令我們將 php 位置告知作業系統

silicon版本

echo 'export PATH="/opt/homebrew/opt/php@8.2/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="/opt/homebrew/opt/php@8.2/sbin:$PATH"' >> ~/.zshrc

intel版本

echo 'export PATH="/usr/local/opt/php@8.2/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="/usr/local/opt/php@8.2/sbin:$PATH"' >> ~/.zshrc

關掉終端機重新打開,或是重新加載 source ~/.zshrc 這次再下 php -v 就能看到 版本變成8.2了

安裝MySQL

這也是一個漫長的過程,安裝指令如下

brew install mysql

如果你有指定使用的版本可以利用 mysql@版號,若無指定則會選最新的,同樣你可以先用 brew search mysql 先看看有哪些可以選

安裝好以後可以嘗試登入

mysql -u root -p

安裝Apache

我們同樣透過 homebrew 來安裝 apache

brew install httpd

當安裝好後得先把原生的apache 關掉

sudo launchctl bootout system /System/Library/LaunchDaemons/org.apache.httpd.plist

啟用服務

在你安裝好後檢視服務狀態 brew services list 你會發現status 一欄都是顯示 none 表示未啟動,可是明明下 php -vhttpd -v 都有反應啊!?這是因為你下的指令屬於 CLI 如果你這時候打開網頁是沒有服務的因此我們要將其啟動

brew services start php@8.2
brew services start httpd

啟動後再下一次 brew services list 就會看到 status 變成了 started

配置Apache使用PHP

開啟 /etc/apache2/httpd.conf

# 將 php 模組路徑加入
LoadModule php_module /usr/local/opt/php@8.2/lib/httpd/modules/libphp.so

# 指定 Apache 處理 .php 檔案的方式
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

網站根目錄

預設是在 /Library/WebServer/Documents 目錄底下,我們在此目錄下建立一個檔案 index.php 並寫入內容

<?php
phpinfo();
?>

重啟一下 Apache

sudo apachectl restart

確認結果

透過瀏覽器開啟網頁 http://localhost/index.php 應該會看到 php 8.2 的資訊內容,至此完成兩者整合。

安全性加強

Apache 與 Php 預設的設定,並不安全,因此需要進行一些優化才能避免網站暴露太多服務端的資訊,讓有心人有機會針對漏洞攻擊,相關內容之後會額外再說明。