Crear una aplicación con PHP

ID de región

El REGION_ID es un código abreviado que Google asigna en función de la región que selecciones al crear tu aplicación. El código no corresponde a un país o provincia, aunque algunos IDs de región pueden parecerse a los códigos de país y provincia que se usan habitualmente. En las aplicaciones creadas después de febrero del 2020, REGION_ID.r se incluye en las URLs de App Engine. En las aplicaciones creadas antes de esa fecha, el ID de región es opcional en la URL.

Más información sobre los IDs de región

Aprende a crear una aplicación en App Engine con PHP 7.4 u 8.1. La aplicación de ejemplo permite a los usuarios publicar los títulos, los autores, las descripciones, la fecha de publicación y las imágenes de sus libros favoritos en una página web. La aplicación almacena los datos de texto en una base de datos de Cloud SQL y las imágenes en un segmento de Cloud Storage.

Estructura de la guía

  1. Crea un Google Cloud proyecto con Google Cloud CLI.

  2. Descargar la aplicación de ejemplo

  3. Especificar dependencias con composer.json

  4. Inicializar la aplicación y definir los controladores principales

  5. Integrar con los servicios de Google Cloud

  6. Configurar la aplicación para App Engine

  7. Desplegar la aplicación

Antes de empezar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Build API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. Install the Google Cloud CLI.

  6. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  7. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Cloud Build API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  11. Install the Google Cloud CLI.

  12. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  13. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  14. Instala Composer, la herramienta de gestión de dependencias de PHP. Debes instalar Composer de forma global en sistemas Linux y Mac OS X.
  15. Debido a los cambios en el comportamiento predeterminado de cómo usa Cloud Build las cuentas de servicio en los proyectos nuevos y a los cambios en la política de organización de seguridad predeterminada, es posible que tengas que conceder roles adicionales a tu cuenta de servicio de implementación. Para obtener más información sobre cómo conceder roles específicos, consulta la guía de solución de problemas.
  16. Descargar la aplicación de muestra

    1. Consulta el código en GitHub.

    2. Descarga o clona la aplicación.

      git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git

      También puedes descargar el archivo de ejemplo como archivo ZIP y extraerlo.

    3. Ve al directorio getting-started.

      cd php-docs-samples/appengine/standard/getting-started

    Especificar dependencias con composer.json

    La aplicación usa un controlador frontal para enrutar las solicitudes. El código de muestra de esta guía usa Slim Framework, pero puedes usar el framework web que quieras.

    1. Abre el archivo composer.json para revisar todas las dependencias directas:

      {
        "require": {
          "google/cloud-storage": "^1.6",
          "slim/slim": "^4.0",
          "slim/psr7": "^1.0",
          "slim/twig-view": "^3.0",
          "php-di/slim-bridge": "^3.1",
          "symfony/yaml": "^5.2"
        },
        "autoload": {
           "psr-4": {
             "Google\\Cloud\\Samples\\AppEngine\\GettingStarted\\": "src"
           }
        }
      }
      
    2. Para instalar las dependencias y generar un archivo composer.lock, ejecuta el siguiente comando:

      composer install
      

      El archivo composer.lock ayuda a tu aplicación a obtener las mismas versiones de los paquetes que usas en varias compilaciones y entornos.

    Inicializar la aplicación y definir los controladores principales

    El archivo index.php inicializa la aplicación y reenvía todas las solicitudes a los controladores definidos en el archivo ./src/controllers.php.

    
    // Use the composer autoloader to load dependencies.
    require_once __DIR__ . '/vendor/autoload.php';
    
    //  Load the application code.
    /** @var Slim\App $app */
    $app = require __DIR__ . '/src/app.php';
    require __DIR__ . '/src/controllers.php';
    
    // Bootstrap the slim framework to handle the request.
    $app->run();
    

    Para obtener más información sobre la gestión de solicitudes, consulta los artículos sobre el inicio de aplicaciones y la gestión de solicitudes.

    Integración con los servicios de Google Cloud

    App Engine requiere que las aplicaciones se integren con sistemas externos para almacenar datos. La aplicación de ejemplo almacena datos de texto en Cloud SQL e imágenes en Cloud Storage.

    Consulta la página sobre cómo elegir una opción de almacenamiento para ver todas las opciones de almacenamiento de Google Cloud .

    Usar Cloud SQL

    En la aplicación de ejemplo, los usuarios publican libros en una página web. La aplicación usa una base de datos de Cloud SQL para almacenar los títulos, los autores, la fecha de publicación y las descripciones de los libros.

    Deberás crear una instancia de Cloud SQL antes de añadir contenido a la base de datos de la aplicación.

    Crear una instancia de Cloud SQL

    Usa la CLI de gcloud para crear una instancia de Cloud SQL:

    gcloud sql instances create INSTANCE_NAME --tier=MACHINE_TYPE --region=REGION

    Por ejemplo, si quieres llamar a tu instancia bookshelf y usar el tipo de máquina db-n1-standard-2 en la región central de Estados Unidos, haz lo siguiente:

    gcloud sql instances create bookshelf --tier=db-n1-standard-2 --region=us-central1

    Configurar el usuario raíz de MySQL

    Puedes usar la CLI de gcloud para definir la contraseña del usuario raíz de tu instancia de Cloud SQL:

    gcloud sql users set-password USER --host=HOST --instance=INSTANCE_NAME --password=PASSWORD

    Por ejemplo, si quieres definir la contraseña del usuario raíz de la instancia de Cloud SQL bookshelf como passw0rd!, haz lo siguiente:

    gcloud sql users set-password root --host=% --instance=bookshelf --password=passw0rd!

    Configurar una base de datos en la instancia de Cloud SQL

    Para almacenar los autores, los títulos, las fechas de publicación y las descripciones de los libros, crea una base de datos MySQL:

    gcloud sql databases create DATABASE_NAME --instance=INSTANCE_NAME

    Por ejemplo, si quieres crear una base de datos llamada book-data en la instancia de Cloud SQL bookshelf, haz lo siguiente:

    gcloud sql databases create book-data --instance=bookshelf

    Conectarse a una base de datos de Cloud SQL

    La aplicación de ejemplo usa PDO de PHP para interactuar con la base de datos MySQL.

    // Fill the variables below to match your Cloud SQL configuration.
    // $dbConn = 'YOUR_CLOUDSQL_CONNECTION_NAME';
    // $dbName = 'YOUR_CLOUDSQL_DATABASE_NAME';
    // $dbUser = 'YOUR_CLOUDSQL_USER';
    // $dbPass = 'YOUR_CLOUDSQL_PASSWORD';
    $dsn = "mysql:unix_socket=/cloudsql/{$dbConn};dbname={$dbName}";
    $pdo = new PDO($dsn, $dbUser, $dbPass);

    En este tutorial, estos parámetros se especifican como variables de entorno más abajo, en la sección Configurar la aplicación.

    Consultar una sola fila

    Cuando el usuario hace clic en un libro, la aplicación consulta la base de datos y devuelve una sola fila que incluye el título, el autor, la fecha de publicación y la descripción del libro.

    $statement = $pdo->prepare('SELECT * FROM books WHERE id = :id');
    $statement->bindValue('id', $id, PDO::PARAM_INT);
    $statement->execute();
    $result = $statement->fetch(PDO::FETCH_ASSOC);

    Usar Cloud Storage

    La aplicación de ejemplo usa Cloud Storage para almacenar las imágenes, que son archivos binarios, subidas por los usuarios.

    Crear un segmento de Cloud Storage

    Cloud Storage usa segmentos para organizar y controlar el acceso a tus datos.

    Usa la CLI de gcloud para crear un segmento de Cloud Storage:

    gcloud storage buckets create gs://BUCKET_NAME/ --location=BUCKET_REGION

    Por ejemplo, si quiere crear un segmento llamado picture-storage en la región us-central1, haga lo siguiente:

    gcloud storage buckets create gs://picture-storage/ --location=us-central1
    • Si la operación se realiza correctamente, verás el siguiente resultado:

      Creating gs://BUCKET_NAME/
    • Si no se completa correctamente, puede que veas el siguiente resultado:

      ServiceException: 409 Bucket BUCKET_NAME already exists

      En este caso, vuelve a intentar este paso con un nombre de segmento diferente.

    Conectar un proyecto a un segmento de Cloud Storage

    Para usar Cloud Storage, debes especificar la biblioteca de Cloud Storage.

    use Google\Cloud\Storage\StorageClient;
    

    Almacenar imágenes

    Ahora que has creado un segmento de Cloud Storage y has configurado una conexión, puedes almacenar imágenes. Las imágenes se pueden subir con listas de control de acceso (LCA) predefinidas para controlar el acceso a ellas.

    En esta aplicación de ejemplo, las imágenes subidas tendrán la LCA predefinida public-read. Se puede acceder a la URL pública a través de la propiedad mediaLink de tu objeto de Cloud Storage. Puede usar esta URL en una etiqueta de imagen HTML.

    // Set your own image file path and content type below to upload an
    // image to Cloud Storage.
    // $imageStream = fopen('/path/to/your_image.jpg', 'r');
    // $imageContentType = 'image/jpg';
    $object = $bucket->upload($imageStream, [
        'metadata' => ['contentType' => $imageContentType],
        'predefinedAcl' => 'publicRead',
    ]);
    $imageUrl = $object->info()['mediaLink'];

    Para obtener instrucciones sobre cómo leer un objeto privado de Cloud Storage, consulta la página Descargar objetos.

    Eliminando imágenes

    Cuando un usuario elimina un libro de la aplicación, este código quita la imagen del contenedor de Cloud Storage.

    $object = $bucket->object($objectName);
    $object->delete();

    Configurar la aplicación

    Para configurar las aplicaciones para que se ejecuten en App Engine, se usa un archivo app.yaml, que especifica el entorno de ejecución, las variables de entorno y otros ajustes de la aplicación.

    En el caso de una aplicación con requisitos de configuración mínimos, el archivo app.yaml puede ser una sola línea:

    PHP 8.1

    runtime: php81
    

    PHP 7.4

    runtime: php74
    

    Puede añadir más opciones de configuración y variables de entorno específicas de la aplicación al archivo de configuración app.yaml.

    Añadir variables de entorno

    En el archivo app.yaml se proporciona la configuración del entorno a la aplicación. El ejemplo de estantería que se usa en esta guía necesita que se le proporcione la configuración como variables de entorno para saber cómo conectarse a la instancia de Cloud SQL y al segmento de Cloud Storage correctos.

    Para desplegar tu aplicación, debes editar el archivo de configuración app.yaml:

    # See https://cloud.google.com/appengine/docs/standard/php/config/appref for a
    # complete list of `app.yaml` directives.
    
    runtime: php84
    
    env_variables:
        GOOGLE_STORAGE_BUCKET: ""
        # populate these to use the "mysql" or "postres" backends
        CLOUDSQL_CONNECTION_NAME: ""
        CLOUDSQL_USER: ""
        CLOUDSQL_PASSWORD: ""
        ## Uncomment to give your database a name other than "bookshelf"
        # CLOUDSQL_DATABASE_NAME: ""
    
    1. Asigna a la variable GOOGLE_STORAGE_BUCKET el nombre de tu segmento de Cloud Storage.

    2. Asigna el valor app-name:region:instance-name a la variable CLOUDSQL_CONNECTION_NAME. Para obtener los detalles necesarios, usa el siguiente comando gcloud:

      gcloud sql instances describe INSTANCE

      En el caso de una instancia de Cloud SQL de segunda generación, el CLOUDSQL_CONNECTION_NAME tendrá el siguiente formato: your_project_name:your_region:your_instance

    3. Descomenta y define la variable CLOUD_SQL_DATABASE_NAME si la base de datos que has creado tiene un nombre distinto de bookshelf. En este ejemplo, la base de datos se ha creado con el nombre book-data.

    4. Revisa el archivo app.yaml, que debería tener un aspecto similar a este:

    PHP 8.1

    runtime: php81
    
    env_variables:
      GOOGLE_STORAGE_BUCKET: picture-storage
      CLOUDSQL_CONNECTION_NAME: sample-application:us-central1:bookshelf
      CLOUDSQL_USER: root
      CLOUDSQL_PASSWORD: passw0rd!
      CLOUDSQL_DATABASE_NAME: book-data
    

    PHP 7.4

    runtime: php74
    
    env_variables:
      GOOGLE_STORAGE_BUCKET: picture-storage
      CLOUDSQL_CONNECTION_NAME: sample-application:us-central1:bookshelf
      CLOUDSQL_USER: root
      CLOUDSQL_PASSWORD: passw0rd!
      CLOUDSQL_DATABASE_NAME: book-data
    

    Implementar la aplicación

    1. Para desplegar la aplicación, ve al directorio getting-started y ejecuta el siguiente comando:

      gcloud app deploy
    2. Cuando aparezca la petición de ubicación, elige una ubicación cercana a los usuarios de tu aplicación. App Engine funciona por regiones, es decir, la infraestructura que ejecuta tu aplicación está ubicada en una zona geográfica concreta. Por ejemplo, en este tutorial se ha usado la región us-central1 para desplegar los recursos de almacenamiento. Implementa la aplicación en la misma región para reducir la latencia y mejorar el rendimiento.

      Por lo general, es recomendable elegir una ubicación cercana a tus usuarios, pero hay casos en los que se recomienda desplegar tu aplicación cerca de donde se encuentran sus recursos. Consulta las ubicaciones de App Engine y las ubicaciones de recursos disponibles.

    3. Ver la aplicación:

      gcloud app browse

    Eliminar los recursos utilizados

    Elimina tu proyecto de Google Cloud para detener la facturación de los recursos utilizados en él.

    Para eliminar el proyecto, usa el siguiente comando:

    gcloud projects delete PROJECT_ID

    Para verificar que el proyecto se ha eliminado, enumera tus proyectos:

    gcloud projects list

    Siguientes pasos