Tutorial: Creación de una aplicación PHP y MySQL en Azure App ServiceTutorial: Build a PHP and MySQL app in Azure App Service

Azure App Service proporciona un servicio de hospedaje web muy escalable y con aplicación automática de revisiones con el sistema operativo Windows.Azure App Service provides a highly scalable, self-patching web hosting service using the Windows operating system. En este tutorial, se muestra cómo crear una aplicación PHP en Azure y conectarla a una base de datos MySQL.This tutorial shows how to create a PHP app in Azure and connect it to a MySQL database. Cuando haya terminado, tendrá una aplicación de Laravel que se ejecuta en Azure App Service en Windows.When you're finished, you'll have a Laravel app running on Azure App Service on Windows.

Azure App Service proporciona un servicio de hospedaje web muy escalable y con aplicación automática de revisiones con el sistema operativo Linux.Azure App Service provides a highly scalable, self-patching web hosting service using the Linux operating system. En este tutorial, se muestra cómo crear una aplicación PHP en Azure y conectarla a una base de datos MySQL.This tutorial shows how to create a PHP app in Azure and connect it to a MySQL database. Cuando haya terminado, tendrá una aplicación de Laravel que se ejecuta en Azure App Service en Linux.When you're finished, you'll have a Laravel app running on Azure App Service on Linux.

Captura de pantalla de un ejemplo de aplicación PHP llamada Task List.

En este tutorial, aprenderá a:In this tutorial, you learn how to:

  • Crear una base de datos MySQL en AzureCreate a MySQL database in Azure
  • Conectar una aplicación PHP a MySQLConnect a PHP app to MySQL
  • Implementar la aplicación en AzureDeploy the app to Azure
  • Actualizar el modelo de datos y volver a implementar la aplicaciónUpdate the data model and redeploy the app
  • Transmitir registros de diagnóstico desde AzureStream diagnostic logs from Azure
  • Administrar la aplicación en Azure PortalManage the app in the Azure portal

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.If you don't have an Azure subscription, create a free account before you begin.

Requisitos previosPrerequisites

Para completar este tutorial:To complete this tutorial:

Preparación de MySQL localPrepare local MySQL

En este paso, creará una base de datos en el servidor MySQL local para usarlo en este tutorial.In this step, you create a database in your local MySQL server for your use in this tutorial.

Conexión a un servidor MySQL localConnect to local MySQL server

En una ventana de terminal, conéctese al servidor MySQL local.In a terminal window, connect to your local MySQL server. Esta ventana de terminal se puede usar para ejecutar todos los comandos de este tutorial.You can use this terminal window to run all the commands in this tutorial.

mysql -u root -p

Si se le pide una contraseña, escriba la de la cuenta root.If you're prompted for a password, enter the password for the root account. Si no recuerda la contraseña de la cuenta raíz, consulte MySQL: How to Reset the Root Password (MySQL: Instrucciones de restablecimiento de la contraseña de la cuenta raíz).If you don't remember your root account password, see MySQL: How to Reset the Root Password.

Si el comando se ejecuta correctamente, significa que el servidor MySQL está en ejecución.If your command runs successfully, then your MySQL server is running. De lo contrario, siga los pasos posteriores a la instalación de MySQL para asegurarse de iniciar el servidor local de MySQL.If not, make sure that your local MySQL server is started by following the MySQL post-installation steps.

Creación de una base de datos localCreate a database locally

En el símbolo del sistema de mysql, cree una base de datos.At the mysql prompt, create a database.

CREATE DATABASE sampledb;

Escriba quit para salir de la conexión del servidor.Exit your server connection by typing quit.

quit

Creación de una aplicación PHP localCreate a PHP app locally

En este paso, obtendrá una aplicación Laravel de ejemplo, configurará la conexión a base de datos correspondiente y la ejecutará de forma local.In this step, you get a Laravel sample application, configure its database connection, and run it locally.

Clonación del ejemploClone the sample

En la ventana del terminal, use cd para cambiar a un directorio de trabajo.In the terminal window, cd to a working directory.

Ejecute el comando siguiente para clonar el repositorio de ejemplo.Run the following command to clone the sample repository.

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

cd en el directorio clonado.cd to your cloned directory. Instale los paquetes requeridos.Install the required packages.

cd laravel-tasks
composer install

Configuración de la conexión a MySQLConfigure MySQL connection

En la raíz del repositorio, cree un archivo llamado .env.In the repository root, create a file named .env. Copie las siguientes variables en el archivo .env.Copy the following variables into the .env file. Reemplace el marcador de posición <root_password> por la contraseña del usuario raíz de MySQL.Replace the <root_password> placeholder with the MySQL root user's password.

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 obtener información sobre la forma en que Laravel usa el archivo .env, consulte Laravel Environment Configuration (Configuración del entorno de Laravel).For information on how Laravel uses the .env file, see Laravel Environment Configuration.

Ejecución local del códigoRun the sample locally

Ejecute las migraciones de la base de datos Laravel para crear las tablas que necesita la aplicación.Run Laravel database migrations to create the tables the application needs. Para ver qué tablas se crean en las migraciones, mire en el directorio database/migrations del repositorio de Git.To see which tables are created in the migrations, look in the database/migrations directory in the Git repository.

php artisan migrate

Genere una nueva clave de aplicación Laravel.Generate a new Laravel application key.

php artisan key:generate

Ejecute la aplicación.Run the application.

php artisan serve

Vaya a http://localhost:8000 en un explorador.Navigate to http://localhost:8000 in a browser. Agregue algunas tareas a la página.Add a few tasks in the page.

Conexión correcta de PHP a MySQL

Para detener PHP, escriba Ctrl + C en el terminal.To stop PHP, type Ctrl + C in the terminal.

Creación de MySQL en AzureCreate MySQL in Azure

En este paso, creará una base de datos MySQL en Azure Database for MySQL.In this step, you create a MySQL database in Azure Database for MySQL. Posteriormente, configurará la aplicación PHP para que se conecte a esta base de datos.Later, you configure the PHP application to connect to this database.

Crear un grupo de recursosCreate a resource group

Un grupo de recursos es un contenedor lógico en el que los recursos de Azure, como aplicaciones web, bases de datos y cuentas de almacenamiento, se implementen y administren.A resource group is a logical container into which Azure resources, such as web apps, databases, and storage accounts, are deployed and managed. Por ejemplo, más adelante puede elegir eliminar todo el grupo de recursos en un solo paso.For example, you can choose to delete the entire resource group in one simple step later.

En Cloud Shell, cree un grupo de recursos con el comando az group create.In the Cloud Shell, create a resource group with the az group create command. En el ejemplo siguiente, se crea un grupo de recursos denominado myResourceGroup en la ubicación Oeste de Europa.The following example creates a resource group named myResourceGroup in the West Europe location. Para ver todas las ubicaciones que se admiten en App Service en el nivel Gratis, ejecute el comando az appservice list-locations --sku FREE.To see all supported locations for App Service in Free tier, run the az appservice list-locations --sku FREE command.

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

Generalmente se crean el grupo de recursos y los recursos en una región cercana.You generally create your resource group and the resources in a region near you.

Cuando finaliza el comando, una salida de JSON muestra las propiedades del grupo de recursos.When the command finishes, a JSON output shows you the resource group properties.

Creación de un servidor MySQLCreate a MySQL server

En Cloud Shell, cree un servidor en Azure Database for MySQL con el comando az mysql server create.In the Cloud Shell, create a server in Azure Database for MySQL with the az mysql server create command.

En el siguiente comando, sustituya el marcador de posición <mysql-server-name> por un nombre de servidor único, el marcador de posición <admin-user> por un nombre de usuario y el marcador de posición <admin-password> por una contraseña.In the following command, substitute a unique server name for the <mysql-server-name> placeholder, a user name for the <admin-user>, and a password for the <admin-password> placeholder. El nombre del servidor se usa como parte del punto de conexión de MySQL (https://<mysql-server-name>.mysql.database.azure.com), por lo que debe ser único en todos los servidores de Azure.The server name is used as part of your MySQL endpoint (https://<mysql-server-name>.mysql.database.azure.com), so the name needs to be unique across all servers in Azure. Para más información sobre cómo seleccionar la SKU de base de datos de MySQL, consulte Creación de un servidor de Azure Database for MySQL.For details on selecting MySQL DB SKU, see Create an Azure Database for MySQL server.

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

Cuando se crea el servidor MySQL, la CLI de Azure muestra información similar a la del siguiente ejemplo:When the MySQL server is created, the Azure CLI shows information similar to the following example:

{
  "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 >
}

Configuración del firewall del servidorConfigure server firewall

En Cloud Shell, cree una regla de firewall para que el servidor MySQL permita conexiones de cliente con el comando az mysql server firewall-rule create.In the Cloud Shell, create a firewall rule for your MySQL server to allow client connections by using the az mysql server firewall-rule create command. Cuando tanto la dirección IP de inicio como final están establecidas en 0.0.0.0., el firewall solo se abre para otros recursos de Azure.When both starting IP and end IP are set to 0.0.0.0, the firewall is only opened for other Azure resources.

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

Sugerencia

Puede ser incluso más restrictivo con su regla de firewall usando solo las direcciones IP de salida que utiliza su aplicación.You can be even more restrictive in your firewall rule by using only the outbound IP addresses your app uses.

En Cloud Shell, ejecute de nuevo el comando para permitir el acceso desde el equipo local y reemplace <your-ip-address> por su dirección IP IPv4 local.In the Cloud Shell, run the command again to allow access from your local computer by replacing <your-ip-address> with your local IPv4 IP address.

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>

Conexión al servidor MySQL de producción localConnect to production MySQL server locally

En la ventana del terminal local, conéctese al servidor MySQL de Azure.In the local terminal window, connect to the MySQL server in Azure. Use el valor que especificó anteriormente para <admin-user> y <mysql-server-name> .Use the value you specified previously for <admin-user> and <mysql-server-name>. Cuando se le solicite una contraseña, utilice la contraseña que especificó al crear la base de datos en Azure.When prompted for a password, use the password you specified when you created the database in Azure.

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

Creación de una base de datos de producciónCreate a production database

En el símbolo del sistema de mysql, cree una base de datos.At the mysql prompt, create a database.

CREATE DATABASE sampledb;

Creación de un usuario con permisosCreate a user with permissions

Cree un usuario de base de datos denominado phpappuser y concédale todos los privilegios de la base de datos sampledb.Create a database user called phpappuser and give it all privileges in the sampledb database. Para simplificar el tutorial, utilice MySQLAzure2017 como contraseña.For simplicity of the tutorial, use MySQLAzure2017 as the password.

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

Escriba quit para salir de la conexión del servidor.Exit the server connection by typing quit.

quit

Conexión de una aplicación a Azure MySQLConnect app to Azure MySQL

En este paso, conectará la aplicación PHP a la base de datos MySQL que creó en Azure Database for MySQL.In this step, you connect the PHP application to the MySQL database you created in Azure Database for MySQL.

Configuración de la conexión de base de datosConfigure the database connection

En la raíz del repositorio, cree un archivo .env.production y copie en él las siguientes variables.In the repository root, create an .env.production file and copy the following variables into it. Reemplace el marcador de posición <mysql-server-name> en DB_HOST y DB_USERNAME.Replace the placeholder_<mysql-server-name>_ in both DB_HOST and 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

Guarde los cambios.Save the changes.

Sugerencia

Para proteger la información de conexión de MySQL, este archivo ya se ha excluido del repositorio de Git (vea .gitignore en la raíz del repositorio).To secure your MySQL connection information, this file is already excluded from the Git repository (See .gitignore in the repository root). Más adelante, aprenderá a configurar variables de entorno en App Service para conectarse a la base de datos en Azure Database for MySQL.Later, you learn how to configure environment variables in App Service to connect to your database in Azure Database for MySQL. Con las variables de entorno, no es preciso el archivo .env en App Service.With environment variables, you don't need the .env file in App Service.

Configuración del certificado TLS/SSLConfigure TLS/SSL certificate

De manera predeterminada, Azure Database for MySQL aplica las conexiones TLS de los clientes.By default, Azure Database for MySQL enforces TLS connections from clients. Para conectarse a la base de datos MySQL en Azure, debe utilizar el certificado .pem proporcionado por Azure Database for MySQL.To connect to your MySQL database in Azure, you must use the .pem certificate supplied by Azure Database for MySQL.

Abra config/database.php y agregue los parámetros sslmode y options a connections.mysql, como se muestra en el código siguiente.Open config/database.php and add the sslmode and options parameters to connections.mysql, as shown in the following code.

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

El certificado BaltimoreCyberTrustRoot.crt.pem se proporciona en el repositorio por comodidad en este tutorial.The certificate BaltimoreCyberTrustRoot.crt.pem is provided in the repository for convenience in this tutorial.

Prueba de la aplicación de forma localTest the application locally

Ejecute migraciones de base de datos Laravel con .env.production como archivo de entorno para crear las tablas de la base de datos MySQL en Azure Database for MySQL.Run Laravel database migrations with .env.production as the environment file to create the tables in your MySQL database in Azure Database for MySQL. Recuerde que . env.production tiene la información de conexión a su base de datos MySQL de Azure.Remember that .env.production has the connection information to your MySQL database in Azure.

php artisan migrate --env=production --force

El archivo .env.production aún no cuenta con una clave de aplicación válida..env.production doesn't have a valid application key yet. Genere una nueva para él en el terminal.Generate a new one for it in the terminal.

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

Ejecute la aplicación de ejemplo con .env.production como archivo de entorno.Run the sample application with .env.production as the environment file.

php artisan serve --env=production

Vaya a http://localhost:8000.Navigate to http://localhost:8000. Si la página se carga sin errores, significa que la aplicación PHP se está conectado a la base de datos MySQL de Azure.If the page loads without errors, the PHP application is connecting to the MySQL database in Azure.

Agregue algunas tareas a la página.Add a few tasks in the page.

Conexión correcta de PHP a Azure Database for MySQL

Para detener PHP, escriba Ctrl + C en el terminal.To stop PHP, type Ctrl + C in the terminal.

Confirmación de los cambiosCommit your changes

Ejecute los siguientes comandos de Git para confirmar los cambios:Run the following Git commands to commit your changes:

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

La aplicación está lista para implementarse.Your app is ready to be deployed.

Implementar en AzureDeploy to Azure

En este paso se implementará la aplicación PHP conectada a MySQL en Azure App Service.In this step, you deploy the MySQL-connected PHP application to Azure App Service.

Configuración de un usuario de implementaciónConfigure a deployment user

Se puede implementar FTP y Git local en una aplicación web de Azure mediante un usuario de implementación.FTP and local Git can deploy to an Azure web app by using a deployment user. Una vez configurado este usuario de implementación, podrá usarlo en todas las implementaciones de Azure.Once you configure your deployment user, you can use it for all your Azure deployments. El nombre de usuario y la contraseña en el nivel de cuenta son diferentes de las credenciales de suscripción de Azure.Your account-level deployment username and password are different from your Azure subscription credentials.

Para configurar el usuario de implementación, ejecute el comando az webapp deployment user set en Azure Cloud Shell.To configure the deployment user, run the az webapp deployment user set command in Azure Cloud Shell. Reemplace <username> y <password> por un nombre de usuario y una contraseña de usuario de implementación.Replace <username> and <password> with a deployment user username and password.

  • El nombre de usuario debe ser único dentro de Azure y no debe contener el símbolo "@" para las inserciones de Git local.The username must be unique within Azure, and for local Git pushes, must not contain the ‘@’ symbol.
  • La contraseña debe tener al menos ocho caracteres y dos de los tres elementos siguientes: letras, números y símbolos.The password must be at least eight characters long, with two of the following three elements: letters, numbers, and symbols.
az webapp deployment user set --user-name <username> --password <password>

La salida JSON muestra la contraseña como null.The JSON output shows the password as null. Si se produce un error 'Conflict'. Details: 409, cambie el nombre de usuario.If you get a 'Conflict'. Details: 409 error, change the username. Si se produce un error 'Bad Request'. Details: 400, use una contraseña más segura.If you get a 'Bad Request'. Details: 400 error, use a stronger password.

Anote el nombre de usuario y la contraseña que se usarán para implementar las aplicaciones web.Record your username and password to use to deploy your web apps.

Creación de un plan de App ServiceCreate an App Service plan

En Cloud Shell, cree un plan de App Service con el comando az appservice plan create.In the Cloud Shell, create an App Service plan with the az appservice plan create command.

En el siguiente ejemplo se crea un plan de App Service denominado myAppServicePlan con el plan de tarifa Gratis:The following example creates an App Service plan named myAppServicePlan in the Free pricing tier:

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

Cuando se crea el plan de App Service, la CLI de Azure muestra información similar al ejemplo siguiente:When the App Service plan has been created, the Azure CLI shows information similar to the following example:

{ 
  "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
} 

En Cloud Shell, cree un plan de App Service con el comando az appservice plan create.In the Cloud Shell, create an App Service plan with the az appservice plan create command.

En el siguiente ejemplo se crea un plan de App Service denominado myAppServicePlan con el plan de tarifa Gratis:The following example creates an App Service plan named myAppServicePlan in the Free pricing tier:

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

Cuando se crea el plan de App Service, la CLI de Azure muestra información similar al ejemplo siguiente:When the App Service plan has been created, the Azure CLI shows information similar to the following example:

{ 
  "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
} 

Creación de una aplicación webCreate a web app

Cree una aplicación web en el plan de App Service de myAppServicePlan.Create a web app in the myAppServicePlan App Service plan.

En Cloud Shell, puede usar el comando az webapp create.In the Cloud Shell, you can use the az webapp create command. En el siguiente ejemplo, reemplace <app-name> por un nombre único global de aplicación (los caracteres válidos son a-z, 0-9 y -).In the following example, replace <app-name> with a globally unique app name (valid characters are a-z, 0-9, and -). El tiempo de ejecución se establece en PHP|7.2.The runtime is set to PHP|7.2. Para ver todos los entornos en tiempo de ejecución admitidos, ejecute az webapp list-runtimes --linux.To see all supported runtimes, run 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

Cuando se haya creado la aplicación web, la CLI de Azure mostrará información similar a la del ejemplo siguiente:When the web app has been created, the Azure CLI shows output similar to the following example:

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

Ha creado una nueva aplicación web vacía, con la implementación de Git habilitada.You’ve created an empty new web app, with git deployment enabled.

Nota

La dirección URL del repositorio de Git remoto se muestra en la propiedad deploymentLocalGitUrl, con el formato https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git.The URL of the Git remote is shown in the deploymentLocalGitUrl property, with the format https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git. Guarde esta dirección URL, ya que la necesitará más adelante.Save this URL as you need it later.

Cree una aplicación web en el plan de App Service de myAppServicePlan.Create a web app in the myAppServicePlan App Service plan.

En Cloud Shell, puede usar el comando az webapp create.In the Cloud Shell, you can use the az webapp create command. En el siguiente ejemplo, reemplace <app-name> por un nombre único global de aplicación (los caracteres válidos son a-z, 0-9 y -).In the following example, replace <app-name> with a globally unique app name (valid characters are a-z, 0-9, and -). El tiempo de ejecución se establece en PHP|7.2.The runtime is set to PHP|7.2. Para ver todos los entornos en tiempo de ejecución admitidos, ejecute az webapp list-runtimes --linux.To see all supported runtimes, run 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

Cuando se haya creado la aplicación web, la CLI de Azure mostrará información similar a la del ejemplo siguiente:When the web app has been created, the Azure CLI shows output similar to the following example:

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

Ha creado una nueva aplicación web vacía, con la implementación de Git habilitada.You’ve created an empty new web app, with git deployment enabled.

Nota

La dirección URL del repositorio de Git remoto se muestra en la propiedad deploymentLocalGitUrl, con el formato https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git.The URL of the Git remote is shown in the deploymentLocalGitUrl property, with the format https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git. Guarde esta dirección URL, ya que la necesitará más adelante.Save this URL as you need it later.

Configuración de la base de datosConfigure database settings

En App Service, las variables de entorno se establecen como valores de aplicación mediante el comando az webapp config appsettings set.In App Service, you set environment variables as app settings by using the az webapp config appsettings set command.

El siguiente comando permite configurar los valores de aplicación DB_HOST, DB_DATABASE, DB_USERNAME y DB_PASSWORD.The following command configures the app settings DB_HOST, DB_DATABASE, DB_USERNAME, and DB_PASSWORD. Reemplace los marcadores de posición <app-name> y <mysql-server-name> .Replace the placeholders <app-name> and <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"

Para acceder a la configuración puede usar el método getenv de PHP.You can use the PHP getenv method to access the settings. El código de Laravel usa un contenedor env sobre el elemento getenv de PHP.the Laravel code uses an env wrapper over the PHP getenv. Por ejemplo, la configuración de MySQL de config/database.php es como el código siguiente:For example, the MySQL configuration in config/database.php looks like the following code:

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

Configuración de las variables de entorno de LaravelConfigure Laravel environment variables

Laravel necesita una clave de aplicación en App Service.Laravel needs an application key in App Service. Puede configurarlo con valores de aplicación.You can configure it with app settings.

En la ventana del terminal local, use php artisan para generar una clave de aplicación sin guardarla en .env.In the local terminal window, use php artisan to generate a new application key without saving it to .env.

php artisan key:generate --show

En Cloud Shell, establezca la clave de aplicación en la aplicación App Service, para lo que hay que usar el comando az webapp config appsettings set.In the Cloud Shell, set the application key in the App Service app by using the az webapp config appsettings set command. Reemplace los marcadores de posición <app-name> y <outputofphpartisankey:generate> .Replace the placeholders <app-name> and <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" indica a Laravel que devuelva información de depuración si la aplicación implementada encuentra errores.APP_DEBUG="true" tells Laravel to return debugging information when the deployed app encounters errors. Al ejecutar una aplicación de producción, establézcala en false, que es más seguro.When running a production application, set it to false, which is more secure.

Establecimiento de la ruta de acceso de la aplicación virtualSet the virtual application path

Establezca la ruta de acceso de la aplicación virtual para la aplicación.Set the virtual application path for the app. Este paso se requiere porque el ciclo de vida de la aplicación Laravel comienza en el directorio public, en lugar de en el directorio raíz de la aplicación.This step is required because the Laravel application lifecycle begins in the public directory instead of the application's root directory. Otros marcos PHP cuyo ciclo de vida comienza en el directorio raíz pueden funcionar sin necesidad de configurar manualmente la ruta de acceso de la aplicación virtual.Other PHP frameworks whose lifecycle start in the root directory can work without manual configuration of the virtual application path.

En Cloud Shell, establezca la ruta de acceso a la aplicación virtual con el comando az resource update.In the Cloud Shell, set the virtual application path by using the az resource update command. Reemplace el marcador de posición <app-name> .Replace the <app-name> placeholder.

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

De manera predeterminada, Azure App Service apunta la ruta de acceso de la aplicación virtual raíz ( / ) al directorio raíz de los archivos de la aplicación implementada (sites\wwwroot).By default, Azure App Service points the root virtual application path (/) to the root directory of the deployed application files (sites\wwwroot).

El ciclo de vida de la aplicación de Laravel comienza en el directorio public en lugar de en el directorio raíz de la aplicación.Laravel application lifecycle begins in the public directory instead of the application's root directory. La imagen de Docker PHP predeterminada para App Service utiliza Apache y no le permite personalizar DocumentRoot para Laravel.The default PHP Docker image for App Service uses Apache, and it doesn't let you customize the DocumentRoot for Laravel. Sin embargo, puede usar .htaccess para volver a escribir todas las solicitudes para que apunten a /public en lugar de al directorio raíz.However, you can use .htaccess to rewrite all requests to point to /public instead of the root directory. En la raíz del repositorio, ya se ha agregado .htaccess con este fin.In the repository root, an .htaccess is added already for this purpose. Con él, la aplicación Laravel está preparada para implementarse.With it, your Laravel application is ready to be deployed.

Para más información, consulte Change site root (Cambio de la raíz del sitio).For more information, see Change site root.

Inserción en Azure desde GitPush to Azure from Git

En la ventana del terminal local, agregue una instancia remota de Azure al repositorio de Git local.Back in the local terminal window, add an Azure remote to your local Git repository. Reemplace <deploymentLocalGitUrl-from-create-step> por la dirección URL del repositorio Git remoto que guardó en Creación de una aplicación web.Replace <deploymentLocalGitUrl-from-create-step> with the URL of the Git remote that you saved from Create a web app.

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

Realice la insercion en la instancia remota de Azure para implementar la aplicación con el comando siguiente.Push to the Azure remote to deploy your app with the following command. Cuando el Administrador de credenciales de Git le solicite las credenciales, asegúrese de que especifica las que creó en Configuración de un usuario de implementación, no las que se usan para iniciar sesión en Azure Portal.When Git Credential Manager prompts you for credentials, make sure you enter the credentials you created in Configure a deployment user, not the credentials you use to sign in to the Azure portal.

git push azure master

Este comando puede tardar varios minutos en ejecutarse.This command may take a few minutes to run. Durante la ejecución, muestra información similar a la del ejemplo siguiente:While running, it displays information similar to the following example:

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 >

Nota

Puede observar que, al final del proceso de implementación, se instalan paquetes de Composer.You may notice that the deployment process installs Composer packages at the end. App Service no ejecuta estas automatizaciones durante la implementación predeterminada, por lo que este repositorio de ejemplo tiene tres archivos adicionales en su directorio raíz para permitirlo:App Service does not run these automations during default deployment, so this sample repository has three additional files in its root directory to enable it:

  • .deployment: este archivo indica a App Service que ejecute bash deploy.sh como script de implementación personalizado..deployment - This file tells App Service to run bash deploy.sh as the custom deployment script.
  • deploy.sh: el script de implementación personalizado.deploy.sh - The custom deployment script. Si revisa el archivo, verá que se ejecuta php composer.phar install después de npm install.If you review the file, you will see that it runs php composer.phar install after npm install.
  • composer.phar: el administrador de paquetes de Composer.composer.phar - The Composer package manager.

Puede aplicar este enfoque para agregar cualquier paso a la implementación basada en Git en App Service.You can use this approach to add any step to your Git-based deployment to App Service. Para obtener más información, consulte Custom Deployment Script (Script de implementación personalizado).For more information, see Custom Deployment Script.

En la ventana del terminal local, agregue una instancia remota de Azure al repositorio de Git local.Back in the local terminal window, add an Azure remote to your local Git repository. Reemplace <deploymentLocalGitUrl-from-create-step> por la dirección URL del repositorio Git remoto que guardó en Creación de una aplicación web.Replace <deploymentLocalGitUrl-from-create-step> with the URL of the Git remote that you saved from Create a web app.

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

Realice la insercion en la instancia remota de Azure para implementar la aplicación con el comando siguiente.Push to the Azure remote to deploy your app with the following command. Cuando el Administrador de credenciales de Git le solicite las credenciales, asegúrese de que especifica las que creó en Configuración de un usuario de implementación, no las que se usan para iniciar sesión en Azure Portal.When Git Credential Manager prompts you for credentials, make sure you enter the credentials you created in Configure a deployment user, not the credentials you use to sign in to the Azure portal.

git push azure master

Este comando puede tardar varios minutos en ejecutarse.This command may take a few minutes to run. Durante la ejecución, muestra información similar a la del ejemplo siguiente:While running, it displays information similar to the following example:

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 >

Navegación hasta la aplicación de AzureBrowse to the Azure app

Vaya a http://<app-name>.azurewebsites.net y agregue algunas tareas a la lista.Browse to http://<app-name>.azurewebsites.net and add a few tasks to the list.

Captura de pantalla de un ejemplo de aplicación de Azure llamada Task List que muestra las nuevas tareas agregadas.

Ya está ejecutando una aplicación PHP orientada a datos en Azure App Service.Congratulations, you're running a data-driven PHP app in Azure App Service.

Actualización local del modelo y nueva implementaciónUpdate model locally and redeploy

En este paso, se realiza un cambio sencillo en el modelo de datos task y en la aplicación web y, después, se publica la actualización en Azure.In this step, you make a simple change to the task data model and the webapp, and then publish the update to Azure.

Para el escenario de las tareas, modifique la aplicación de forma que pueda marcar una tarea como completada.For the tasks scenario, you modify the application so that you can mark a task as complete.

Adición de una columnaAdd a column

En la ventana del terminal local, vaya a la raíz del repositorio de Git.In the local terminal window, navigate to the root of the Git repository.

Generar una migración de base de datos nueva para la tabla tasks:Generate a new database migration for the tasks table:

php artisan make:migration add_complete_column --table=tasks

Este comando muestra el nombre del archivo de migración generado.This command shows you the name of the migration file that's generated. Busque este archivo en database/migrations y ábralo.Find this file in database/migrations and open it.

Reemplace el método up por el código siguiente:Replace the up method with the following code:

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

El código anterior agrega una columna booleana a la tabla tasks denominada complete.The preceding code adds a boolean column in the tasks table called complete.

Reemplace el método down por el siguiente código para la acción de reversión:Replace the down method with the following code for the rollback action:

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

En la ventana del terminal local, ejecute las migraciones de base de datos Laravel para realizar el cambio en la base de datos local.In the local terminal window, run Laravel database migrations to make the change in the local database.

php artisan migrate

En función de la convención de nomenclatura de Laravel, el modelo Task (consulte app/Task.php) se asigna a la tabla tasks de manera predeterminada.Based on the Laravel naming convention, the model Task (see app/Task.php) maps to the tasks table by default.

Actualización de la lógica de aplicaciónUpdate application logic

Abra el archivo routes/web.php.Open the routes/web.php file. La aplicación define aquí tanto sus rutas como su lógica de negocios.The application defines its routes and business logic here.

Al final del archivo, agregue una ruta con el siguiente código:At the end of the file, add a route with the following code:

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

El código anterior lleva a cabo una sencilla actualización en el modelo de datos, para lo que alterna el valor de complete.The preceding code makes a simple update to the data model by toggling the value of complete.

Actualización de la vistaUpdate the view

Abra el archivo resources/views/tasks.blade.php.Open the resources/views/tasks.blade.php file. Busque la etiqueta de apertura <tr> y reemplácela por:Find the <tr> opening tag and replace it with:

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

El código anterior cambia el color de la fila en función de si la tarea se ha completado.The preceding code changes the row color depending on whether the task is complete.

En la siguiente línea, tiene el siguiente código:In the next line, you have the following code:

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

Reemplace esta línea al completo por el siguiente código:Replace the entire line with the following code:

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

El código anterior agrega el botón de envío que hace referencia a la ruta que definió previamente.The preceding code adds the submit button that references the route that you defined earlier.

Prueba local de los cambiosTest the changes locally

En la ventana del terminal local, ejecute el servidor de desarrollo desde el directorio raíz del repositorio de Git.In the local terminal window, run the development server from the root directory of the Git repository.

php artisan serve

Para ver cómo cambia el estado de la tarea, navegue hasta http://localhost:8000 y active la casilla.To see the task status change, navigate to http://localhost:8000 and select the checkbox.

Casilla agregada a tarea

Para detener PHP, escriba Ctrl + C en el terminal.To stop PHP, type Ctrl + C in the terminal.

Publicación de los cambios en AzurePublish changes to Azure

En la ventana del terminal local, ejecute las migraciones de base de datos Laravel con la cadena de conexión de producción para realizar el cambio en la base de datos de Azure.In the local terminal window, run Laravel database migrations with the production connection string to make the change in the Azure database.

php artisan migrate --env=production --force

Confirme todos los cambios en Git y, después, inserte los cambios en el código en Azure.Commit all the changes in Git, and then push the code changes to Azure.

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

Una vez que git push esté completo, vaya a la aplicación de Azure y pruebe la nueva funcionalidad.Once the git push is complete, navigate to the Azure app and test the new functionality.

Modelo y cambios en la base de datos publicados en Azure

Si ha agregado tareas, estas se conservarán en la base de datos.If you added any tasks, they are retained in the database. Las actualizaciones que efectúe en el esquema de datos dejan los datos existentes intactos.Updates to the data schema leave existing data intact.

Transmisión de registros de diagnósticoStream diagnostic logs

Mientras se ejecuta la aplicación PHP en Azure App Service, los registros de la consola se canalizan a su terminal.While the PHP application runs in Azure App Service, you can get the console logs piped to your terminal. De este modo, puede obtener los mismos mensajes de diagnóstico para ayudarle a depurar errores de la aplicación.That way, you can get the same diagnostic messages to help you debug application errors.

Para iniciar la transmisión del registro, use el comando az webapp log tail en Cloud Shell.To start log streaming, use the az webapp log tail command in the Cloud Shell.

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

Cuando las secuencias de registro se inicien, actualice la aplicación de Azure en el explorador para obtener tráfico web.Once log streaming has started, refresh the Azure app in the browser to get some web traffic. Ahora puede ver los registros de la consola canalizados al terminal.You can now see console logs piped to the terminal. Si no ve los registros de la consola de inmediato, vuelve a comprobarlo en 30 segundos.If you don't see console logs immediately, check again in 30 seconds.

Para detener el streaming del registro en cualquier momento, escriba Ctrl+C.To stop log streaming at any time, type Ctrl+C.

Para acceder a los registros de la consola generados desde el código de la aplicación en App Service, active el registro de diagnósticos, para lo que debe ejecutar el siguiente comando en Cloud Shell:To access the console logs generated from inside your application code in App Service, turn on diagnostics logging by running the following command in the Cloud Shell:

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

Los valores posibles de --level son: Error, Warning, Info y Verbose.Possible values for --level are: Error, Warning, Info, and Verbose. Todos los niveles incluyen el nivel anterior.Each subsequent level includes the previous level. Por ejemplo: Error incluye solo los mensajes de error, mientras que Verbose incluye todos los mensajes.For example: Error includes only error messages, and Verbose includes all messages.

Una vez que se activa el registro de contenedor, ejecute el siguiente comando para ver la transmisión del registro:Once diagnostic logging is turned on, run the following command to see the log stream:

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

Si no ve los registros de la consola de inmediato, vuelve a comprobarlo en 30 segundos.If you don't see console logs immediately, check again in 30 seconds.

Nota

También puede inspeccionar los archivos de registro desde el explorador en https://<app-name>.scm.azurewebsites.net/api/logs/docker.You can also inspect the log files from the browser at https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Para detener el streaming del registro en cualquier momento, escriba Ctrl+C.To stop log streaming at any time, type Ctrl+C.

Sugerencia

Las aplicaciones PHP pueden usar el elemento estándar error_log() para enviar información a la consola.A PHP application can use the standard error_log() to output to the console. La aplicación de ejemplo usa este enfoque en app/Http/routes.php.The sample application uses this approach in app/Http/routes.php.

Como marco web, Laravel usa Monolog como proveedor de registros.As a web framework, Laravel uses Monolog as the logging provider. Para ver cómo obtener Monolog para generar mensajes en la consola, consulte PHP: How to use monolog to log to console (php://out) [PHP: Cómo usar monolog para registrarse en la consola (php://out)].To see how to get Monolog to output messages to the console, see PHP: How to use monolog to log to console (php://out).

Administración de la aplicación de AzureManage the Azure app

Vaya a Azure Portal para administrar la aplicación que ha creado.Go to the Azure portal to manage the app you created.

En el menú izquierdo, haga clic en App Services y, luego, en el nombre de la aplicación de Azure.From the left menu, click App Services, and then click the name of your Azure app.

Navegación en el portal a la aplicación de Azure

Verá la página de información general de la aplicación.You see your app's Overview page. Aquí se pueden realizar tareas de administración básicas como detener, iniciar, reiniciar, examinar y eliminar.Here, you can perform basic management tasks like stop, start, restart, browse, and delete.

El menú izquierdo proporciona varias páginas para configurar la aplicación.The left menu provides pages for configuring your app.

Página de App Service en Azure Portal

Limpieza de recursosClean up resources

En los pasos anteriores, creó recursos de Azure en un grupo de recursos.In the preceding steps, you created Azure resources in a resource group. Si prevé que no necesitará estos recursos en el futuro, elimine el grupo de recursos ejecutando el siguiente comando en Cloud Shell:If you don't expect to need these resources in the future, delete the resource group by running the following command in the Cloud Shell:

az group delete --name myResourceGroup

Este comando puede tardar varios segundos en ejecutarse.This command may take a minute to run.

Pasos siguientesNext steps

En este tutorial, ha aprendido a:In this tutorial, you learned how to:

  • Crear una base de datos MySQL en AzureCreate a MySQL database in Azure
  • Conectar una aplicación PHP a MySQLConnect a PHP app to MySQL
  • Implementar la aplicación en AzureDeploy the app to Azure
  • Actualizar el modelo de datos y volver a implementar la aplicaciónUpdate the data model and redeploy the app
  • Transmitir registros de diagnóstico desde AzureStream diagnostic logs from Azure
  • Administrar la aplicación en Azure PortalManage the app in the Azure portal

Pase al siguiente tutorial para aprender cómo asignar un nombre DNS personalizado a la aplicación.Advance to the next tutorial to learn how to map a custom DNS name to the app.

O bien, eche un vistazo a otros recursos:Or, check out other resources:

Configure PHP app (Configuración de una aplicación de PHP)Configure PHP app