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
Consulta la lista de APIs de servicios antiguos agrupados a las que puedes llamar en el tiempo de ejecución de PHP.
Actualiza el archivo
app.yaml
para incluir la siguiente línea:app_engine_apis: true
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:
Ejecuta el comando Packagist para añadir el SDK al archivo
composer.json
:composer require google/appengine-php-sdk
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:
- Anula el registro del controlador de flujo PHP nativo para HTTP(S) mediante
stream_wrapper_unregister()
. - Registra HTTP(S) en la clase
UrlFetchStream
mediantestream_wrapper_register()
. - Llama a
file_get_contents()
con la configuración que quieras usar en el envoltorio de flujo.- Si quieres volver al controlador de flujo de PHP nativo desde el servicio URL
Fetch, usa
stream_wrapper_unregister()
y, a continuación, regístrate constream_wrapper_restore()
.
- Si quieres volver al controlador de flujo de PHP nativo desde el servicio URL
Fetch, usa
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:
- Anula el registro del controlador de flujo PHP nativo para HTTP(S) mediante
stream_wrapper_unregister()
. - Registra HTTP(S) en la clase
UrlFetchStream
mediantestream_wrapper_register()
. - Usa
fopen()
en lugar defile_get_contents()
con la configuración que quieras. - 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 archivocomposer.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.