Acceder a servicios agrupados antiguos en PHP

En esta página se describe cómo instalar y usar los servicios incluidos con el entorno de ejecución de PHP para el entorno estándar de App Engine. Tu aplicación puede acceder a los servicios agrupados a través del SDK de servicios de App Engine para PHP.

Antes de empezar

  1. Consulta la lista de APIs de servicios antiguos agrupados a las que puedes llamar en el tiempo de ejecución de PHP.

  2. Actualiza el archivo app.yaml para incluir la siguiente línea:

    app_engine_apis: true
    
  3. Para probar tu aplicación PHP, debes desplegarla con gcloud app deploy.

Instalar el SDK de PHP para App Engine

Puedes encontrar el SDK de PHP App Engine en GitHub en appengine-php-sdk. Debes usar la versión 2.1 o una posterior para PHP 8.1 y la versión 2.0.1 o una posterior para PHP 7.x.

Hay dos formas de incorporar el SDK a tu proyecto:

  1. Ejecuta el comando Packagist para añadir el SDK al archivo composer.json:

    composer require google/appengine-php-sdk
    
  2. Crea manualmente un archivo composer.json con los siguientes detalles:

    PHP 7/8

    {
        "require": {
            "google/appengine-php-sdk": "^2.1" // Or any later version
        }
    }
    

En PHP, las APIs de App Engine requieren que se especifiquen las dependencias de forma explícita. Consulta este documento para obtener instrucciones sobre cómo incluir autoload.php.

Importar las bibliotecas

Usa el operador use para importar la clase que necesites de la lista de APIs disponibles. Por ejemplo, Google\AppEngine\Api\AppIdentity\ClassName se puede importar con la siguiente instrucción:

use Google\AppEngine\Api\AppIdentity\ClassName;

Consideraciones sobre la migración

Identidad de la aplicación

No es necesario que cambie la configuración de su aplicación al actualizar a PHP. El comportamiento, las funciones y las instrucciones de configuración de la API App Identity no cambian. Consulte la descripción general de la API Identity y la guía de referencia de la API App Identity para obtener más información.

Correo

La API Mail de PHP sigue siendo prácticamente igual que la API Mail de PHP 5, con algunas pequeñas diferencias en cuanto a cómo habilitar e inhabilitar los servicios de correo. En las siguientes secciones se explican las diferencias entre ambos tiempos de ejecución.

Clase de mensaje

En PHP, la clase Message funciona igual que en PHP 5.5, excepto que se han actualizado las importaciones de use. Las diferencias son las siguientes:

PHP 5.5

use google\appengine\api\mail\Message;

PHP 7/8

use Google\AppEngine\Api\Mail\Message;

Si no puedes cambiar las instrucciones de importación, la instrucción de importación original de PHP 5.5 también funcionará en PHP.

Función de correo

En PHP 5.5, la función nativa de PHP mail() se sobrecargó con la función Mail de App Engine.

En PHP, la función de correo de App Engine ya no está sobrecargada de forma predeterminada y debe habilitarse explícitamente. Este nuevo comportamiento te permite reutilizar la función de correo para adaptarla mejor a tus necesidades. Este cambio también te permite ver qué implementación se está usando en cada momento para todas las llamadas de función de Mail.

Si prefiere usar la función nativa de PHP mail() para enviar correos mediante la API Mail de App Engine, puede habilitarla en su archivo php.ini de la siguiente manera:

extension = mailparse.so
sendmail_path = "php ./vendor/google/appengine-php-sdk/src/Runtime/SendMail.php -t -i"

Como se muestra en el ejemplo anterior, añade la extensión mailparse para habilitar la función de correo nativa de PHP y define la configuración de tiempo de ejecución sendmail_path en la implementación de la función de correo de App Engine. Después de habilitar esta opción, todas las llamadas a mail() funcionarán exactamente igual que en PHP 5.5.

Consulta las guías Enviar correo y Recibir correo, así como la guía de referencia de la API Mail para obtener más información.

Memcache

Para usar Memcache en PHP, debes añadir una declaración explícita de las bibliotecas de Memcache. Antes, Memcache para PHP 5.5 no requería una declaración explícita. Esta declaración explícita permite cambiar entre Memcache de PHP nativo y Memcache de App Engine.

Las clases Memcache de PHP tienen el mismo comportamiento que las clases Memcache de PHP 5, excepto en la declaración explícita. Consulta la descripción general de Memcache para obtener más información.

PHP 5.5

Ejemplo de Memcache para PHP 5.5:

$memcache = new Memcache();
return $memcache->get($key);

Ejemplo de Memcached para PHP 5.5:

$memcache = new Memcached();
$memcache->set('who', $request->get('who'));
return $twig->render('memcache.html.twig', [
    'who' => $request->get('who'),
    'count' => $memcache->increment('count', 1, 0),
    'host' => $request->getHost(),
]);

PHP 7/8

Ejemplo de la API Memcache para PHP:

use Google\AppEngine\Api\Memcache\Memcache;

$memcache = new Memcache();
return $memcache->get($key);

Ejemplo de la API Memcached para PHP:

use Google\AppEngine\Api\Memcache\Memcached;

$memcache = new Memcached();
$memcache->set('who', $request->get('who'));
return $twig->render('memcache.html.twig', [
    'who' => $request->get('who'),
    'count' => $memcache->increment('count', 1, 0),
    'host' => $request->getHost(),
]);

Si prefieres usar el comportamiento original de Memcache para PHP 5 en PHP, puedes seguir llamando a Memcache de forma implícita incluyendo algunas líneas más en tu archivo composer.json. Después de importar el paquete appengine-php-sdk desde Composer, añada la siguiente ruta de archivo de aceptación al elemento files de la sección autoload:

PHP 7/8

{
  "require": {
    "google/appengine-php-sdk": "^2.1" // Or any later version
  },
  "autoload": {
    "files": [
    "./vendor/google/appengine-php-sdk/src/Api/Memcache/MemcacheOptIn.php"
    ]
  }
}

Módulos

No es necesario que cambie la configuración de su aplicación al actualizar a PHP. El comportamiento, las funciones y las instrucciones de configuración de la API Modules no han cambiado. Consulte la descripción general de los módulos y la guía de referencia de la API Modules para obtener más información.

Sesión

Las sesiones de PHP funcionan igual que las sesiones de PHP 5.5. Sin embargo, las instrucciones de configuración son diferentes porque las sesiones de PHP 5.5 usaban la clase MemcacheSessionHandler de forma predeterminada.

Para usar Sessions for PHP, debes registrar la clase MemcacheSessionHandler con session_set_save_handler() y configurar session.save_path en Memcache. También debes habilitar Memcache al acceder a la información de Memcache.

Por ejemplo:

PHP 7/8

ini_set('session.save_path', 'Google\AppEngine\Api\Memcache\Memcache');
session_set_save_handler(new Google\AppEngine\Ext\Session\MemcacheSessionHandler(), true);

Consulta la guía de referencia de la API Session para obtener más información.

Cola de tareas

No es necesario que cambie la configuración de su aplicación al actualizar a PHP. El comportamiento, las funciones y las instrucciones de configuración de Task Queue no cambian. Para obtener más información, consulta la sección Sesiones de la guía Descripción general de la cola de tareas y la guía de referencia de la API Task Queue.

Obtención de URL

Para usar URL Fetch en PHP, debes añadir una declaración explícita de las bibliotecas de URL Fetch. Antes, el servicio de obtención de URLs para PHP 5 no requería una declaración explícita y se usaba de forma implícita.

En PHP 5, el servicio de obtención de URLs de App Engine era la única forma de obtener contenido de Internet en PHP 5.5, por lo que la mayoría de las funciones de PHP 5.5 que accedían a Internet se parchearon para usar UrlFetch automáticamente.

En PHP, la red PHP nativa puede acceder a Internet, por lo que no se realiza este parche automático. En algunos casos, puedes usar el mecanismo UrlFetch original, en concreto el que proporciona el encabezado de solicitud X-Appengine-Inbound-Appid para identificar la aplicación de App Engine que está haciendo una solicitud a tu aplicación de App Engine.

Para habilitar URL Fetch para PHP, puede usar una declaración explícita en el envoltorio de flujo o usar la clase UrlFetch directamente, como se describe en las secciones siguientes.

Opción 1a. Gestores de flujo

Puedes habilitar el servicio de obtención de URLs de App Engine para hacer solicitudes HTTP a los controladores de flujo PHP http:// y https://. Para hacer esto:

  1. Anula el registro del controlador de flujo PHP nativo para HTTP(S) mediante stream_wrapper_unregister().
  2. Registra HTTP(S) en la clase UrlFetchStream mediante stream_wrapper_register().
  3. Llama a file_get_contents() con la configuración que quieras usar en el envoltorio de flujo.

Para comparar, consulta los ejemplos equivalentes de PHP 5 y PHP:

PHP 5.5

...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

// Using Url Fetch service. No option to use the native php stream wrapper.
$result = file_get_contents('http://example.com', false, $context);
echo $result;

PHP 7/8

use google\appengine\api\urlfetch\UrlFetchStream;
...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

// Using the native php stream wrapper.
$result = file_get_contents('http://example.com', false, $context);
echo $result;

stream_wrapper_unregister("http");
stream_wrapper_register("http", "UrlFetchStream");

// Now using the Url Fetch service.
$result = file_get_contents('http://example.com', false, $context);
echo $result;

stream_wrapper_unregister("http");
stream_wrapper_restore("http");

// Now using the native php stream wrapper again.

Opción 1b. Encabezados de respuesta HTTP con controladores de flujo

Las instrucciones para usar encabezados de respuesta HTTP(S) con controladores de flujo son similares a las instrucciones para usar controladores de flujo:

  1. Anula el registro del controlador de flujo PHP nativo para HTTP(S) mediante stream_wrapper_unregister().
  2. Registra HTTP(S) en la clase UrlFetchStream mediante stream_wrapper_register().
  3. Usa fopen() en lugar de file_get_contents() con la configuración que quieras.
  4. Llama a stream_get_meta_data() y extrae la información del encabezado de respuesta indexando los metadatos de 'wrapper_data. Los encabezados de respuesta se devuelven en forma de matriz, de forma similar a $http_response_header en PHP 5.5.

PHP 5.5

...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

// Using file_get_contents and the Url Fetch service.
$result = file_get_contents('http://example.com', false, $context);

// Print Http Response Headers
print_r($http_response_header);

PHP 7/8

use google\appengine\api\urlfetch\UrlFetchStream;
...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

stream_wrapper_unregister("http");
stream_wrapper_register("http", "UrlFetchStream");

// Now using fopen and the Url Fetch service.
$result = fopen('http://example.com', 'r', false, $context);

// Print Http Response Headers
$meta_data = stream_get_meta_data($result);
$headers = $meta_data['wrapper_data'];
print_r($headers);

stream_wrapper_unregister("http");
stream_wrapper_restore("http");

Opción 2. Clase UrlFetch

La clase UrlFetch es una clase personalizada que proporciona una forma más específica de usar el servicio de obtención de URLs para una solicitud HTTP(S) en un ámbito más reducido. A diferencia de la opción de controlador de flujo, la clase UrlFetch no anula todas las solicitudes HTTP(S) realizadas desde funciones compatibles con el envoltorio de flujo para usar el servicio de obtención de URLs. En comparación con la opción de controlador de flujo, la configuración de la clase UrlFetch también es más sencilla, ya que no requiere el uso de varias APIs de PHP, como las siguientes:

  • stream_context_create()
  • stream_wrapper_unregister()
  • stream_wrapper_register()
  • file_get_contents()

El siguiente ejemplo de clase UrlFetch es equivalente al ejemplo de controlador de flujo:

PHP 7/8

use google\appengine\api\urlfetch\UrlFetch;
...
$urlfetch = new UrlFetch();
$result = $urlfetch->fetch($url, 'POST', $headers, http_build_query($data));
echo $result->getContent();

Usuarios

No es necesario que cambie la configuración de su aplicación al actualizar a PHP. El comportamiento, las funciones y las instrucciones de configuración de la API Users siguen siendo los mismos. Consulte la guía de la API Users y la referencia de la API Users para obtener más información.

Bibliotecas aportadas por la comunidad

Puedes usar la API aportada por la comunidad para datastore al actualizar a PHP.

Otras cuestiones:

  • Para probar la función de servicios empaquetados antiguos en tu aplicación PHP, puedes usar el servidor de desarrollo local. Al ejecutar el comando dev_appserver.py, asigna al argumento --php_executable_path un archivo ejecutable de PHP. Ten en cuenta que es diferente de PHP 5, que requiere un ejecutable php-cgi.

    Si el proyecto tiene un archivo composer.json, asigna a --php-composer-path la ruta del archivo composer.phar.

  • Para desplegar tu aplicación, usa el comando gcloud app deploy.

  • El registro en el entorno de ejecución de PHP sigue el estándar de registro de Cloud Logging. En el tiempo de ejecución de PHP, los registros de la aplicación ya no se incluyen en los registros de solicitudes, sino que se separan en registros diferentes. Para obtener más información sobre cómo leer y escribir registros, consulta la guía para escribir y ver registros.

Ejemplos

Para ver ejemplos de cómo usar los servicios antiguos agrupados con PHP, descarga los códigos de ejemplo.