教程:在 Azure 应用服务中生成 PHP 和 MySQL 应用

Azure 应用服务使用 Windows 操作系统,提供高度可缩放的自修补 Web 托管服务。 本教程介绍如何在 Azure 中创建 PHP 应用,并将其连接到 MySQL 数据库。 完成本教程后,Windows 的 Azure 应用服务中将会运行一个 Laravel 应用。

Azure 应用服务使用 Linux 操作系统,提供高度可缩放的自修补 Web 托管服务。 本教程介绍如何在 Azure 中创建 PHP 应用,并将其连接到 MySQL 数据库。 完成本教程后,Linux 上的 Azure 应用服务中将会运行一个 Laravel 应用。

标题为“任务列表”的 PHP 应用示例的屏幕截图。

在本教程中,你将了解如何执行以下操作:

  • 在 Azure 中创建 MySQL 数据库
  • 将 PHP 应用连接到 MySQL
  • 将应用部署到 Azure
  • 更新数据模型并重新部署应用
  • 从 Azure 流式传输诊断日志
  • 在 Azure 门户中管理应用

如果没有 Azure 订阅,可在开始前创建一个试用帐户

先决条件

完成本教程:

  • 如果需要,请安装 Azure CLI 来运行 CLI 参考命令。

    • 如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅登录 Azure CLI

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展

    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade

准备本地 MySQL

此步骤在本地 MySQL 服务器供中创建一个数据库,以便在本教程中使用。

连接到本地 MySQL 服务器

在终端窗口中连接到本地 MySQL 服务器。 可使用此终端窗口运行本教程中的所有命令。

mysql -u root -p

当系统提示输入密码时,请输入 root 帐户的密码。 如果不记得自己的 Root 帐户密码,请参阅 MySQL:如何重置 Root 密码

如果命令成功运行,则表示 MySQL 服务器正在运行。 否则,请确保遵循 MySQL 安装后步骤启动本地 MySQL 服务器。

在本地创建数据库

mysql 提示中创建数据库。

CREATE DATABASE sampledb;

键入 quit 退出服务器连接。

quit

在本地创建 PHP 应用

此步骤创建一个 Laravel 示例应用程序、配置其数据库连接,并在本地运行该应用程序。

克隆示例

在终端窗口中,通过 cd 转到工作目录。

运行下列命令,克隆示例存储库。

git clone https://github.com/Azure-Samples/laravel-tasks

通过 cd 转到克隆目录。 安装所需程序包。

cd laravel-tasks
composer install

配置 MySQL 连接

在存储库根路径中,创建名为 .env 的文件。 复制下列变量到 .env 文件。 请将 <root_password> 占位符替换为 MySQL 根用户的密码。

APP_ENV=local
APP_DEBUG=true
APP_KEY=

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=sampledb
DB_USERNAME=root
DB_PASSWORD=<root_password>

有关 Laravel 如何使用 .env 文件的信息,请参阅 Laravel 环境配置

在本地运行示例

运行 Laravel 数据库迁移,创建应用程序所需的表。 若要查看迁移中创建了哪些表,请查看 Git 存储库中的 database/migrations 目录。

php artisan migrate

生成新的 Laravel 应用程序密钥。

php artisan key:generate

运行应用程序。

php artisan serve

在浏览器中导航至 http://localhost:8000 。 在页面中添加一些任务。

PHP 已成功连接到 MySQL

在终端键入 Ctrl + C 可停止 PHP。

在 Azure 中创建 MySQL

此步骤在 Azure Database for MySQL 中创建一个 MySQL 数据库。 稍后需要将 PHP 应用程序配置为连接到此数据库。

创建资源组

资源组是在其中部署和管理 Azure 资源(如 Web 应用、数据库和存储帐户)的逻辑容器。 例如,可以选择在使用完之后通过一个简单的步骤删除整个资源组。

在 Azure CLI 中,使用 az group create 命令创建资源组。 以下示例在“中国北部”位置创建名为“myResourceGroup”的资源组。 要查看“免费”层中应用服务支持的所有位置,请运行 az appservice list-locations --sku FREE 命令。

az group create --name myResourceGroup --location "China North"

通常在附近的区域中创建资源组和资源。

此命令完成后,JSON 输出会显示资源组属性。

创建 MySQL 服务器

在 Windows 终端中,使用 az mysql server create 命令在 Azure Database for MySQL 中创建一个服务器。

在下列命令中,用唯一的服务器名称替换 <mysql-server-name> 占位符,用用户名替换<admin-user> 占位符,并用密码替换 <admin-password> 占位符 。 此服务器名称用作 MySQL 终结点 (https://<mysql-server-name>.mysql.database.azure.cn) 的一部分,因此需在 Azure 的所有服务器中保持唯一。 有关选择 MySQL DB SKU 的详细信息,请参阅为 MySQL 服务器创建 Azure 数据库

az mysql server create --resource-group myResourceGroup --name <mysql-server-name> --location "China North" --admin-user <admin-user> --admin-password <admin-password> --sku-name B_Gen5_1

创建 MySQL 服务器后,Azure CLI 会显示类似于以下示例的信息:

{
  "administratorLogin": "<admin-user>",
  "administratorLoginPassword": null,
  "fullyQualifiedDomainName": "<mysql-server-name>.mysql.database.azure.cn",
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.DBforMySQL/servers/<mysql-server-name>",
  "location": "chinanorth",
  "name": "<mysql-server-name>",
  "resourceGroup": "myResourceGroup",
  ...
  -  < Output has been truncated for readability >
}

配置服务器防火墙

在 Windows 终端中,使用 az mysql server firewall-rule create 命令创建 MySQL 服务器的防火墙规则,以便建立客户端连接。 若同时将起始 IP 和结束 IP 设置为 0.0.0.0,防火墙将仅对其他 Azure 资源开启。

az mysql server firewall-rule create --name allAzureIPs --server <mysql-server-name> --resource-group myResourceGroup --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0

提示

你甚至可以让防火墙规则更严格,即只使用应用所使用的出站 IP 地址

在 Windows 终端中再次运行该命令(将 <your_ip_address> 替换为你的本地 IPv4 IP 地址),这样就可以从本地计算机进行访问。

az mysql server firewall-rule create --name AllowLocalClient --server <mysql-server-name> --resource-group myResourceGroup --start-ip-address=<your-ip-address> --end-ip-address=<your-ip-address>

在本地连接到生产 MySQL 服务器

在本地终端窗口中,连接到 Azure 中的 MySQL 服务器。 对于 <admin-user> 和 <mysql-server-name>,请使用前面指定的值 。 出现输入密码的提示时,请使用在 Azure 中创建数据库时指定的密码。

mysql -u <admin-user>@<mysql-server-name> -h <mysql-server-name>.mysql.database.azure.cn -P 3306 -p

创建生产数据库

mysql 提示中创建数据库。

CREATE DATABASE sampledb;

创建具有权限的用户

创建一个名为 phpappuser 的数据库用户并向其授予 sampledb 数据库中的所有特权。 为方便学习教程,请使用 MySQLAzure2017 作为密码。

CREATE USER 'phpappuser' IDENTIFIED BY 'MySQLAzure2017'; 
GRANT ALL PRIVILEGES ON sampledb.* TO 'phpappuser';

键入 quit 退出服务器连接。

quit

将应用连接到 Azure MySQL

此步骤将 PHP 应用程序连接到在 Azure Database for MySQL 中创建的 MySQL 数据库。

配置数据库连接

在存储库根路径中创建一个 .env.production 文件,并在其中复制以下变量。 替换 DB_HOST 和 DB_USERNAME 中的占位符 <mysql-server-name>

APP_ENV=production
APP_DEBUG=true
APP_KEY=

DB_CONNECTION=mysql
DB_HOST=<mysql-server-name>.mysql.database.azure.cn
DB_DATABASE=sampledb
DB_USERNAME=phpappuser@<mysql-server-name>
DB_PASSWORD=MySQLAzure2017
MYSQL_SSL=true

保存更改。

提示

若要保护 MySQL 连接信息,此文件已从 Git 存储库(请参阅存储库根路径中的 .gitignore排除。 以后介绍如何将应用服务中的环境变量配置为连接到 Azure Database for MySQL 中的数据库。 有了环境变量,便不需要应用服务中的 .env 文件。

配置 TLS/SSL 证书

默认情况下,Azure Database for MySQL 强制执行来自客户端的 TLS 连接。 若要连接到 Azure 中的 MySQL 数据库,必须使用 Azure Database for MySQL 提供的 .pem 证书

打开 config/database.php,将 sslmodeoptions 参数添加到 connections.mysql,如以下代码所示。

'mysql' => [
    ...
    'sslmode' => env('DB_SSLMODE', 'prefer'),
    'options' => (env('MYSQL_SSL')) ? [
        PDO::MYSQL_ATTR_SSL_KEY    => '/ssl/BaltimoreCyberTrustRoot.crt.pem', 
    ] : []
],
'mysql' => [
    ...
    'sslmode' => env('DB_SSLMODE', 'prefer'),
    'options' => (env('MYSQL_SSL') && extension_loaded('pdo_mysql')) ? [
        PDO::MYSQL_ATTR_SSL_KEY    => '/ssl/BaltimoreCyberTrustRoot.crt.pem',
    ] : []
],

在本教程中,为方便起见,证书 BaltimoreCyberTrustRoot.crt.pem 在存储库中提供。

在本地测试应用程序

使用 .env.production 作为环境文件运行 Laravel 数据库迁移,在 Azure Database for MySQL 中的 MySQL 数据库内创建表。 请记住,在 Azure 中 .env.production 具有的 MySQL 数据库的连接信息。

php artisan migrate --env=production --force

.env.production 目前还不包含有效的应用程序密钥。 请在终端中为它生成一个新密钥。

php artisan key:generate --env=production --force

使用 .env.production 作为环境文件运行示例应用程序。

php artisan serve --env=production

导航到 http://localhost:8000。 如果页面可加载且未出错,则表示 PHP 应用程序正在连接到 Azure 中的 MySQL 数据库。

在页面中添加一些任务。

PHP 已成功连接到 Azure Database for MySQL

在终端键入 Ctrl + C 可停止 PHP。

提交更改

运行以下的 Git 命令,提交更改:

git add .
git commit -m "database.php updates"

应用已可用于部署。

“部署到 Azure”

此步骤将已连接 MySQL 的 PHP 应用程序部署到 Azure 应用服务。

配置部署用户

可以使用“部署用户” 将 FTP 和本地 Git 部署到 Azure Web 应用。 配置部署用户之后,可对所有 Azure 部署使用此用户。 帐户级部署用户名和密码不同于 Azure 订阅凭据。

若要配置部署用户,请在 Azure Cloud Shell 中运行 az webapp deployment user set 命令。 将 <username> 和 <password> 替换为部署用户名和密码。

  • 用户名必须在 Azure 中唯一,并且对于本地 Git 推送,不能包含“@”符号。
  • 密码必须至少为 8 个字符,且具有字母、数字和符号这三种元素中的两种。
az webapp deployment user set --user-name <username> --password <password>

JSON 输出会将该密码显示为 null。 如果收到 'Conflict'. Details: 409 错误,请更改用户名。 如果收到 'Bad Request'. Details: 400 错误,请使用更强的密码。

请记录你要用于部署 Web 应用的用户名和密码。

创建应用服务计划

使用 az appservice plan create 命令创建应用服务计划。

以下示例在免费定价层中创建名为 myAppServicePlan 的应用服务计划:

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE

创建应用服务计划后,Azure CLI 会显示类似于以下示例的信息:

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "China North",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "app",
  "location": "China North",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

在 Azure CLI 中,使用 az appservice plan create 命令创建一个应用服务计划。

以下示例在免费定价层中创建名为 myAppServicePlan 的应用服务计划:

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE

创建应用服务计划后,Azure CLI 会显示类似于以下示例的信息:

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "China North",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "app",
  "location": "China North",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

创建 Web 应用

myAppServicePlan 应用服务计划中创建一个 Web 应用

在 Azure CLI 中,可以使用 az webapp create 命令。在以下示例中,将 <app-name> 替换为全局唯一的应用名称(有效字符是 a-z0-9-)。 运行时设置为 PHP|7.2。 若要查看所有受支持的运行时,请运行 az webapp list-runtimes

# Bash
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git
# PowerShell
az --% webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git

创建 Web 应用后,Azure CLI 会显示类似于以下示例的输出:

Local git is configured with url of 'https://<username>@<app-name>.scm.chinacloudsites.cn/<app-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.chinacloudsites.cn",
  "deploymentLocalGitUrl": "https://<username>@<app-name>.scm.chinacloudsites.cn/<app-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

现在你已经创建了一个新的空 Web 应用并启用了 Git 部署。

备注

Git 远程的 URL 将显示在 deploymentLocalGitUrl 属性中,其格式为 https://<username>@<app-name>.scm.chinacloudsites.cn/<app-name>.git。 保存此 URL,后续将会用到。

myAppServicePlan 应用服务计划中创建一个 Web 应用

在 Azure CLI 中,可以使用 az webapp create 命令。 在以下示例中,将 <app-name> 替换为全局唯一的应用名称(有效字符是 a-z0-9-)。 运行时设置为 PHP|7.2。 若要查看所有受支持的运行时,请运行 az webapp list-runtimes --linux

# Bash
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git
# PowerShell
az --% webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git

创建 Web 应用后,Azure CLI 会显示类似于以下示例的输出:

Local git is configured with url of 'https://<username>@<app-name>.scm.chinacloudsites.cn/<app-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.chinacloudsites.cn",
  "deploymentLocalGitUrl": "https://<username>@<app-name>.scm.chinacloudsites.cn/<app-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

现在你已经创建了一个新的空 Web 应用并启用了 Git 部署。

备注

Git 远程的 URL 将显示在 deploymentLocalGitUrl 属性中,其格式为 https://<username>@<app-name>.scm.chinacloudsites.cn/<app-name>.git。 保存此 URL,后续将会用到。

配置数据库设置

在应用服务中,使用 az webapp config appsettings set 命令将环境变量设置为应用设置。

使用以下命令可以配置应用设置 DB_HOSTDB_DATABASEDB_USERNAMEDB_PASSWORD。 替换占位符 <app-name> 和 <mysql-server-name> 。

az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DB_HOST="<mysql-server-name>.mysql.database.azure.cn" DB_DATABASE="sampledb" DB_USERNAME="phpappuser@<mysql-server-name>" DB_PASSWORD="MySQLAzure2017" MYSQL_SSL="true"

可以使用 PHP getenv 方法访问这些设置。 Laravel 代码使用 env 包装器,而不是 PHP getenv。 例如,config/database.php 中的 MySQL 配置如下代码所示:

'mysql' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST', 'localhost'),
    'database'  => env('DB_DATABASE', 'forge'),
    'username'  => env('DB_USERNAME', 'forge'),
    'password'  => env('DB_PASSWORD', ''),
    ...
],

配置 Laravel 环境变量

在应用服务中,Laravel 需要应用程序密钥。 可以使用应用设置来配置该密钥。

在本地终端窗口中,使用 php artisan 生成新的应用程序密钥,但不要将它保存到 .env

php artisan key:generate --show

在 Windows 终端中,使用 az webapp config appsettings set 命令在应用服务应用中设置应用程序密钥。 替换占位符 <appname><outputofphpartisankey:generate>

az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings APP_KEY="<output_of_php_artisan_key:generate>" APP_DEBUG="true"

当部署的应用遇到错误时,APP_DEBUG="true" 将告知 Laravel 返回调试信息。 在运行生产应用程序时,请将其设置为 false,这样会更安全。

设置虚拟应用程序路径

设置应用的虚拟应用程序路径。 需要执行此步骤的原因是 Laravel 应用程序生命周期在 public 目录中开始,而不是在应用程序的根目录中开始。 无需手动配置虚拟应用程序路径,生命周期在根目录中开始的其他 PHP 框架也能正常工作。

在 Windows 终端中,使用 az resource update 命令设置虚拟应用程序路径。 替换 <appname> 占位符。

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

默认情况下,Azure 应用服务将根虚拟应用程序路径 (/) 指向已部署的应用程序的文件的根目录 (sites\wwwroot)。

Laravel 应用程序生命周期在 public 目录中开始,而不是在应用程序的根目录中开始。 适用于应用服务的默认 PHP Docker 映像使用 Apache,不允许为 Laravel 自定义 DocumentRoot。 但是,可以使用 .htaccess 来重写所有请求,使之指向 /public 而不是根目录。 在存储库根目录中,已针对此目的添加了 .htaccess。 有了它即可部署 Laravel 应用程序。

有关详细信息,请参阅更改站点根

从 Git 推送到 Azure

回到本地终端窗口,将 Azure 远程功能添加到本地 Git 存储库。 将 <deploymentLocalGitUrl-from-create-step> 替换为在创建 Web 应用中保存的 Git 远程 URL。

git remote add azure <deploymentLocalGitUrl-from-create-step>

使用以下命令推送到 Azure 远程库以部署应用。 当 Git 凭据管理器提示输入凭据时,请确保输入在 配置部署用户 中创建的凭据,而不是用于登录到 Azure 门户的凭据。

git push azure master

此命令可能需要花费几分钟时间运行。 运行时,该命令会显示类似于以下示例的信息:

Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 291 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Updating branch 'main'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'a5e076db9c'.
remote: Running custom deployment command...
remote: Running deployment command...
...
< Output has been truncated for readability >

备注

你可能会发现,部署过程在即将结束时会安装 Composer 包。 应用服务在默认部署期间不会运行这些自动化任务,因此该示例存储库的根目录中提供了两个附加的文件用于运行这些任务:

  • .deployment - 此文件告知应用服务以自定义部署脚本运行 bash deploy.sh
  • deploy.sh - 自定义部署脚本。 查看该文件时可以看到,它会先运行 npm install,再运行 php composer.phar install
  • composer.phar - Composer 包管理器。

可使用此方法将任何步骤添加到应用服务中的基于 Git 的部署。 有关详细信息,请参阅自定义部署脚本

回到本地终端窗口,将 Azure 远程功能添加到本地 Git 存储库。 将 <deploymentLocalGitUrl-from-create-step> 替换为在创建 Web 应用中保存的 Git 远程 URL。

git remote add azure <deploymentLocalGitUrl-from-create-step>

使用以下命令推送到 Azure 远程库以部署应用。 当 Git 凭据管理器提示输入凭据时,请确保输入在 配置部署用户 中创建的凭据,而不是用于登录到 Azure 门户的凭据。

git push azure master

此命令可能需要花费几分钟时间运行。 运行时,该命令会显示类似于以下示例的信息:

Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 291 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Updating branch 'main'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'a5e076db9c'.
remote: Running custom deployment command...
remote: Running deployment command...
...
< Output has been truncated for readability >

转到 Azure 应用

浏览到 http://<app-name>.chinacloudsites.cn 并在列表中添加一些任务。

标题为“任务列表”的 Azure 应用示例的屏幕截图,显示了添加的新任务。

恭喜,你的数据驱动的 PHP 应用正在 Azure 应用服务中运行。

在本地更新模型和重新部署

在此步骤中,对 task 数据模型和 webapp 进行简单更改,然后将更新发布到 Azure。

对于任务方案,需要修改应用程序,以便能够将任务标记为已完成。

添加列

在本地终端窗口中,导航到 Git 存储库中的根路径。

tasks 表创建新数据库迁移:

php artisan make:migration add_complete_column --table=tasks

此命令显示已生成的迁移文件的名称。 在 database/migrations 中找到此文件,并打开它。

up 方法替换为以下代码:

public function up()
{
    Schema::table('tasks', function (Blueprint $table) {
        $table->boolean('complete')->default(False);
    });
}

上述代码在名为 completetasks 表中添加一个布尔值列。

请将 down 方法替换为以下回滚操作代码:

public function down()
{
    Schema::table('tasks', function (Blueprint $table) {
        $table->dropColumn('complete');
    });
}

在本地终端窗口中运行 Laravel 数据库迁移,以便在本地数据库中进行更改。

php artisan migrate

根据 Laravel 命名约定,模型 Task(请参阅 app/Task.php)默认映射到 tasks 表。

更新应用程序逻辑

打开 routes/web.php 文件。 应用程序在此处定义其路由和业务逻辑。

在文件末尾,添加包含以下代码的路由:

/**
 * Toggle Task completeness
 */
Route::post('/task/{id}', function ($id) {
    error_log('INFO: post /task/'.$id);
    $task = Task::findOrFail($id);

    $task->complete = !$task->complete;
    $task->save();

    return redirect('/');
});

上述代码通过切换 complete 的值对数据模型进行简单的更新。

更新视图

打开 resources/views/tasks.blade.php 文件。 找到 <tr> 开始标记并将其替换为:

<tr class="{{ $task->complete ? 'success' : 'active' }}" >

上述代码会根据任务是否已完成来更改行的颜色。

在下一行中包含以下代码:

<td class="table-text"><div>{{ $task->name }}</div></td>

请将整行替换为以下代码:

<td>
    <form action="{{ url('task/'.$task->id) }}" method="POST">
        {{ csrf_field() }}

        <button type="submit" class="btn btn-xs">
            <i class="fa {{$task->complete ? 'fa-check-square-o' : 'fa-square-o'}}"></i>
        </button>
        {{ $task->name }}
    </form>
</td>

上述代码添加引用前面定义的路由的提交按钮。

在本地测试更改

在本地终端窗口中,从 Git 存储库的根目录运行开发服务器。

php artisan serve

若要查看任务状态更改,请导航至 http://localhost:8000 并选择复选框。

将复选框添加到任务

在终端键入 Ctrl + C 可停止 PHP。

发布对 Azure 所做的更改

在本地终端窗口中,使用生产连接字符串运行 Laravel 数据库迁移,在 Azure 数据库中进行更改。

php artisan migrate --env=production --force

提交在 Git 中进行的所有更改,然后将代码更改推送到 Azure。

git add .
git commit -m "added complete checkbox"
git push azure main

git push 完成后,请导航至 Azure 应用,测试新功能。

发布到 Azure 的模型和数据库更改

如果添加任何任务,则它们保留在数据库中。 更新数据架构不会改变现有数据。

流式传输诊断日志

当 PHP 应用程序在 Azure 应用服务中运行时,可以将控制台日志通过管道传输到终端。 如此,可以获得相同的诊断消息,以便调试应用程序错误。

若要启动日志流式处理,请在 Azure CLI 中使用 az webapp log tail 命令。

az webapp log tail --name <app_name> --resource-group myResourceGroup

启动日志流式处理后,请在浏览器中刷新 Azure 应用,以获取一些 Web 流量。 现在可以看到通过管道传送到终端的控制台日志。 如果没有立即看到控制台日志,请在 30 秒后重新查看。

若要随时停止日志流式处理,请键入 Ctrl+C

若要访问应用服务中的应用程序代码内生成的控制台日志,请在 Azure CLI 中运行以下命令以打开诊断日志记录:

az webapp log config --resource-group <resource-group-name> --name <app-name> --application-logging true --level Verbose

--level 的可能值为:ErrorWarningInfoVerbose。 每个后续级别包括上一个级别。 例如:Error 仅包含错误消息,Verbose 则包含所有消息。

启用诊断日志记录功能以后,请运行以下命令来查看日志流:

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

如果没有立即看到控制台日志,请在 30 秒后重新查看。

备注

也可通过浏览器在 https://<app-name>.scm.chinacloudsites.cn/api/logs/docker 中检查日志文件。

若要随时停止日志流式处理,请键入 Ctrl+C

提示

PHP 应用程序可以使用标准 error_log() 输出到控制台。 示例应用程序在 app/Http/routes.php 中使用此方法。

作为一种 Web 框架,Laravel 使用 Monolog 作为日志记录提供程序。 若要了解如何使用 Monolog 将消息输出到控制台,请参阅 PHP:如何使用 monolog 记录到控制台 (php://out)

管理 Azure 应用

转到 Azure 门户管理已创建的应用。

在左侧菜单中单击 应用程序服务,然后单击 Azure 应用的名称。

在门户中导航到 Azure 应用

这里我们可以看到应用的“概述”页。 在此处可以执行基本的管理任务,例如停止、启动、重启、浏览和删除。

左侧菜单提供用于配置应用的页面。

Azure 门户中的“应用服务”页

清理资源

若要删除通过此快速入门创建的所有资源,请运行以下命令:

az group delete --name myResourceGroup

后续步骤

在本教程中,你了解了如何执行以下操作:

  • 在 Azure 中创建 MySQL 数据库
  • 将 PHP 应用连接到 MySQL
  • 将应用部署到 Azure
  • 更新数据模型并重新部署应用
  • 从 Azure 流式传输诊断日志
  • 在 Azure 门户中管理应用

转到下一教程,了解如何向应用映射自定义 DNS 名称。

或者,查看其他资源: