Tutorial: Creación de una aplicación PHP y MySQL en 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. En este tutorial, se muestra cómo crear una aplicación PHP en Azure y conectarla a una base de datos MySQL. Cuando haya terminado, tendrá una aplicación de Laravel que se ejecuta en Azure App Service en 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. En este tutorial, se muestra cómo crear una aplicación PHP en Azure y conectarla a una base de datos MySQL. Cuando haya terminado, tendrá una aplicación de Laravel que se ejecuta en Azure App Service en Linux.

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

En este tutorial, aprenderá a:

  • Crear una base de datos MySQL en Azure
  • Conectar una aplicación PHP a MySQL
  • Implementar la aplicación en Azure
  • Actualizar el modelo de datos y volver a implementar la aplicación
  • Transmitir registros de diagnóstico desde Azure
  • Administrar la aplicación en Azure Portal

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Requisitos previos

Para completar este tutorial:

Preparación de MySQL local

En este paso, creará una base de datos en el servidor MySQL local para usarlo en este tutorial.

Conexión a un servidor MySQL local

En una ventana de terminal, conéctese al servidor MySQL local. Esta ventana de terminal se puede usar para ejecutar todos los comandos de este tutorial.

mysql -u root -p

Si se le pide una contraseña, escriba la de la cuenta root. 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).

Si el comando se ejecuta correctamente, significa que el servidor MySQL está en ejecución. De lo contrario, siga los pasos posteriores a la instalación de MySQL para asegurarse de iniciar el servidor local de MySQL.

Creación de una base de datos local

  1. En el símbolo del sistema de mysql, cree una base de datos.

    CREATE DATABASE sampledb;
    
  2. Escriba quit para salir de la conexión del servidor.

    quit
    

Creación de una aplicación PHP local

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.

Clonación del ejemplo

En la ventana del terminal, use cd para cambiar a un directorio de trabajo.

  1. Clone el repositorio de ejemplo y cambie a la raíz del repositorio.

    git clone https://github.com/Azure-Samples/laravel-tasks
    cd laravel-tasks
    
  2. Asegúrese de que la rama predeterminada sea main.

    git branch -m main
    

    Sugerencia

    App Service no exige el cambio de nombre de rama. Sin embargo, dado que muchos repositorios cambian su rama predeterminada a main, en este tutorial también se muestra cómo implementar un repositorio desde main. Para más información, consulte Cambio de la rama de implementación.

  3. Instale los paquetes requeridos.

    composer install
    

Configuración de la conexión a MySQL

En la raíz del repositorio, cree un archivo llamado .env. Copie las siguientes variables en el archivo .env. Reemplace el marcador de posición <root_password> por la contraseña del usuario raíz de 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 obtener información sobre la forma en que Laravel usa el archivo .env, consulte Laravel Environment Configuration (Configuración del entorno de Laravel).

Ejecución local del código

  1. Ejecute las migraciones de la base de datos Laravel para crear las tablas que necesita la aplicación. Para ver qué tablas se crean en las migraciones, mire en el directorio database/migrations del repositorio de Git.

    php artisan migrate
    
  2. Genere una nueva clave de aplicación Laravel.

    php artisan key:generate
    
  3. Ejecute la aplicación.

    php artisan serve
    
  4. Vaya a http://localhost:8000 en un explorador. Agregue algunas tareas a la página.

    Conexión correcta de PHP a MySQL

  5. Para detener PHP, escriba Ctrl + C en el terminal.

Creación de MySQL en Azure

En este paso, creará una base de datos MySQL en Azure Database for MySQL. Posteriormente, configurará la aplicación PHP para que se conecte a esta base de datos.

Crear un grupo de recursos

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. Por ejemplo, más adelante puede elegir eliminar todo el grupo de recursos en un solo paso.

En Cloud Shell, cree un grupo de recursos con el comando az group create. En el ejemplo siguiente, se crea un grupo de recursos denominado myResourceGroup en la ubicación Oeste de Europa. Para ver todas las ubicaciones que se admiten en App Service en el nivel Gratis, ejecute el comando az appservice list-locations --sku FREE.

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

Generalmente se crean el grupo de recursos y los recursos en una región cercana.

Cuando finaliza el comando, una salida de JSON muestra las propiedades del grupo de recursos.

Creación de un servidor MySQL

En Cloud Shell, cree un servidor en Azure Database for MySQL con el comando az mysql server create.

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

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:

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

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

    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.

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

    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>
    

Creación de una base de datos de producción

  1. En la ventana del terminal local, conéctese al servidor MySQL de Azure. Use el valor que especificó anteriormente para <admin-user> y <mysql-server-name> . Cuando se le solicite una contraseña, utilice la contraseña que especificó al crear la base de datos en Azure.

    mysql -u <admin-user>@<mysql-server-name> -h <mysql-server-name>.mysql.database.azure.com -P 3306 -p
    
  2. En el símbolo del sistema de mysql, cree una base de datos.

    CREATE DATABASE sampledb;
    
  3. Cree un usuario de base de datos denominado phpappuser y concédale todos los privilegios de la base de datos sampledb. Para simplificar el tutorial, utilice MySQLAzure2017 como contraseña.

    CREATE USER 'phpappuser' IDENTIFIED BY 'MySQLAzure2017'; 
    GRANT ALL PRIVILEGES ON sampledb.* TO 'phpappuser';
    
  4. Escriba quit para salir de la conexión del servidor.

    quit
    

Conexión de una aplicación a Azure MySQL

En este paso, conectará la aplicación PHP a la base de datos MySQL que creó en Azure Database for MySQL.

Configuración de la conexión de base de datos

En la raíz del repositorio, cree un archivo .env.production y copie en él las siguientes variables. Reemplace el marcador de posición <mysql-server-name> en DB_HOST y 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.

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). Más adelante, aprenderá a configurar variables de entorno en App Service para conectarse a la base de datos en Azure Database for MySQL. Con las variables de entorno, no es preciso el archivo .env en App Service.

Configuración del certificado TLS/SSL

De manera predeterminada, Azure Database for MySQL aplica las conexiones TLS de los clientes. Para conectarse a la base de datos MySQL en Azure, debe utilizar el certificado .pem proporcionado por 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.

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

Prueba de la aplicación de forma local

  1. 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. Recuerde que . env.production tiene la información de conexión a su base de datos MySQL de Azure.

    php artisan migrate --env=production --force
    
  2. El archivo .env.production aún no cuenta con una clave de aplicación válida. Genere una nueva para él en el terminal.

    php artisan key:generate --env=production --force
    
  3. Ejecute la aplicación de ejemplo con .env.production como archivo de entorno.

    php artisan serve --env=production
    
  4. Vaya a 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.

  5. Agregue algunas tareas a la página.

    Conexión correcta de PHP a Azure Database for MySQL

  6. Para detener PHP, escriba Ctrl + C en el terminal.

Confirmación de los cambios

Ejecute los siguientes comandos de Git para confirmar los cambios:

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

La aplicación está lista para implementarse.

Implementar en Azure

En este paso se implementará la aplicación PHP conectada a MySQL en Azure App Service.

Configuración de un usuario de implementación

Se puede implementar FTP y Git local en una aplicación web de Azure mediante un usuario de implementación. Una vez configurado este usuario de implementación, podrá usarlo en todas las implementaciones de Azure. El nombre de usuario y la contraseña en el nivel de cuenta son diferentes de las credenciales de suscripción de Azure.

Para configurar el usuario de implementación, ejecute el comando az webapp deployment user set en Azure Cloud Shell. Reemplace <username> y <password> por un nombre de usuario y una contraseña de usuario de implementación.

  • El nombre de usuario debe ser único dentro de Azure y no debe contener el símbolo "@" para las inserciones de Git local.
  • La contraseña debe tener al menos ocho caracteres y dos de los tres elementos siguientes: letras, números y símbolos.
az webapp deployment user set --user-name <username> --password <password>

La salida JSON muestra la contraseña como null. Si se produce un error 'Conflict'. Details: 409, cambie el nombre de usuario. Si se produce un error 'Bad Request'. Details: 400, use una contraseña más segura.

Anote el nombre de usuario y la contraseña que se usarán para implementar las aplicaciones web.

Creación de un plan de App Service

En Cloud Shell, cree un plan de App Service con el comando az appservice plan create.

En el siguiente ejemplo se crea un plan de App Service denominado myAppServicePlan con el plan de tarifa Gratis:

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:

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

En el siguiente ejemplo se crea un plan de App Service denominado myAppServicePlan con el plan de tarifa Gratis:

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

Cuando se crea el plan de App Service, la CLI de Azure muestra información similar al ejemplo siguiente:

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

Creación de una aplicación web

Cree una aplicación web en el plan de App Service de myAppServicePlan.

En Cloud Shell, puede usar el comando az webapp create. 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 -). El tiempo de ejecución se establece en PHP|7.2. Para ver todos los entornos en tiempo de ejecución admitidos, ejecute 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:

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.

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. Guarde esta dirección URL, ya que la necesitará más adelante.

Cree una aplicación web en el plan de App Service de myAppServicePlan.

En Cloud Shell, puede usar el comando az webapp create. 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 -). El tiempo de ejecución se establece en PHP|7.2. Para ver todos los entornos en tiempo de ejecución admitidos, ejecute 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:

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.

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. Guarde esta dirección URL, ya que la necesitará más adelante.

Configuración de la base de datos

En App Service, las variables de entorno se establecen como valores de aplicación mediante el comando az webapp config appsettings set.

El siguiente comando permite configurar los valores de aplicación DB_HOST, DB_DATABASE, DB_USERNAME y DB_PASSWORD. Reemplace los marcadores de posición <app-name> y <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. El código de Laravel usa un contenedor env sobre el elemento getenv de PHP. Por ejemplo, la configuración de MySQL de config/database.php es como el código siguiente:

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

Laravel necesita una clave de aplicación en App Service. Puede configurarlo con valores de aplicación.

  1. En la ventana del terminal local, use php artisan para generar una clave de aplicación sin guardarla en .env.

    php artisan key:generate --show
    
  2. 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. Reemplace los marcadores de posición <app-name> y <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. Al ejecutar una aplicación de producción, establézcala en false, que es más seguro.

Establecimiento de la ruta de acceso de la aplicación virtual

Establezca la ruta de acceso de la aplicación virtual para la aplicación. 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. 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.

En Cloud Shell, establezca la ruta de acceso a la aplicación virtual con el comando az resource update. Reemplace el marcador de posición <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

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

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. La imagen de Docker PHP predeterminada para App Service utiliza Apache y no le permite personalizar DocumentRoot para 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. En la raíz del repositorio, ya se ha agregado .htaccess con este fin. Con él, la aplicación Laravel está preparada para implementarse.

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

Inserción en Azure desde Git

  1. Puesto que va a implementar la rama main, debe establecer la rama de implementación predeterminada para la aplicación de App Service en main (consulte Cambio de la rama de implementación). En Cloud Shell, establezca el valor de la aplicación DEPLOYMENT_BRANCH con el comando az webapp config appsettings set.

    az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DEPLOYMENT_BRANCH='main'
    
  2. En la ventana del terminal local, agregue una instancia remota de Azure al repositorio de Git local. Reemplace <deploymentLocalGitUrl-from-create-step> por la dirección URL del repositorio Git remoto que guardó en Creación de una aplicación web.

    git remote add azure <deploymentLocalGitUrl-from-create-step>
    
  3. Realice la insercion en la instancia remota de Azure para implementar la aplicación con el comando siguiente. 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.

    git push azure main
    

    Este comando puede tardar varios minutos en ejecutarse. Durante la ejecución, muestra información similar a la del ejemplo siguiente:

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

  • .deployment: este archivo indica a App Service que ejecute bash deploy.sh como script de implementación personalizado.
  • deploy.sh: el script de implementación personalizado. Si revisa el archivo, verá que se ejecuta php composer.phar install después de npm install.
  • composer.phar: el administrador de paquetes de Composer.

Puede aplicar este enfoque para agregar cualquier paso a la implementación basada en Git en App Service. Para obtener más información, consulte Custom Deployment Script (Script de implementación personalizado).

  1. Puesto que va a implementar la rama main, debe establecer la rama de implementación predeterminada para la aplicación de App Service en main (consulte Cambio de la rama de implementación). En Cloud Shell, establezca el valor de la aplicación DEPLOYMENT_BRANCH con el comando az webapp config appsettings set.

    az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DEPLOYMENT_BRANCH='main'
    
  2. En la ventana del terminal local, agregue una instancia remota de Azure al repositorio de Git local. Reemplace <deploymentLocalGitUrl-from-create-step> por la dirección URL del repositorio Git remoto que guardó en Creación de una aplicación web.

    git remote add azure <deploymentLocalGitUrl-from-create-step>
    
  3. Realice la insercion en la instancia remota de Azure para implementar la aplicación con el comando siguiente. 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.

    git push azure main
    

    Este comando puede tardar varios minutos en ejecutarse. Durante la ejecución, muestra información similar a la del ejemplo siguiente:

   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 Azure

Vaya a http://<app-name>.azurewebsites.net y agregue algunas tareas a la lista.

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.

Actualización local del modelo y nueva implementación

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.

Para el escenario de las tareas, modifique la aplicación de forma que pueda marcar una tarea como completada.

Adición de una columna

  1. En la ventana del terminal local, vaya a la raíz del repositorio de Git.

  2. Generar una migración de base de datos nueva para la tabla tasks:

    php artisan make:migration add_complete_column --table=tasks
    
  3. Este comando muestra el nombre del archivo de migración generado. Busque este archivo en database/migrations y ábralo.

  4. Reemplace el método up por el código siguiente:

    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.

  5. Reemplace el método down por el siguiente código para la acción de reversión:

    public function down()
    {
        Schema::table('tasks', function (Blueprint $table) {
            $table->dropColumn('complete');
        });
    }
    
  6. En la ventana del terminal local, ejecute las migraciones de base de datos Laravel para realizar el cambio en la base de datos local.

    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.

Actualización de la lógica de aplicación

  1. Abra el archivo routes/web.php. La aplicación define aquí tanto sus rutas como su lógica de negocios.

  2. Al final del archivo, agregue una ruta con el siguiente código:

    /**
     * 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.

Actualización de la vista

  1. Abra el archivo resources/views/tasks.blade.php. Busque la etiqueta de apertura <tr> y reemplácela por:

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

  2. En la siguiente línea, tiene el siguiente código:

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

    Reemplace esta línea al completo por el siguiente código:

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

Prueba local de los cambios

  1. En la ventana del terminal local, ejecute el servidor de desarrollo desde el directorio raíz del repositorio de Git.

    php artisan serve
    
  2. Para ver cómo cambia el estado de la tarea, navegue hasta http://localhost:8000 y active la casilla.

    Casilla agregada a tarea

  3. Para detener PHP, escriba Ctrl + C en el terminal.

Publicación de los cambios en Azure

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

    php artisan migrate --env=production --force
    
  2. Confirme todos los cambios en Git y, después, inserte los cambios en el código en Azure.

    git add .
    git commit -m "added complete checkbox"
    git push azure main
    
  3. Una vez que git push esté completo, vaya a la aplicación de Azure y pruebe la nueva funcionalidad.

    Modelo y cambios en la base de datos publicados en Azure

Si ha agregado tareas, estas se conservarán en la base de datos. Las actualizaciones que efectúe en el esquema de datos dejan los datos existentes intactos.

Transmisión de registros de diagnóstico

Mientras se ejecuta la aplicación PHP en Azure App Service, los registros de la consola se canalizan a su terminal. De este modo, puede obtener los mismos mensajes de diagnóstico para ayudarle a depurar errores de la aplicación.

Para iniciar la transmisión del registro, use el comando az webapp log tail en 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. Ahora puede ver los registros de la consola canalizados al terminal. Si no ve los registros de la consola de inmediato, vuelve a comprobarlo en 30 segundos.

Para detener el streaming del registro en cualquier momento, escriba 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:

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

Los valores posibles de --level son: Error, Warning, Info y Verbose. Todos los niveles incluyen el nivel anterior. Por ejemplo: Error incluye solo los mensajes de error, mientras que Verbose incluye todos los mensajes.

Una vez que se activa el registro de contenedor, ejecute el siguiente comando para ver la transmisión del registro:

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.

Nota

También puede inspeccionar los archivos de registro desde el explorador en https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Para detener el streaming del registro en cualquier momento, escriba Ctrl+C.

Sugerencia

Las aplicaciones PHP pueden usar el elemento estándar error_log() para enviar información a la consola. La aplicación de ejemplo usa este enfoque en app/Http/routes.php.

Como marco web, Laravel usa Monolog como proveedor de registros. 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)].

Administración de la aplicación de Azure

  1. Vaya a Azure Portal para administrar la aplicación que ha creado.

  2. En el menú izquierdo, haga clic en App Services y, luego, en el nombre de la aplicación de Azure.

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

    Verá la página de información general de la aplicación. Aquí se pueden realizar tareas de administración básicas como detener, iniciar, reiniciar, examinar y eliminar.

    El menú izquierdo proporciona varias páginas para configurar la aplicación.

    Página de App Service en Azure Portal

Limpieza de recursos

En los pasos anteriores, creó recursos de Azure en un grupo de recursos. Si prevé que no necesitará estos recursos en el futuro, elimine el grupo de recursos ejecutando el siguiente comando en Cloud Shell:

az group delete --name myResourceGroup

Este comando puede tardar varios segundos en ejecutarse.

Pasos siguientes

En este tutorial, ha aprendido a:

  • Crear una base de datos MySQL en Azure
  • Conectar una aplicación PHP a MySQL
  • Implementar la aplicación en Azure
  • Actualizar el modelo de datos y volver a implementar la aplicación
  • Transmitir registros de diagnóstico desde Azure
  • Administrar la aplicación en Azure Portal

Pase al siguiente tutorial para aprender cómo asignar un nombre DNS personalizado a la aplicación.

O bien, eche un vistazo a otros recursos:

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