Con App Engine, puedes crear aplicaciones web con el lenguaje de programación PHP. Tu aplicación PHP se ejecuta en la infraestructura escalable de Google y usa servicios y almacenamiento persistente a gran escala.
Seleccionar el entorno de ejecución de PHP
App Engine ejecuta tu aplicación web PHP con un intérprete de PHP versión 5.5.34. Nota: En Linux, también debes instalar PHP de forma local para ejecutar tus aplicaciones PHP.
Para configurar tu aplicación de forma que use el tiempo de ejecución de PHP, añade lo siguiente al archivo app.yaml
:
runtime: php55
api_version: 1
...
El primer elemento, runtime
, selecciona el entorno de ejecución de PHP.
El segundo elemento, api_version
, selecciona la versión del entorno de ejecución de PHP que se va a usar. En el momento de escribir este artículo, App Engine solo tiene una versión del entorno de PHP, 1
. Si hay cambios futuros que no sean compatibles con versiones anteriores, el equipo de App Engine usará un nuevo identificador de versión. Tu aplicación seguirá usando la versión seleccionada hasta que cambies el ajuste api_version
y subas la aplicación.
Para obtener más información sobre el archivo app.yaml
y cómo desplegar tu aplicación en App Engine, consulta los temas app.yaml
Reference y Deploying a PHP App.
El entorno aislado
Para permitir que App Engine distribuya las solicitudes de las aplicaciones en varios servidores web y para evitar que una aplicación interfiera con otra, la aplicación se ejecuta en un entorno de "zona de pruebas" restringido. En este entorno, la aplicación puede ejecutar código, usar los servicios de correo, de obtención de URLs y de usuarios de App Engine, así como examinar la solicitud web del usuario y preparar la respuesta.
Una aplicación App Engine no puede:
escribir en un sistema de archivos. Las aplicaciones PHP pueden usar Google Cloud Storage para almacenar archivos persistentes. Se permite la lectura del sistema de archivos y todos los archivos de la aplicación que se hayan subido con ella están disponibles.
Responde lentamente. Una solicitud web a una aplicación debe gestionarse en unos segundos. Los procesos que tardan mucho en responder se terminan para evitar que se sobrecargue el servidor web.
realizar otro tipo de llamadas al sistema.
Carga automática de clases
Las clases de la biblioteca estándar de PHP (SPL) y las clases que forman parte del SDK de App Engine se cargan automáticamente cuando es necesario. Esto significa que no tienes que usar las instrucciones include
ni require
en la parte superior de tus secuencias de comandos PHP.
De forma predeterminada, la carga automática de clases solo se producirá en las clases definidas en archivos que se encuentren en el directorio raíz del SDK de App Engine (y, si se ha especificado mediante --php_executable_path
, en tu instalación local de PHP).
Para añadir más rutas en las que buscar la carga automática de clases, usa set_include_path
en tu secuencia de comandos PHP.
set_include_path('my_additional_path' . PATH_SEPARATOR . get_include_path());
Extensiones habilitadas
Se han habilitado las siguientes extensiones en el entorno de ejecución de PHP para App Engine:
- apc
- bcmath
- calendar
- Core
- ctype
- fecha
- dom
- ereg
- exif
- filtrar
- ftp
- gd
- hash
- iconv
- json
- libxml
- mailparse
- mbstring
- mcrypt
- memcache
- memcached
- mysql
- mysqli
- mysqlnd
- OAuth
- openssl
- pcre
- PDO
- pdo_mysql
- Reflexión
- sesión
- shmop
- SimpleXML
- jabón
- Sockets (para aplicaciones con facturación habilitada)
- SPL
- estándar
- Tokenizador
- xml
- xmlreader
- xmlwriter
- xsl
- código postal
- zlib
Extensiones cargables dinámicamente
Las siguientes extensiones se pueden cargar de forma dinámica configurando php.ini
.
- cURL esta extensión usa el servicio de sockets para hacer solicitudes y está sujeta a las cuotas y restricciones de ese servicio. Consulta Solicitudes salientes para obtener más información.
- MongoDB esta extensión permite a los desarrolladores conectarse a una instancia de MongoDB. Usa el servicio de socket para hacer solicitudes y está sujeto a la cuota y las restricciones de ese servicio.
- ImageMagick
- intl
- fileinfo
Para habilitar estas extensiones, añada directivas para ellas en el archivo php.ini
, en extension
, de la siguiente manera:
extension = "curl.so"
extension = "mongo.so"
extension = "imagick.so"
extension = "intl.so"
extension = "fileinfo.so"
Sesiones
La mayoría de las aplicaciones web necesitan una forma de conservar la información de estado de los usuarios entre solicitudes. PHP proporciona una capa de gestión de sesiones cómoda. Las sesiones de App Engine funcionan de forma muy similar a las sesiones de cualquier otra aplicación PHP.
Para definir una variable en la sesión de un usuario, sigue estos pasos:
session_start();
$_SESSION['Foo'] = 'Bar';
En una solicitud posterior del mismo usuario:
session_start();
print $_SESSION['Foo']; // prints Bar
De forma predeterminada, el tiempo de ejecución de App Engine usará memcache para almacenar información de la sesión mediante la clase MemcacheSessionHandler
. Puedes ajustar este comportamiento especificando tu propio controlador de sesiones con el método session_set_save_handler()
de PHP. Memcache permite guardar y recuperar datos de sesión rápidamente, lo que significa que la sobrecarga de tu solicitud es mínima. Sin embargo, los datos de la caché de App Engine se pueden borrar periódicamente, lo que significa que se perderá cualquier información de la sesión. Para sesiones de mayor duración, es preferible usar un servicio de almacenamiento alternativo, como Cloud SQL.
Claves especiales de $_SERVER
PHP pone a disposición del ámbito de la solicitud el array especial $_SERVER[]
. Además de los parámetros CGI estándar, App Engine añade algunas claves útiles adicionales.
APPLICATION_ID
: el ID de la aplicación que se definió cuando se creó la aplicación. Por ejemplo, my-wordpress.AUTH_DOMAIN
: el dominio que se usa para autenticar a los usuarios con la API Users. Las aplicaciones alojadas en appspot.com tienen un AUTH_DOMAIN de gmail.com y aceptan cualquier cuenta de Google. Las aplicaciones alojadas en un dominio personalizado que usa Google Workspace tienen un AUTH_DOMAIN igual al dominio personalizadoCURRENT_VERSION_ID
: la versión principal y secundaria de la aplicación que se está ejecutando, con el formato "X.Y". El número de versión principal ("X") se especifica en el archivo app.yaml de la aplicación. El número de versión secundaria ("Y") se asigna automáticamente cuando se sube cada versión de la aplicación a App Engine. En el servidor web de desarrollo, la versión secundaria siempre es "1".DEFAULT_VERSION_HOSTNAME
: nombre de host de la versión predeterminada de esta aplicación (por ejemplo, my-php-app.uc.r.appspot.com).HTTP_X_APPENGINE_CITY
: nombre de la ciudad desde la que se ha originado la solicitud. Por ejemplo, una solicitud de la ciudad de Mountain View podría tener el valor de encabezado mountain view.HTTP_X_APPENGINE_CITYLATLONG
: latitud y longitud de la ciudad desde la que se ha enviado la solicitud. Esta cadena podría ser "37.386051,-122.083851" en el caso de una solicitud de Mountain View.HTTP_X_APPENGINE_COUNTRY
: país desde el que se ha enviado la solicitud, en formato de código de país ISO 3166-1 alfa-2. App Engine determina este código a partir de la dirección IP del cliente.HTTP_X_APPENGINE_REGION
: nombre de la región desde la que se ha originado la solicitud. Este valor solo tiene sentido en el contexto del país indicado enX-Appengine-Country
. Por ejemplo, si el país es "US" y la región es "ca", "ca" significa "California", no Canadá.USER_EMAIL
: devuelve la dirección de correo del usuario si se ha autenticado mediante la API Users. Las aplicaciones deben utilizar nickname para los nombres de visualización.USER_ID
: si la dirección de correo está asociada a una cuenta de Google, user_id devuelve el ID permanente único del usuario, que es una cadena. Si se ha autenticado mediante la API Users. Este ID es siempre el mismo para el usuario, independientemente de si cambia su dirección de correo electrónico.USER_IS_ADMIN
: 1 si el usuario que ha iniciado sesión también es administrador de la aplicación y se ha autenticado mediante la API Users. 0 en caso contrario.USER_NICKNAME
: en el caso de los usuarios de cuentas de Google, el alias es la parte del nombre de la dirección de correo del usuario si la dirección está en el mismo dominio que la aplicación. De lo contrario, es la dirección de correo completa del usuario.USER_ORGANIZATION
: una aplicación que use el ajuste Cuentas de Google puede determinar si el usuario que ha iniciado sesión está usando una cuenta de Google personal o una cuenta gestionada por un dominio de Google Workspace.
Se ha actualizado el comportamiento de PHP_SELF
y SCRIPT_NAME
en la versión 1.9.0
La implementación de $_SERVER['SCRIPT_NAME']
y $_SERVER['PHP_SELF'
] en versiones anteriores a la 1.9.0 difiere significativamente de la versión 1.9.0 y posteriores. Los cambios se han realizado para que sean coherentes con la implementación de Apache que suelen esperar las aplicaciones PHP.
En los siguientes ejemplos se muestra la diferencia.
Antes de la versión 1.9.0 | Después de la versión 1.9.0 |
---|---|
app.yaml - url: /.* script: index.php |
|
REQUEST_URI: / SCRIPT_FILENAME: /path/to/index.php SCRIPT_NAME: / PHP_SELF: / |
REQUEST_URI: / SCRIPT_FILENAME: /path/to/index.php SCRIPT_NAME: /index.php PHP_SELF: /index.php |
REQUEST_URI: /bar SCRIPT_FILENAME: /path/to/index.php SCRIPT_NAME: /bar PHP_SELF: /bar |
REQUEST_URI: /bar SCRIPT_FILENAME: /path/to/index.php SCRIPT_NAME: /index.php PHP_SELF: /index.php |
REQUEST_URI: /index.php/foo/bar SCRIPT_FILENAME: /path/to/index.php SCRIPT_NAME: /index.php/foo/bar PHP_SELF: /index.php/foo/bar |
REQUEST_URI: /index.php/foo/bar SCRIPT_FILENAME: /path/to/index.php SCRIPT_NAME: /index.php PHP_SELF: /index.php/foo/bar |
REQUEST_URI: /test.php/foo/bar SCRIPT_FILENAME: /path/to/index.php SCRIPT_NAME: /test.php/foo/bar PHP_SELF: /test.php/foo/bar |
REQUEST_URI: /test.php/foo/bar SCRIPT_FILENAME: /path/to/index.php SCRIPT_NAME: /index.php PHP_SELF: /index.php |
app.yaml - url: /.* script: foo/index.php |
|
REQUEST_URI: /bar SCRIPT_FILENAME: /path/to/foo/index.php SCRIPT_NAME: /bar PHP_SELF: /bar |
REQUEST_URI: /bar SCRIPT_FILENAME: /path/to/foo/index.php SCRIPT_NAME: /foo/index.php PHP_SELF: /foo/index.php |
Directivas con nuevos valores predeterminados de inicialización
En esta tabla se especifican las directivas cuya inicialización predeterminada difiere de las predeterminadas que se proporcionan con el intérprete de PHP estándar disponible en php.net. Puede anular estas directivas predeterminadas incluyéndolas en un archivo php.ini de su aplicación.
Directive | Valor predeterminado en App Engine |
---|---|
detect_unicode |
false |
session.gc_maxlifetime |
600 |
session.cookie_secure |
600 |
session.cookie_httponly |
1 |
session.use_only_cookies |
1 |
display_errors |
0 |
display_startup_errors |
0 |
html_errors |
0 |
log_errors |
1 |
file_uploads |
0 |
upload_max_filesize |
262144 |
max_file_uploads |
0 |
date.timezone |
UTC |
sendmail_path |
null |
allow_url_fopen |
1 |
allow_url_include |
0 |
enable_dl |
0 |
expose_php |
Off |
register_globals |
Off |
magic_quotes_gpc |
0 |
mysqlnd.collect_statistics |
0 |
mysql.allow_local_infile |
0 |
mysqli.allow_local_infile |
0 |
Funciones inhabilitadas
Por motivos de seguridad o de compatibilidad con el entorno de ejecución de App Engine, se han inhabilitado algunas funciones de PHP. Algunas de estas funciones se pueden volver a habilitar explícitamente en el archivo php.ini de tu aplicación.
Funciones inhabilitadas permanentemente
Las siguientes funciones se han inhabilitado permanentemente en App Engine:
disk_free_space()
disk_total_space()
diskfreespace()
escapeshellarg() and escapeshellcmd()
exec()
highlight_file()
lchgrp(), lchown(), link(), and symlink()
passthru()
pclose() and popen()
proc_close(), prog_get_status(), proc_nice(), proc_open(), and proc_terminate()
set_time_limit()
shell_exec()
show_source()
system()
App Engine no incluye la extensión pcntl, por lo que las funciones proporcionadas por pcntl
no están disponibles para las aplicaciones PHP que se ejecutan en App Engine.
Compatibilidad con tempnam()
y sys_get_temp_dir()
Las aplicaciones de App Engine se ejecutan en un sandbox de seguridad que no permite escribir en el sistema de archivos local. Por este motivo, la versión de App Engine de tempnam()
devuelve un archivo temporal en memoria que se puede escribir en una solución de almacenamiento permanente, como los segmentos de Google Cloud Storage, más adelante.
A continuación, se muestra un ejemplo de cómo escribir en el archivo temporal en memoria con file_put_contents()
y fwrite()
.
<?php
$dir = sys_get_temp_dir();
$tmp = tempnam($dir, “foo”);
file_put_contents($tmp, “hello”)
$f = fopen($tmp, “a”);
fwrite($f, “ world”);
fclose($f)
echo file_get_contents($tmp);
El resultado esperado del ejemplo sería el siguiente:
hello world
Funciones parcialmente restringidas
El entorno de ejecución de PHP de App Engine no admite el modificador /e
de patrón
de las funciones preg_replace()
y mb_ereg_replace()
. Consulte la documentación de PREG_REPLACE_EVAL
para ver el aviso de discontinuación y un ejemplo de cómo actualizar su código para usar preg_replace_callback()
.
Funciones que se pueden habilitar manualmente
En esta lista se especifica la función de PHP que se debe habilitar manualmente mediante la directiva google_app_engine.enable_functions
en el archivo php.ini de tu aplicación.
gc_collect_cycles()
,gc_enable()
,gc_disable()
ygc_enabled()
getmypid()
getmyuid()
ygetmygid()
getrusage()
getmyinode()
get_current_user()
libxml_disable_entity_loader()
*parse_str()
phpinfo()
phpversion()
php_uname()
php_sapi_name()
También puedes inhabilitar funciones manualmente mediante la directiva disable_functions
en el archivo php.ini de tu aplicación.
Funciones que requieren que la facturación esté habilitada
Las siguientes funciones usan sockets y, por lo tanto, solo están disponibles para las aplicaciones con la facturación habilitada.
- todas las funciones de red, excepto
gethostname()
- todas las funciones de sockets
- Todas las funciones de FTP
- cURL, a menos que se use cURL Lite
Conexiones TCP/IP a servidores MySQL (Cloud SQL solo se puede usar con un socket UNIX)
Compatibilidad con emisiones
Wrappers de flujo de entrada/salida de PHP admitidos
Se admiten los siguientes envoltorios de flujo de entrada/salida de PHP:
- php://input
- php://output
- php://memory
- php://temp
Envoltorios de flujo
Muchas funciones de PHP, como fopen()
o file_get_contents()
, aprovechan la interfaz de streams de PHP para admitir diferentes protocolos.
A continuación se muestra una lista de los envoltorios de flujo integrados que se registran automáticamente y están disponibles en el tiempo de ejecución de App Engine.
file://
glob://
http://
(Se comporta como el controlador de flujo http integrado de PHP, pero usa el servicio URLfetch de App Engine).https://
(Esto usa el servicio URLfetch de App Engine).ftp://
gs://
(El controlador de flujo de Google Cloud Storage)zlib://
A continuación, se incluye una lista de controladores de flujo integrados que no se admiten en App Engine y que se han dado de baja.
data://
expect://
ogg://
phar://
rar://
ssh2://
Transportes de streaming inhabilitados
Se han inhabilitado los siguientes transportes de streaming.
ssl
sslv2
sslv3
tcp
tls
udg
udp
unix
PHP puro
Todo el código del entorno de ejecución de PHP debe ser PHP puro. App Engine no te permite subir tus propias extensiones de C.
El entorno incluye la biblioteca estándar de PHP. Algunas extensiones se han inhabilitado porque App Engine no admite sus funciones principales, como las redes y la escritura en el sistema de archivos.
Puedes incluir otras bibliotecas PHP puras en tu aplicación colocando el código en el directorio de la aplicación, que es el mismo directorio que contiene el archivo app.yaml
.
Por ejemplo, puedes crear un enlace simbólico en el directorio de tu aplicación que apunte al directorio de una biblioteca. A continuación, se sigue ese enlace y la biblioteca se incluye en tu aplicación cuando la implementas en App Engine.
También puede incluir bibliotecas PHP especificando directivas php.ini
e incluyendo instrucciones include
de PHP en su código. Sin embargo, la alternativa preferida es usar una herramienta de gestión de dependencias de PHP, como Composer.
Ejemplos:
Si incluyes el directorio raíz de tu aplicación en la directiva
include_path
de tu archivophp.ini
:include_path=".:/[ROOT_DIR]/myapp"
A continuación, puede usar las instrucciones
include
oinclude_once
para incluir archivos PHP relativos a suinclude_path
:include_once 'myfile.php';
Si decides usar Composer para incluir tus bibliotecas PHP puras, puedes incluir un solo archivo después de instalar tus dependencias:
require_once 'vendor/autoload.php';
Cuando usas Composer para instalar las dependencias de tu aplicación, todos los paquetes se añaden al directorio de la aplicación en
vendor
, que es donde se genera el archivoautoload.php
.
Herramientas
El SDK de App Engine incluye herramientas para probar tu aplicación y subir archivos de aplicaciones.
El servidor de desarrollo ejecuta tu aplicación en tu ordenador local para que puedas probarla.
La herramienta gcloud
gestiona todas las interacciones de línea de comandos con tu aplicación que se ejecuta en App Engine. gcloud app deploy
se usa para subir tu aplicación a App Engine o para actualizar archivos de configuración concretos. También puedes ver los datos de registro de tu aplicación para analizar su rendimiento con tus propias herramientas.
Código fuente del intérprete de PHP
Puedes descargar el código fuente del intérprete de PHP de App Engine en el repositorio appengine-php de GitHub.
Simultaneidad y latencia
La latencia de tu aplicación es el factor que más influye en el número de instancias necesarias para atender tu tráfico. Si procesas las solicitudes rápidamente, una sola instancia puede gestionar muchas solicitudes.
Variables de entorno
El tiempo de ejecución define las siguientes variables de entorno:
Variable de entorno | Descripción |
---|---|
GAE_APPLICATION
|
El ID de tu aplicación de App Engine. Este ID tiene el prefijo "region code~", como "e~" en el caso de las aplicaciones desplegadas en Europa. |
GAE_DEPLOYMENT_ID |
ID de la implementación actual. |
GAE_ENV |
El entorno de App Engine. Su valor debe ser standard . |
GAE_INSTANCE |
El ID de la instancia en la que se está ejecutando tu servicio. |
GAE_RUNTIME |
El tiempo de ejecución especificado en el archivo app.yaml . |
GAE_SERVICE |
El nombre del servicio especificado en el archivo app.yaml . Si no se especifica ningún nombre de servicio, se le asigna el valor default . |
GAE_VERSION |
La etiqueta de la versión actual de tu servicio. |
GOOGLE_CLOUD_PROJECT |
El ID de proyecto Google Cloud asociado a tu aplicación. |
PORT |
El puerto que recibe solicitudes HTTP. |
Puede definir variables de entorno adicionales en el archivo app.yaml
,
pero los valores anteriores no se pueden anular.