Tutorial: Criar um aplicativo em PHP e MySQL no Serviço de Aplicativo do Azure

O Serviço de Aplicativo do Azure fornece um serviço de hospedagem na Web altamente escalonável e com aplicação automática de patches usando o sistema operacional Windows. Este tutorial mostra como criar um aplicativo PHP no Azure e conectá-lo a um banco de dados MySQL. Quando terminar, você terá um aplicativo Laravel em execução no Serviço de Aplicativo do Azure no Windows.

O Serviço de Aplicativo do Azure fornece um serviço de hospedagem na Web altamente escalonável e com aplicação automática de patches usando o sistema operacional Linux. Este tutorial mostra como criar um aplicativo PHP no Azure e conectá-lo a um banco de dados MySQL. Quando terminar, você terá um aplicativo Laravel em execução no Serviço de Aplicativo do Azure no Linux.

Captura de tela de um exemplo de aplicativo PHP intitulado Lista de Tarefas.

Neste tutorial, você aprenderá como:

  • Criar um banco de dados MySQL no Azure
  • Conectar um aplicativo PHP ao MySQL
  • Implantar o aplicativo no Azure
  • Atualizar o modelo de dados e reimplantar o aplicativo
  • Transmitir logs de diagnóstico do Azure
  • Gerenciar o aplicativo no portal do Azure

Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.

Pré-requisitos

Para concluir este tutorial:

  • Use o ambiente Bash no Azure Cloud Shell.

    Inicie o Cloud Shell em uma nova janela

  • Se preferir, instale a CLI do Azure para executar comandos de referência da CLI.

    • Se estiver usando uma instalação local, entre com a CLI do Azure usando o comando az login. Para concluir o processo de autenticação, siga as etapas exibidas no terminal. Para mais opções de entrada, confira Entrar com a CLI do Azure.

    • Quando solicitado, instale as extensões da CLI do Azure no primeiro uso. Para obter mais informações sobre extensões, confira Usar extensões com a CLI do Azure.

    • Execute az version para localizar a versão e as bibliotecas dependentes que estão instaladas. Para fazer a atualização para a versão mais recente, execute az upgrade.

Preparar o MySQL local

Nesta etapa, você cria um banco de dados em seu servidor MySQL local para uso neste tutorial.

Conectar ao servidor MySQL local

Em uma janela de terminal, conecte-se ao servidor MySQL local. Você pode usar essa janela do terminal para executar todos os comandos deste tutorial.

mysql -u root -p

Se for solicitada uma senha, insira a senha da conta root. Caso não se lembre da senha de sua conta raiz, confira MySQL: como redefinir a senha raiz.

Se o comando for executado com êxito, o MySQL Server estará em execução. Caso contrário, veja se o servidor MySQL local foi iniciado seguindo as Etapas pós-instalação do MySQL.

Criar um banco de dados localmente

  1. No prompt mysql, crie um banco de dados.

    CREATE DATABASE sampledb;
    
  2. Saia da conexão do servidor digitando quit.

    quit
    

Criar um aplicativo PHP localmente

Nesta etapa, você obtém um aplicativo de exemplo Laravel, configura sua conexão de banco de dados e o executa localmente.

Clonar o exemplo

Na janela do terminal, cd para um diretório de trabalho.

  1. Clone o repositório de exemplo e altere para a raiz do repositório.

    git clone https://github.com/Azure-Samples/laravel-tasks
    cd laravel-tasks
    
  2. Verifique se o branch padrão é main.

    git branch -m main
    

    Dica

    A alteração do nome do branch não é necessária para o Serviço de Aplicativo. No entanto, como muitos repositórios estão alterando o branch padrão para main, este tutorial também mostra como implantar um repositório por meio de main. Para obter mais informações, confira Alterar branch de implantação.

  3. Instale os pacotes necessários.

    composer install
    

Configurar a conexão do MySQL

Na raiz do repositório, crie um arquivo chamado .env. Copie as variáveis a seguir para o arquivo .env. Substitua o espaço reservado <root_password> pela senha do usuário raiz do 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>

Para obter informações sobre como o Laravel usa o arquivo .env, consulte Configuração de ambiente do Laravel.

Executar o exemplo localmente

  1. Execute migrações de banco de dados do Laravel para criar as tabelas necessárias para o aplicativo. Para ver quais tabelas são criadas nas migrações, examine o diretório database/migrations no repositório Git.

    php artisan migrate
    
  2. Gere uma nova chave de aplicativo do Laravel.

    php artisan key:generate
    
  3. Execute o aplicativo.

    php artisan serve
    
  4. Navegue até http://localhost:8000 em um navegador. Adicione algumas tarefas à página.

    O PHP se conecta com êxito ao MySQL

  5. Para interromper o PHP, digite Ctrl + C no terminal.

Criar o MySQL no Azure

Nesta etapa, você cria um banco de dados MySQL no Banco de Dados do Azure para MySQL. Posteriormente, você configura o aplicativo PHP para se conectar a esse banco de dados.

Criar um grupo de recursos

Um grupo de recursos é um contêiner lógico no qual os recursos do Azure, como aplicativos Web, bancos de dados e contas de armazenamento, são implantados e gerenciados. Por exemplo, é possível excluir posteriormente todo o grupo de recursos com uma única etapa simples.

No Cloud Shell, crie um grupo de recursos com o comando az group create. O exemplo a seguir cria um grupo de recursos chamado myResourceGroup no local Europa Ocidental. Para ver todos os locais com suporte para o Serviço de Aplicativo no nível Gratuito, execute o comando az appservice list-locations --sku FREE.

az group create --name myResourceGroup --location "West Europe"

Em geral, você cria seu grupo de recursos e os recursos em uma região próxima a você.

Quando o comando for concluído, uma saída JSON mostra as propriedades do grupo de recursos.

Criar um servidor MySQL

No Cloud Shell, crie um servidor no Banco de Dados do Azure para MySQL com o comando az mysql server create.

No comando a seguir, substitua um nome do servidor exclusivo pelo espaço reservado <mysql-server-name> , um nome de usuário pelo <admin-user> e uma senha pelo espaço reservado <admin-password> . O nome do servidor é usado como parte de seu ponto de extremidade do MySQL (https://<mysql-server-name>.mysql.database.azure.com) e, portanto, precisa ser exclusivo entre todos os servidores no Azure. Para obter detalhes sobre como selecionar o SKU do Banco de Dados MySQL, confira Criar um servidor do Banco de Dados do Azure para MySQL.

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

Quando o servidor MySQL for criado, a CLI do Azure mostrará informações semelhantes ao exemplo a seguir:

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

Configurar o firewall do servidor

  1. No Cloud Shell, crie uma regra de firewall para o servidor MySQL para permitir conexões de cliente usando o comando az mysql server firewall-rule create. Quando o IP inicial e o IP final estiverem definidos como 0.0.0.0, o firewall estará aberto somente para outros recursos do 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
    

    Dica

    Você pode ser ainda mais restritivo na regra de firewall ao usar somente os endereços de IP de saída que seu aplicativo usa.

  2. No Cloud Shell, execute o comando novamente para permitir acesso no computador local, substituindo <your-ip-address> pelo endereço IP IPv4 local.

    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>
    

Criar um banco de dados de produção

  1. Na janela do terminal local, conecte-se ao servidor MySQL no Azure. Use o valor especificado anteriormente para <admin-user> e <-server-name> . Quando for solicitada uma senha, use a que você especificou quando criou o banco de dados no Azure.

    mysql -u <admin-user>@<mysql-server-name> -h <mysql-server-name>.mysql.database.azure.com -P 3306 -p
    
  2. No prompt mysql, crie um banco de dados.

    CREATE DATABASE sampledb;
    
  3. Crie um usuário de banco de dados chamado phpappuser e conceda a ele todos os privilégios no banco de dados sampledb. Para manter a simplicidade do tutorial, use MySQLAzure2017 como senha.

    CREATE USER 'phpappuser' IDENTIFIED BY 'MySQLAzure2017'; 
    GRANT ALL PRIVILEGES ON sampledb.* TO 'phpappuser';
    
  4. Saia da conexão do servidor digitando quit.

    quit
    

Conectar o aplicativo ao MySQL do Azure

Nesta etapa, você conecta o aplicativo PHP ao banco de dados MySQL criado no Banco de Dados do Azure para MySQL.

Configurar a conexão de banco de dados

Na raiz do repositório, crie um arquivo .env.production e copie as variáveis a seguir para ele. Substitua o espaço reservado <mysql-server-name> em DB_HOST e DB_USERNAME.

APP_ENV=production
APP_DEBUG=true
APP_KEY=

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

Salve as alterações.

Dica

Para proteger as informações de conexão do MySQL, esse arquivo já foi excluído do repositório Git (consulte .gitignore na raiz do repositório). Posteriormente, você aprende a configurar variáveis de ambiente no Serviço de Aplicativo para se conectar ao banco de dados no Banco de Dados do Azure para MySQL. Com variáveis de ambiente, você não precisa do arquivo .env no Serviço de Aplicativo.

Configurar o certificado TLS/SSL

Por padrão, o Banco de Dados do Azure para MySQL impõe conexões TLS de clientes. Para se conectar ao seu banco de dados MySQL no Azure, você deve usar o certificado .pem fornecido pelo Banco de Dados do Azure para MySQL.

Abra config/database.php e adicione os parâmetros sslmode e options a connections.mysql, conforme mostra o código a seguir.

'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',
    ] : []
],

O certificado BaltimoreCyberTrustRoot.crt.pem é fornecido no repositório para facilitar este tutorial.

Testar o aplicativo localmente

  1. Execute migrações de banco de dados do Laravel com .env.production como arquivo de ambiente para criar as tabelas em seu banco de dados MySQL no Banco de Dados do Azure para MySQL. Lembre-se de que .env.production tem as informações de conexão ao banco de dados MySQL no Azure.

    php artisan migrate --env=production --force
    
  2. .env.production ainda não tem uma chave de aplicativo válida. Gere uma nova chave de aplicativo para ele no terminal.

    php artisan key:generate --env=production --force
    
  3. Execute o aplicativo de exemplo com .env.production como arquivo de ambiente.

    php artisan serve --env=production
    
  4. Navegue até http://localhost:8000. Se a página for carregada sem erros, o aplicativo PHP estará se conectando ao banco de dados MySQL no Azure.

  5. Adicione algumas tarefas à página.

    O PHP se conecta com êxito ao Banco de Dados do Azure para MySQL

  6. Para interromper o PHP, digite Ctrl + C no terminal.

Confirmar as alterações

Execute os seguintes comandos do Git para confirmar as alterações:

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

O aplicativo está pronto para ser implantado.

Implantar no Azure

Nesta etapa, você implanta o aplicativo PHP conectado ao MySQL no Serviço de Aplicativo do Azure.

Configurar um usuário de implantação

O FTP e o Git local podem implantar em um aplicativo Web do Azure usando um usuário de implantação. Após configurar o usuário de implantação, use-o em todas as implantações do Azure. O nome de usuário e a senha da implantação no nível da conta são diferentes das credenciais de assinatura do Azure.

Para configurar o usuário de implantação, execute o comando az webapp deployment user set no Azure Cloud Shell. Substitua <username> e <password> pelo nome de usuário e a senha do usuário de implantação.

  • O nome de usuário precisa ser exclusivo no Azure. Para envios por push do Git local, não deve conter o símbolo "@".
  • A senha deve ter pelo menos oito caracteres, com dois destes três elementos: letras, números, símbolos.
az webapp deployment user set --user-name <username> --password <password>

A saída JSON mostra a senha como null. Se receber um erro 'Conflict'. Details: 409, altere o nome de usuário. Se receber um erro 'Bad Request'. Details: 400, use uma senha mais forte.

Registre seu nome de usuário e senha para usá-los na implantação de aplicativos Web.

Criar um plano de Serviço de Aplicativo

No Cloud Shell, crie um plano do Serviço de Aplicativo com o comando az appservice plan create.

O exemplo a seguir cria um plano do Serviço de Aplicativo denominado myAppServicePlan usando o tipo de preço Gratuita:

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

Quando o Plano do Serviço de Aplicativo for criado, a CLI do Azure mostrará informações semelhantes ao exemplo a seguir:

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

No Cloud Shell, crie um plano do Serviço de Aplicativo com o comando az appservice plan create.

O exemplo a seguir cria um plano do Serviço de Aplicativo denominado myAppServicePlan usando o tipo de preço Gratuita:

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

Quando o Plano do Serviço de Aplicativo for criado, a CLI do Azure mostrará informações semelhantes ao exemplo a seguir:

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

Criar um aplicativo Web

Crie um aplicativo Web no plano do Serviço de Aplicativo myAppServicePlan.

No Cloud Shell, é possível usar o comando az webapp create. No exemplo a seguir, substitua <app-name> por um nome do aplicativo exclusivo globalmente (os caracteres válidos são a-z, 0-9 e -). A execução é predefinida para PHP|7.2. Para ver todos os runtimes com suporte, execute 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

Quando o aplicativo Web for criado, a CLI do Azure mostrará um resultado semelhante ao seguinte exemplo:

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

Você criou um novo aplicativo Web vazio com a implantação do Git habilitada.

Observação

A URL do Git remoto é mostrada na propriedade deploymentLocalGitUrl com o formato https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git. Salve essa URL, pois você precisará dela mais tarde.

Crie um aplicativo Web no plano do Serviço de Aplicativo myAppServicePlan.

No Cloud Shell, é possível usar o comando az webapp create. No exemplo a seguir, substitua <app-name> por um nome do aplicativo exclusivo globalmente (os caracteres válidos são a-z, 0-9 e -). A execução é predefinida para PHP|7.2. Para ver todos os runtimes com suporte, execute 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

Quando o aplicativo Web for criado, a CLI do Azure mostrará um resultado semelhante ao seguinte exemplo:

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

Você criou um novo aplicativo Web vazio com a implantação do Git habilitada.

Observação

A URL do Git remoto é mostrada na propriedade deploymentLocalGitUrl com o formato https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git. Salve essa URL, pois você precisará dela mais tarde.

Definir configurações de banco de dados

No Serviço de Aplicativo, defina as variáveis de ambiente como configurações do aplicativo usando o comando az webapp config appsettings set.

O comando a seguir define as configurações do aplicativo DB_HOST, DB_DATABASE, DB_USERNAME e DB_PASSWORD. Substitua os espaços reservados <app-name> e <mysql-server-name> .

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

É possível usar o método getenv do PHP para acessar as configurações. O código do Laravel usa um wrapper env em torno do getenv do PHP. Por exemplo, a configuração do MySQL em config/database.php é parecida com o seguinte código:

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

Configurar variáveis de ambiente do Laravel

O Laravel precisa de uma chave de aplicativo no Serviço de Aplicativo. É possível configurá-la com as configurações do aplicativo.

  1. Na janela do terminal local, use php artisan para gerar uma nova chave de aplicativo sem salvá-la em .env.

    php artisan key:generate --show
    
  2. No Cloud Shell, defina a chave de aplicativo no aplicativo do Serviço de Aplicativo usando o comando az webapp config appsettings set. Substitua os espaços reservados <app-name> e <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" instrui o Laravel a retornar informações de depuração quando o aplicativo implantado encontra erros. Ao executar um aplicativo de produção, defina-o como false, que é mais seguro.

Definir o caminho do aplicativo virtual

Defina o caminho do aplicativo virtual do aplicativo. Esta etapa é necessária porque o ciclo de vida do aplicativo do Laravel começa no diretório public, em vez de no diretório raiz do aplicativo. Outras estruturas PHP cujo ciclo de vida começa no diretório raiz podem funcionar sem a configuração manual do caminho do aplicativo virtual.

No Cloud Shell, defina o caminho do aplicativo virtual usando o comando az resource update. Substitua o espaço reservado <app-name> .

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

Por padrão, o Serviço de Aplicativo do Azure aponta o caminho do aplicativo virtual raiz ( / ) para o diretório raiz dos arquivos de aplicativo implantados (sites\wwwroot).

O ciclo de vida do aplicativo Laravel começa no diretório public, e não no diretório raiz do aplicativo. A imagem do Docker do PHP padrão para o Serviço de Aplicativo usa Apache, e não permite a personalização do DocumentRoot para Laravel. No entanto, você pode usar .htaccess para reescrever todas as solicitações a fim de apontar para /public em vez do diretório raiz. Na raiz do repositório, já há um .htaccess para essa finalidade. Com ele, seu aplicativo Laravel está pronto para ser implantado.

Para obter mais informações, confira Alterar raiz do site.

Enviar do Git para o Azure

  1. Como você está implantando o branch main, você precisa definir o branch de implantação padrão para seu aplicativo do Serviço de Aplicativo como main (consulte Alterar o branch de implantação). No Cloud Shell, defina a configuração do aplicativo DEPLOYMENT_BRANCH com o comando az webapp config appsettings set.

    az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DEPLOYMENT_BRANCH='main'
    
  2. De volta na janela do terminal local, adicione um remoto do Azure ao repositório Git local. Substitua <deploymentLocalGitUrl-from-create-step> pela URL do repositório remoto Git que você salvou em Criar um aplicativo Web.

    git remote add azure <deploymentLocalGitUrl-from-create-step>
    
  3. Envie por push para o Azure remoto para implantar seu aplicativo com o comando a seguir. Quando solicitado a fornecer credenciais pelo Gerenciador de Credenciais do Git, insira as credenciais criadas em Configurar um usuário de implantação, não as credenciais usadas para entrar no portal do Azure.

    git push azure main
    

    Esse comando pode demorar um pouco para ser executado. Na execução, ele exibe informações semelhantes ao seguinte exemplo:

   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 >
   

Observação

Você observará que o processo de implantação instala pacotes do Composer no final. O Serviço de Aplicativo não executa essas automações durante a implantação padrão, de modo que esse repositório de exemplo tem três arquivos adicionais em seu diretório raiz para habilitá-las:

  • .deployment - Esse arquivo informa o Serviços de Aplicativo para executar bash deploy.sh como o script de implantação personalizada.
  • deploy.sh - O script de implantação personalizada. Se examinar o arquivo, você verá que ele executa php composer.phar install após npm install.
  • composer.phar – O gerenciador de pacotes do Composer.

É possível usar essa abordagem para adicionar qualquer etapa à implantação base em Git no Serviço de Aplicativo. Para obter mais informações, consulte Script de implantação personalizado.

  1. Como você está implantando o branch main, você precisa definir o branch de implantação padrão para seu aplicativo do Serviço de Aplicativo como main (consulte Alterar o branch de implantação). No Cloud Shell, defina a configuração do aplicativo DEPLOYMENT_BRANCH com o comando az webapp config appsettings set.

    az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DEPLOYMENT_BRANCH='main'
    
  2. De volta na janela do terminal local, adicione um remoto do Azure ao repositório Git local. Substitua <deploymentLocalGitUrl-from-create-step> pela URL do repositório remoto Git que você salvou em Criar um aplicativo Web.

    git remote add azure <deploymentLocalGitUrl-from-create-step>
    
  3. Envie por push para o Azure remoto para implantar seu aplicativo com o comando a seguir. Quando solicitado a fornecer credenciais pelo Gerenciador de Credenciais do Git, insira as credenciais criadas em Configurar um usuário de implantação, não as credenciais usadas para entrar no portal do Azure.

    git push azure main
    

    Esse comando pode demorar um pouco para ser executado. Na execução, ele exibe informações semelhantes ao seguinte exemplo:

   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 >
   

Navegar até o aplicativo do Azure

Navegue até http://<app-name>.azurewebsites.net e adicione algumas tarefas à lista.

Captura de tela do exemplo de aplicativo do Azure intitulado Lista de Tarefas mostrando novas tarefas adicionadas.

Parabéns! Você está executando um aplicativo PHP controlado por dados no Serviço de Aplicativo do Azure.

Atualizar o modelo localmente e reimplantar

Nesta etapa, você faz uma alteração simples no modelo de dados task e no aplicativo Web e, em seguida, publica a atualização no Azure.

Para o cenário de tarefas, modifique o aplicativo para que você possa marcar uma tarefa como concluída.

Adicionar uma coluna

  1. Na janela do terminal local, navegue para a raiz do repositório Git.

  2. Gere uma nova migração de banco de dados para a tabela tasks:

    php artisan make:migration add_complete_column --table=tasks
    
  3. Esse comando exibe o nome do arquivo de migração gerado. Localize esse arquivo em database/migrations e abra-o.

  4. Substitua o método up pelo seguinte código:

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

    O código anterior adiciona uma coluna booliana à tabela tasks chamada complete.

  5. Substitua o método down pelo seguinte código para a ação de reversão:

    public function down()
    {
        Schema::table('tasks', function (Blueprint $table) {
            $table->dropColumn('complete');
        });
    }
    
  6. Na janela do terminal local, execute migrações de banco de dados do Laravel para fazer a alteração no banco de dados local.

    php artisan migrate
    

    Com base na convenção de nomenclatura do Laravel, o modelo Task (consulte app/Task.php) é mapeado para a tabela tasks por padrão.

Atualizar a lógica do aplicativo

  1. Abra o arquivo routes/web.php. O aplicativo define suas rotas e sua lógica de negócios aqui.

  2. No final do arquivo, adicione uma rota com o código a seguir:

    /**
     * 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('/');
    });
    

    O código anterior faz uma atualização simples no modelo de dados ativando/desativando o valor de complete.

Atualizar a exibição

  1. Abra o arquivo resources/views/tasks.blade.php. Encontre a marcação de abertura <tr> e a substitua por:

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

    O código anterior altera a cor da linha dependendo se a tarefa foi concluída.

  2. Na linha seguinte, você tem o código a seguir:

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

    Substitua a linha inteira pelo código a seguir:

    <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>
    

    O código anterior adiciona o botão Enviar que referencia a rota definida anteriormente.

Testar as alterações localmente

  1. Na janela do terminal local, execute o servidor de desenvolvimento pelo diretório raiz do repositório Git.

    php artisan serve
    
  2. Para ver a alteração de status da tarefa, navegue para http://localhost:8000 e marque a caixa de seleção.

    Caixa de seleção adicionada à tarefa

  3. Para interromper o PHP, digite Ctrl + C no terminal.

Publicar alterações no Azure

  1. Na janela do terminal local, execute migrações de banco de dados do Laravel com a cadeia de conexão de produção para fazer a alteração no banco de dados do Azure.

    php artisan migrate --env=production --force
    
  2. Confirme todas as alterações no Git e, em seguida, envie as alterações de código por push para o Azure.

    git add .
    git commit -m "added complete checkbox"
    git push azure main
    
  3. Quando git push for concluído, navegue até o aplicativo do Azure e teste a nova funcionalidade.

    Alterações de banco de dados e modelos publicadas no Azure

Se você tiver adicionado tarefas, elas serão retidas no banco de dados. As atualizações no esquema de dados deixam os dados existentes intactos.

Logs de diagnóstico de fluxo

Embora o aplicativo PHP seja executado no Serviço de Aplicativo do Azure, é possível fazer com que os logs do console sejam redirecionados para o terminal. Dessa forma, é possível obter as mesmas mensagens de diagnóstico para ajudá-lo a depurar erros de aplicativo.

Para iniciar o streaming de log, use o comando az webapp log tail no Cloud Shell.

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

Depois que o streaming de log for iniciado, atualize o aplicativo do Azure no navegador para obter parte do tráfego da Web. Agora é possível ver os logs do console redirecionados para o terminal. Se você não vir os logs do console imediatamente, verifique novamente após 30 segundos.

Para interromper o streaming de log a qualquer momento, digite Ctrl+C.

Para acessar os logs de console gerados dentro do código do aplicativo no Serviço de Aplicativo, ative o log de diagnóstico executando o seguinte comando no Cloud Shell:

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

Os valores possíveis para --level são Error, Warning, Info e Verbose. Cada nível seguinte inclui o anterior. Por exemplo: Error inclui apenas mensagens de erro e Verbose inclui todas as mensagens.

Depois que o log de diagnósticos estiver ativado, execute o seguinte comando para ver o fluxo de logs:

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

Se você não vir os logs do console imediatamente, verifique novamente após 30 segundos.

Observação

Você também pode inspecionar os arquivos de log do navegador em https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Para interromper o streaming de log a qualquer momento, digite Ctrl+C.

Dica

Um aplicativo PHP pode usar o error_log() padrão para gerar a saída para o console. O aplicativo de exemplo usa essa abordagem em app/Http/routes.php.

Como uma estrutura da Web, o Laravel usa o Monolog como provedor de logs. Para saber como fazer com que o Monolog produza mensagens para o console, confira PHP: como usar o Monolog para registrar no console (php://out).

Gerenciar o aplicativo do Azure

  1. Acesse o portal do Azure para gerenciar o aplicativo que você criou.

  2. No menu à esquerda, clique em Serviços de Aplicativos e, em seguida, clique no nome do aplicativo do Azure.

    Navegação no Portal para o aplicativo do Azure

    Você verá a página Visão geral do aplicativo. Aqui, você pode executar tarefas básicas de gerenciamento, como parar, iniciar, reiniciar, procurar e excluir.

    O menu à esquerda fornece páginas para configurar o aplicativo.

    Página Serviço de Aplicativo no portal do Azure

Limpar os recursos

Nas etapas anteriores, você criou os recursos do Azure em um grupo de recursos. Se você acha que não precisará desses recursos no futuro, exclua o grupo de recursos executando o seguinte comando no Cloud Shell:

az group delete --name myResourceGroup

Esse comando pode demorar um pouco para ser executado.

Próximas etapas

Neste tutorial, você aprendeu a:

  • Criar um banco de dados MySQL no Azure
  • Conectar um aplicativo PHP ao MySQL
  • Implantar o aplicativo no Azure
  • Atualizar o modelo de dados e reimplantar o aplicativo
  • Transmitir logs de diagnóstico do Azure
  • Gerenciar o aplicativo no portal do Azure

Vá para o próximo tutorial para aprender a mapear um nome DNS personalizado para o aplicativo.

Se preferir, confira outros recursos: