為 Azure App Service 設定 PHP 應用程式

顯示 PHP 版本

本指南說明如何在 Azure App Service 中設定 PHP Web 應用程式、行動後端和 API 應用程式。

本指南為將應用程式部署至 App Service 的 PHP 開發人員提供了重要概念和指示。 如果您從未使用過 Azure App Service,請先遵循 PHP 快速入門搭配使用 PHP 和 MySQL 教學課程

若要顯示目前的 PHP 版本,請在 Cloud Shell 中執行下列命令:

az webapp config show --resource-group <resource-group-name> --name <app-name> --query phpVersion

注意

若要對開發位置定址,請納入參數 --slot,後面再加上位置的名稱。

若要顯示所有支援的 PHP 版本,請在 Cloud Shell 中執行下列命令:

az webapp list-runtimes --os windows | grep PHP

本指南說明如何在 Azure App Service 中設定 PHP Web 應用程式、行動後端和 API 應用程式。

本指南為將應用程式部署至 App Service 的 PHP 開發人員提供了重要概念和指示。 如果您從未使用過 Azure App Service,請先遵循 PHP 快速入門搭配使用 PHP 和 MySQL 教學課程

若要顯示目前的 PHP 版本,請在 Cloud Shell 中執行下列命令:

az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion

注意

若要對開發位置定址,請納入參數 --slot,後面再加上位置的名稱。

若要顯示所有支援的 PHP 版本,請在 Cloud Shell 中執行下列命令:

az webapp list-runtimes --os linux | grep PHP

設定 PHP 版本

Cloud Shell 中執行下列命令,以將 PHP 版本設定為 8.1:

az webapp config set --resource-group <resource-group-name> --name <app-name> --php-version 8.1

Cloud Shell 中執行下列命令,以將 PHP 版本設定為 8.1:

az webapp config set --resource-group <resource-group-name> --name <app-name> --linux-fx-version "PHP|8.1"

執行 Composer

如果您想要讓 App Service 在部署階段執行 Composer,最簡單的方式就是將 Composer 包含在存放庫中。

在本機終端機視窗中,將目錄切換至存放庫根目錄,並依照下載 Composer 中的指示,將 composer.phar 下載至根目錄。

執行下列命令 (您需要安裝 npm):

npm install kuduscript -g
kuduscript --node --scriptType bash --suppressPrompt

您的存放庫根目錄現在有兩個額外的檔案:.deploymentdeploy.sh

開啟 deploy.sh 並尋找 Deployment 區段,如下所示:

##################################################################################################################################
# Deployment
# ----------

Deployment 區段的結尾新增您執行必要工具所需的程式碼區段:

# 4. Use composer
echo "$DEPLOYMENT_TARGET"
if [ -e "$DEPLOYMENT_TARGET/composer.json" ]; then
  echo "Found composer.json"
  pushd "$DEPLOYMENT_TARGET"
  php composer.phar install $COMPOSER_ARGS
  exitWithMessageOnError "Composer install failed"
  popd
fi

認可您的所有變更,並使用 Git (或在已啟用組建自動化的情況下使用 Zip 部署) 來部署程式碼。 Composer 現在應該會在部署自動化的過程中執行。

執行 Grunt/Bower/Gulp

如果您想要讓 App Service 在部署階段執行熱門的自動化工具 (例如 Grunt、Bower 或 Gulp),您必須提供自訂部署指令碼。 當您使用 Git (或在已啟用組建自動化的情況下使用 Zip 部署) 進行部署時,App Service 會執行此指令碼。

若要讓存放庫執行這些工具,您必須將那些工具新增至 package.json 中的相依性。例如:

"dependencies": {
  "bower": "^1.7.9",
  "grunt": "^1.0.1",
  "gulp": "^3.9.1",
  ...
}

在本機終端機視窗中,將目錄切換至存放庫根目錄,並執行下列命令 (您需要安裝 npm):

npm install kuduscript -g
kuduscript --node --scriptType bash --suppressPrompt

您的存放庫根目錄現在有兩個額外的檔案:.deploymentdeploy.sh

開啟 deploy.sh 並找出 Deployment 區段,如下所示:

##################################################################################################################################
# Deployment
# ----------

此區段最後會執行 npm install --production。 在 Deployment 區段的「結尾」新增您執行必要工具所需的程式碼區段:

請參閱 MEAN.js 樣本中的範例,其中,deployment 指令碼也執行自訂 npm install 命令。

Bower

此程式碼片段執行 bower install

if [ -e "$DEPLOYMENT_TARGET/bower.json" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/bower install
  exitWithMessageOnError "bower failed"
  cd - > /dev/null
fi

Gulp

此程式碼片段執行 gulp imagemin

if [ -e "$DEPLOYMENT_TARGET/gulpfile.js" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/gulp imagemin
  exitWithMessageOnError "gulp failed"
  cd - > /dev/null
fi

Grunt

此程式碼片段執行 grunt

if [ -e "$DEPLOYMENT_TARGET/Gruntfile.js" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/grunt
  exitWithMessageOnError "Grunt failed"
  cd - > /dev/null
fi

自訂組建自動化

如果您使用 Git (或在啟用組建自動化的情況下使用 zip 套件) 來部署應用程式,App Service 組建自動化將會依下列順序逐步執行:

  1. 執行自訂指令碼 (如果 PRE_BUILD_SCRIPT_PATH 已指定)。
  2. 執行 php composer.phar install
  3. 執行自訂指令碼 (如果 POST_BUILD_SCRIPT_PATH 已指定)。

PRE_BUILD_COMMANDPOST_BUILD_COMMAND 是預設為空值的環境變數。 若要執行建置前命令,請定義 PRE_BUILD_COMMAND。 若要執行建置後命令,請定義 POST_BUILD_COMMAND

下列範例會將兩個變數指定給一系列的命令 (以逗號分隔)。

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PRE_BUILD_COMMAND="echo foo, scripts/prebuild.sh"
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings POST_BUILD_COMMAND="echo foo, scripts/postbuild.sh"

若要了解其他可自訂組建自動化的環境變數,請參閱 Oryx 設定

若要深入了解 App Service 如何在 Linux 中執行和建置 PHP 應用程式,請參閱 Oryx 文件:如何偵測和建置 PHP 應用程式

自訂啟動

如有需要,您可以在容器啟動時執行自訂命令,方法是在 Cloud Shell 中執行下列命令:

az webapp config set --resource-group <resource-group-name> --name <app-name> --startup-file "<custom-command>"

存取環境變數

在 App Service 中,您可以於應用程式的程式碼外部設定應用程式設定。 然後,您可以使用標準的 getenv() 模式來存取這些設定。 例如,若要存取稱為 DB_HOST 的應用程式設定,請使用下列程式碼:

getenv("DB_HOST")

變更網站根目錄

您選擇的 web 架構可能會使用子目錄作為網站根目錄。 例如,Laravel 使用 public/ 子目錄作為網站根目錄。

若要自訂網站根目錄,請使用 az resource update 命令設定應用程式的虛擬應用程式路徑。 下列範例會將網站根目錄設定為存放庫中的 public/ 子目錄。

az resource update --name web --resource-group <group-name> --namespace Microsoft.Web --resource-type config --parent sites/<app-name> --set properties.virtualApplications[0].physicalPath="site\wwwroot\public" --api-version 2015-06-01

依預設,Azure App Service 會將根虛擬應用程式路徑 (/) 指向已部署應用程式檔案的根目錄 (sites\wwwroot)。

您選擇的 web 架構可能會使用子目錄作為網站根目錄。 例如,Laravel 使用 public/ 子目錄作為網站根目錄。

App Service 的預設 PHP 映像會使用 Nginx,而且您可以藉由使用 root 指示詞設定 Nginx 伺服器,來變更網站根目錄。 這個範例組態檔包含下列變更 root 指示詞的程式碼片段:

server {
    #proxy_cache cache;
    #proxy_cache_valid 200 1s;
    listen 8080;
    listen [::]:8080;
    root /home/site/wwwroot/public; # Changed for Laravel

    location / {            
        index  index.php index.html index.htm hostingstart.html;
        try_files $uri $uri/ /index.php?$args; # Changed for Laravel
    }
    ...

預設容器會使用位於 /etc/nginx/sites-available/default 的組態檔。 請記住,應用程式重新啟動時,您對此檔案所做的任何編輯會遭到清除。 若要在應用程式重新啟動時進行有效的變更,請如下列範例所示,新增自訂啟動命令

cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload

此命令會將預設 Nginx 組態檔取代為存放庫根目錄中名為預設的檔案,然後重新啟動 Nginx。

偵測 HTTPS 工作階段

在 App Service 中,TLS/SSL 終止發生在網路負載平衡器上,因此,所有 HTTPS 要求都以未加密的 HTTP 要求的形式到達應用程式。 如果您的應用程式邏輯需要檢查使用者要求是否有加密,請檢查 X-Forwarded-Proto 標頭。

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
// Do something when HTTPS is used
}

熱門的 Web 架構可讓您在標準的應用程式模式中存取 X-Forwarded-* 資訊。 在 CodeIgniter 中,is_https() 預設會檢查 X_FORWARDED_PROTO 的值。

自訂 php .ini 設定

如果您需要對 PHP 安裝進行變更,您可以依照下列步驟來變更 php.ini 指示詞

注意

查看 PHP 版本和目前 php.ini 設定的最佳方法是在應用程式中呼叫 phpinfo ()

自訂非 PHP_INI_SYSTEM 指示詞

若要自訂 PHP_INI_USER、PHP_INI_PERDIR 和 PHP_INI_ALL 指示詞 (請參閱 php.ini指示詞),請將 .user.ini 檔案新增至應用程式的根目錄。

使用在 php.ini 檔案中使用的相同語法,將組態設定新增至 .user.ini 檔案。 例如,如果您要開啟 display_errors 設定,並將 upload_max_filesize 設定設為 10M,則 .user.ini 檔案將包含下列文字:

 ; Example Settings
 display_errors=On
 upload_max_filesize=10M

 ; Write errors to d:\home\LogFiles\php_errors.log
 ; log_errors=On

經由變更重新部署應用程式,並重新啟動應用程式。

除了使用 .user.ini 之外,您還可以在應用程式中使用 ini_set() 來自訂這些非 PHP_INI_SYSTEM 指示詞。

若要自訂 linux Web 應用程式的 PHP_INI_USER、PHP_INI_PERDIR 和 PHP_INI_ALL 指示詞,例如 upload_max_filesize 和 expose_php,請使用自訂的 “ini” 檔案。 您可以在 SSH 工作階段中加以建立。

  1. 移至 KUDU 網站 https://<sitename>.scm.azurewebsites.net。
  2. 從頂端功能表中選取 [Bash] 或 [SSH]。
  3. 在 Bash/SSH 中,移至 "/home/site/wwwroot" 目錄。
  4. 建立名為 "ini" 的目錄 (例如 mkdir ini)。
  5. 將目前的工作目錄變更為您剛建立的 "ini" 資料夾。

您必須建立 "ini" 檔案,才能將設定新增至其中。 在此範例中,我們使用 "extensions.ini"。 沒有檔案編輯器,例如 Vi、Vim 或 Nano,因此您將使用 echo 將設定新增至該檔案。 將 "upload_max_filesize" 從 2M 變更為 50M。 使用下列命令來新增設定,並建立 "extensions.ini" 檔案 (如果尚不存在)。

/home/site/wwwroot/ini>echo "upload_max_filesize=50M" >> extensions.ini
/home/site/wwwroot/ini>cat extensions.ini

upload_max_filesize=50M

/home/site/wwwroot/ini>

然後,移至 Azure 入口網站並新增應用程式設定,以掃描您剛建立以套用 upload_max_filesize 變更的 “ini” 目錄。

  1. 前往 Azure 入口網站,然後選取 App Service Linux PHP 應用程式。
  2. 選取應用程式的 [應用程式設定]。
  3. 在 [應用程式設定] 區段下,選取 [+ 新增設定]
  4. 針對應用程式設定名稱,輸入 “PHP_INI_SCAN_DIR”,針對值,輸入 “/home/site/wwwroot/ini”。
  5. 選取 [儲存] 按鈕。

注意

如果您重新編譯 PHP 延伸模組,例如 GD,請遵循在 Azure App Service 重新編譯 PHP 延伸模組 - 新增 PHP 延伸模組的步驟

自訂 PHP_INI_SYSTEM 指示詞

若要自訂 PHP_INI_SYSTEM 指示詞 (請參閱 php.ini 指示詞),請使用 PHP_INI_SCAN_DIR 應用程式設定。

首先,在 Cloud Shell 中執行下列命令,以新增名為 PHP_INI_SCAN_DIR 的應用程式設定:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PHP_INI_SCAN_DIR="d:\home\site\ini"

瀏覽至 Kudu 主控台 (https://<app-name>.scm.azurewebsites.net/DebugConsole),然後瀏覽至 d:\home\site

d:\home\site 中建立名為 ini 的目錄,然後使用要自訂的指示詞在 d:\home\site\ini 目錄中建立 .ini 檔案 (例如 settings.ini)。 使用要在 php .ini 檔案中使用的相同語法。

例如,若要變更 expose_php 的值,請執行下列命令:

cd /home/site
mkdir ini
echo "expose_php = Off" >> ini/setting.ini

如果要讓變更生效,請重新啟動應用程式。

若要自訂 PHP_INI_SYSTEM 指示詞 (請參閱 php.ini 指示詞),您不能使用 .htaccess 方法。 App Service 會使用 PHP_INI_SCAN_DIR 應用程式設定來提供個別的機制。

首先,在 Cloud Shell 中執行下列命令,以新增名為 PHP_INI_SCAN_DIR 的應用程式設定:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PHP_INI_SCAN_DIR="/usr/local/etc/php/conf.d:/home/site/ini"

/usr/local/etc/php/conf.dphp .ini 所在的預設目錄。 /home/site/ini 是您要在其中新增自訂 .ini 檔案的自訂目錄。 您可以使用 : 來分隔這些值。

使用 Linux 容器 (https://<app-name>.scm.azurewebsites.net/webssh/host) 瀏覽至 web SSH 工作階段。

/home/site 中建立名為 ini 的目錄,然後使用要自訂的指示詞在 /home/site/ini 目錄中建立 .ini 檔案 (例如 settings.ini)。 使用要在 php .ini 檔案中使用的相同語法。

提示

在 App Service 的內建 Linux 容器中,會使用 /home 作為保存的共用儲存體。

例如,若要變更 expose_php 的值,請執行下列命令:

cd /home/site
mkdir ini
echo "expose_php = Off" >> ini/setting.ini

如果要讓變更生效,請重新啟動應用程式。

啟用 PHP 擴充功能

內建 PHP 安裝包含最常使用的擴充功能。 您可以使用與自訂 php.ini 指示詞相同的方式來啟用其他擴充功能。

注意

查看 PHP 版本和目前 php.ini 設定的最佳方法是在應用程式中呼叫 phpinfo ()

若要啟用其他延伸模組,請依照下列步驟執行:

bin 目錄新增至應用程式的根目錄,並在其中放入 .dll 擴充功能檔案 (例如 mongodb.dll)。 請確定擴充功能與 Azure 中的 PHP 版本相容,並且與 VC9 及非執行緒安全 (nts) 相容。

部署您的變更。

依照自訂 PHP_INI_SYSTEM 指示詞中的步驟,將擴充功能新增至使用 extensionzend_extension 指示詞的自訂 .ini 檔案。

extension=d:\home\site\wwwroot\bin\mongodb.dll
zend_extension=d:\home\site\wwwroot\bin\xdebug.dll

如果要讓變更生效,請重新啟動應用程式。

內建 PHP 安裝包含最常使用的擴充功能。 您可以使用與自訂 php.ini 指示詞相同的方式來啟用其他擴充功能。

注意

查看 PHP 版本和目前 php.ini 設定的最佳方法是在應用程式中呼叫 phpinfo ()

若要啟用其他延伸模組,請依照下列步驟執行:

bin 目錄新增至應用程式的根目錄,並在其中放入 .so 擴充功能檔案 (例如 mongodb.so)。 請確定擴充功能與 Azure 中的 PHP 版本相容,並且與 VC9 及非執行緒安全 (nts) 相容。

部署您的變更。

依照自訂 PHP_INI_SYSTEM 指示詞中的步驟,將擴充功能新增至使用 extensionzend_extension 指示詞的自訂 .ini 檔案。

extension=/home/site/wwwroot/bin/mongodb.so
zend_extension=/home/site/wwwroot/bin/xdebug.so

如果要讓變更生效,請重新啟動應用程式。

存取診斷記錄

使用標準 error_log() 公用程式,使您的診斷記錄顯示在 Azure App Service 中。

若要存取 App Service 中應用程式程式碼內部產生的主控台記錄,請在 Cloud Shell 中執行下列命令,以開啟診斷記錄功能:

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose

--level 的可能值為:ErrorWarningInfoVerbose。 後續的每個層級都包含上一個層級。 例如:Error 只包含錯誤訊息,而 Verbose 包含所有訊息。

開啟診斷記錄後,請執行下列命令來查看記錄資料流:

az webapp log tail --resource-group <resource-group-name> --name <app-name>

如果您沒有立即看到主控台記錄,請在 30 秒後再查看。

注意

您也可以在瀏覽器中的 https://<app-name>.scm.azurewebsites.net/api/logs/docker 檢查記錄檔。

若要隨時停止記錄資料流,請輸入 Ctrl+C

您可以存取從容器產生的主控台記錄。

請先執行下列命令來開啟容器記錄:

az webapp log config --name <app-name> --resource-group <resource-group-name> --docker-container-logging filesystem

以適合您 Web 應用程式的名稱取代 <app-name><resource-group-name>

開啟容器記錄後,請執行下列命令來查看記錄資料流:

az webapp log tail --name <app-name> --resource-group <resource-group-name>

如果您沒有立即看到主控台記錄,請在 30 秒後再查看。

若要隨時停止記錄資料流,請輸入 Ctrl+C

您也可以在瀏覽器中的 https://<app-name>.scm.azurewebsites.net/api/logs/docker 檢查記錄檔。

疑難排解

當運作中的 PHP 應用程式在 App Service 中有不同的行為或發生錯誤時,請嘗試下列動作:

  • 存取記錄資料流
  • 在生產模式中於本機測試應用程式。 App Service 會在生產模式中執行您的應用程式,因此您必須確定專案在生產模式下按預期在本機中運作。 例如:
    • composer.json 而定,可能會為生產模式安裝不同的套件 (requirerequire-dev)。
    • 某些 web 架構可以在生產模式中以不同的方式部署靜態檔案。
    • 在生產模式中執行時,某些 web 架構可能會使用自訂啟動指令碼。
  • 在偵錯模式中於 App Service 內執行應用程式。 例如,在 Laravel中,您可以透過APP_DEBUG 應用程式設定設為 true,將應用程式設定為在生產環境中輸出偵錯訊息。

記錄中的 robots933456

您可能會在容器記錄中看到下列訊息:

2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"

您可以放心忽略這個訊息。 /robots933456.txt 是一個虛擬 URL 路徑,App Service 會使用該路徑來檢查容器是否可以處理要求。 404 回應只是指出路徑不存在,但其可讓 App Service 知道容器狀況良好,並已準備好回應要求。

下一步

或者,請參閱其他資源:

環境變數和應用程式設定參考