Entorno de ejecución de PHP 5

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.

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 personalizado
  • CURRENT_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 en X-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.0Despué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() y gc_enabled()
  • getmypid()
  • getmyuid() y getmygid()
  • 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.

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.

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 archivo php.ini:

    include_path=".:/[ROOT_DIR]/myapp"
    

    A continuación, puede usar las instrucciones include o include_once para incluir archivos PHP relativos a su include_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 archivo autoload.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.