Compila una app con PHP 7/8

ID de región

REGION_ID es un código abreviado que Google asigna en función de la región que eliges cuando creas la app. El código no corresponde a un país ni a una provincia, aunque algunos ID de región puedan parecer similares a los códigos de país y provincia que se suelen usar. En el caso de las apps creadas después de febrero de 2020, REGION_ID.r se incluye en las URL de App Engine. En el caso de las apps existentes creadas antes de esta fecha, el ID de región es opcional en la URL.

Obtén más información acerca de los ID de región.

Aprende a compilar una app en App Engine mediante la versión 7.4 o 8.1 de PHP. La app de muestra 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 app almacena los datos de texto en una base de datos de Cloud SQL y las imágenes en un bucket de Cloud Storage.

Estructura de la guía

  1. Crea un proyecto de Google Cloud mediante Google Cloud CLI

  2. Descarga la app de muestra

  3. Especifica dependencias con composer.json

  4. Inicializa la app y define los controladores frontales

  5. Integra los servicios de Google Cloud

  6. Configura la app para App Engine

  7. Implementa la app

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita Cloud Build API.

    Habilita la API

  5. Instala Google Cloud CLI.
  6. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  7. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  8. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  9. Habilita Cloud Build API.

    Habilita la API

  10. Instala Google Cloud CLI.
  11. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  12. Instala Composer, la herramienta de administración de dependencias de PHP. Debes instalar Composer de forma global en sistemas Linux y Mac SO X.

Descarga la app de muestra.

  1. Explora el código en GitHub.

  2. Descarga o clona la app.

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

    O descarga la muestra como un archivo ZIP y extráelo.

  3. Navega al directorio getting-started.

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

Especifica dependencias con composer.json

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

  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 tus dependencias y producir un archivo composer.lock, ejecuta el siguiente comando:

    composer install
    

    El archivo composer.lock ayuda a la app a recuperar las mismas versiones de los paquetes que usas en varias compilaciones y entornos.

Inicializa la aplicación y define los controladores frontales

El archivo index.php inicializa la app 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 el manejo de solicitudes, lee acerca del inicio de la aplicación y el manejo de solicitudes.

Integra los servicios de Google Cloud

App Engine requiere que las aplicaciones se integren en sistemas externos para el almacenamiento de datos. La app de muestra almacena datos textuales en Cloud SQL y, también, imágenes en Cloud Storage.

Consulta la página Elige una opción de almacenamiento para ver todas las opciones de almacenamiento de Google Cloud.

Usa Cloud SQL

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

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

Crea 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 deseas asignar el nombre bookshelf a la instancia y usar el tipo de máquina db-n1-standard-2 en la región central de Estados Unidos, ejecuta el siguiente comando:

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

Configura el usuario raíz de MySQL

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

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

Por ejemplo, si deseas establecer la contraseña del usuario raíz para la instancia de Cloud SQL bookshelf en passw0rd!, usa este comando:

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

Configura una base de datos en la instancia de Cloud SQL

Para almacenar los autores, los títulos, la fecha de publicación y las descripciones de los libros, crea una base de datos de MySQL. Para ello, sigue estas instrucciones:

gcloud sql databases create DATABASE_NAME --instance=INSTANCE_NAME

Por ejemplo, si deseas crear una base de datos llamada book-data en la instancia de Cloud SQL bookshelf, usa este comando:

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

Conéctate a la base de datos de Cloud SQL

La app de muestra usa el PDO de PHP para interactuar con la base de datos de 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);

Para este instructivo, estos parámetros se especifican como variables de entorno a continuación en Configura la aplicación.

Consulta una sola fila

Cuando el usuario hace clic en un libro, la aplicación consulta la base de datos y muestra una fila única 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);

Usa Cloud Storage

La app de muestra usa Cloud Storage para almacenar las imágenes subidas por los usuarios, que son archivos binarios.

Crea un bucket de Cloud Storage

Cloud Storage usa depósitos para organizar y controlar el acceso a los datos.

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

gsutil mb -l BUCKET_REGION gs://BUCKET_NAME/

Por ejemplo, si deseas crear un bucket llamado picture-storage en la región us-central1, usa este comando:

gsutil mb -l us-central1 gs://picture-storage/
  • Si el comando se ejecutó con éxito, verás este resultado:

    Creating gs://BUCKET_NAME/
  • De lo contrario, es posible que veas este resultado:

    ServiceException: 409 Bucket BUCKET_NAME already exists

    Vuelve a intentarlo con otro nombre de bucket.

Conecta un proyecto a un bucket de Cloud Storage

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

use Google\Cloud\Storage\StorageClient;

Almacena imágenes

Ahora que creaste un bucket de Cloud Storage y configuraste 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 las imágenes.

En esta app de muestra, las imágenes subidas tendrán la LCA public-read predefinida. Se puede acceder a la URL pública a través de la propiedad mediaLink del objeto de Cloud Storage. Puedes 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 Descarga objetos.

Borra imágenes

Cuando un usuario borra un libro de la app, este código quita la imagen del bucket de Cloud Storage.

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

Configura la app

Las aplicaciones se configuran para ejecutarse en App Engine con un archivo app.yaml, en el cual se especifica el entorno de ejecución de la app, las variables de entorno y otra configuración.

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

PHP 8.1

runtime: php81

PHP 7.4

runtime: php74

Puedes agregar más opciones de configuración y variables de entorno específicas de la aplicación al archivo de configuración app.yaml.

Agrega variables de entorno

El archivo app.yaml es en el que se proporciona la configuración del entorno a la app. El ejemplo de bookshelf que se usa en esta guía necesita que se proporcione una configuración en forma de variables de entorno para saber cómo conectarse a la instancia de Cloud SQL y al bucket de Cloud Storage correctos.

Para implementar la app, 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: php81

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. Establece la variable GOOGLE_STORAGE_BUCKET como el nombre de tu bucket de Cloud Storage.

  2. Configura la variable CLOUDSQL_CONNECTION_NAME como app-name:region:instance-name. Puedes recuperar los detalles necesarios mediante el siguiente comando de gcloud:

    gcloud sql instances describe INSTANCE

    Para 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. Quita los comentarios y establece la variable CLOUD_SQL_DATABASE_NAME si la base de datos que creaste tiene un nombre que no sea bookshelf. En este ejemplo, la base de datos se creó con el nombre book-data.

  4. Revisa el archivo app.yaml, que debería ser similar a lo siguiente:

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

Implementa la aplicación

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

    gcloud app deploy
  2. Cuando aparezca el indicador de ubicación, elige una ubicación cercana a los usuarios de la app. App Engine es regional, lo que significa que la infraestructura que ejecuta tu app se encuentra en un área geográfica específica. Por ejemplo, en este instructivo, se usó la región us-central1 para implementar sus recursos de almacenamiento. Implementa la aplicación en la misma región para disminuir la latencia y mejorar el rendimiento.

    Por lo general, elegir una ubicación cercana a tus usuarios es una buena idea, pero hay casos en los que se recomienda implementar la aplicación cerca de sus recursos. Lee acerca de las ubicaciones de App Engine y las ubicaciones de recursos disponibles.

  3. Ve la aplicación:

    gcloud app browse

Realiza una limpieza

Borra el proyecto de Google Cloud para detener la facturación de los recursos que se usan en el proyecto.

Para borrar tu proyecto, usa el siguiente comando:

gcloud projects delete PROJECT_ID

Para verificar que se borró el proyecto, visualiza una lista de proyectos:

gcloud projects list

Pasos siguientes