Entorno de ejecución de PHP

El tiempo de ejecución de PHP es la pila de software encargada de instalar el código de tu aplicación y sus dependencias, y de ejecutarla en el entorno flexible.

Versiones de PHP

PHP 8.4 usa buildpacks. Para ver la lista completa de versiones de PHP admitidas y sus versiones de Ubuntu correspondientes, consulta la programación de asistencia de tiempo de ejecución.

Para usar una versión de PHP compatible, debes hacer lo siguiente:

  • Instala la versión 420.0.0 o una posterior de gcloud CLI. Puedes actualizar tus herramientas de CLI ejecutando el comando gcloud components update. Para ver la versión instalada, puedes ejecutar el comando gcloud version.

  • Incluya los ajustes runtime_config y operating_system en el archivo app.yaml para especificar un sistema operativo.

  • Declara la raíz del documento de tu aplicación en el archivo app.yaml:

      runtime: php
      env: flex
    
      runtime_config:
          operating_system: "ubuntu22"
          document_root: "web"
    

    Aunque puedes especificar el directorio raíz del proyecto (.) como raíz del documento, te recomendamos que uses un subdirectorio para la opción document_root.

    El código fuente se encuentra en el directorio /workspace en lugar de en el directorio raíz (/). Si anulas alguna configuración, los procesos NGINX o supervisor harán referencia a tu archivo de configuración en este directorio. Para actualizar las referencias correspondientes, debes hacer lo siguiente:

    • Actualiza cualquier instrucción include de tu configuración de NGINX para que sea relativa a /workspace en lugar de a /etc/nginx.

    • Algunos archivos, como gzip_params, no se incluyen. Para hacer referencia a estos archivos, incluye los tuyos o cópialos de GitHub. Los archivos mime.types y fastcgi_params están disponibles en el directorio /etc/nginx.

    • Algunos módulos de NGINX, como nginx-plus-module-ndk, no están instalados. Define el valor de $docroot o añádelo manualmente en el archivo de configuración NGINX.

  • También puedes especificar una versión del tiempo de ejecución de las siguientes formas:

    • Incluir el ajuste runtime_version en tu app.yaml. De forma predeterminada, se usa la versión más reciente de PHP si no se especifica el ajuste runtime_version.

      • Para especificar PHP 8.4 en Ubuntu 22, sigue estos pasos:

        runtime: php
        env: flex
        
        runtime_config:
            operating_system: "ubuntu22"
            runtime_version: "8.4"
            document_root: .
        
      • Para especificar la versión de PHP más reciente compatible en Ubuntu 22, sigue estos pasos:

          runtime: php
          env: flex
        
          runtime_config:
              operating_system: "ubuntu22"
              document_root: .
        
    • Incluir una versión de PHP en el archivo composer.json.

      {
          "require": {
              "php": "8.4.*"
          }
      }
      

    Consulta la referencia de app.yaml para obtener más información.

Versiones anteriores del entorno de ejecución

Para usar PHP 7.3 y versiones anteriores, debes hacer lo siguiente:

  • Declara la raíz del documento de tu aplicación. Puedes hacerlo en tu archivo app.yaml:

    runtime: php
    env: flex
    api_version: 1
    
    runtime_config:
      document_root: .
    

    Aunque puedes especificar el directorio raíz del proyecto (.) como raíz del documento, te recomendamos que uses un subdirectorio para la opción document_root.

  • Especifica una versión de PHP en el archivo composer.json para evitar que tu aplicación se actualice automáticamente cuando haya una nueva versión de PHP disponible.

    {
        "require": {
            "php": "7.3.*"
        }
    }
    

Compatibilidad con otros entornos de ejecución de PHP

Si necesitas usar una versión de PHP que no sea compatible, puedes crear un tiempo de ejecución personalizado y seleccionar una imagen base válida con la versión de PHP que necesites.

Para obtener imágenes base proporcionadas por Google o imágenes base de Docker PHP, consulta Crear tiempos de ejecución personalizados.

Personalizar NGINX

Para definir un archivo de configuración personalizado, incluye el archivo nginx-app.conf en el directorio raíz de tu proyecto.

De forma predeterminada, el controlador frontal del framework usa el archivo index.php. Es posible que tengas que cambiarlo por otro valor en tu proyecto. Por ejemplo, el framework Symfony usa app.php en lugar de index.php. Puedes cambiar el nombre de archivo en la sección runtime_config de tu archivo app.yaml:

runtime: php
env: flex

runtime_config:
  operating_system: "ubuntu22"
  document_root: .
  front_controller_file: app.php

En la versión 7.3 y anteriores, el archivo de configuración nginx-app.conf se incluye en la sección del servidor del archivo de configuración principal NGINX. Por ejemplo, el archivo de configuración predeterminado php-app.conf contiene lo siguiente:

location / {
# try to serve files directly, fallback to the front controller
try_files $uri /$front_controller_file$is_args$args;
}

Para definir un archivo de configuración personalizado, crea el archivo nginx-app.conf en el directorio raíz de tu proyecto. El tiempo de ejecución anula el archivo predeterminado con el archivo que proporciones.

De forma predeterminada, el controlador frontal del framework usa el archivo index.php. Es posible que tengas que cambiarlo por otro valor en tu proyecto. Por ejemplo, el framework Symfony usa app.php en lugar de index.php. Puedes cambiar el nombre de archivo en la sección runtime_config de tu archivo app.yaml:

runtime: php
env: flex

runtime_config:
  document_root: .
  front_controller_file: app.php

OPcache

Habilita OPcache en el archivo php.ini. Consulta la documentación oficial para saber cómo configurar OPcache.

Para inhabilitar OPcache, crea o edita el archivo php.ini con la siguiente línea:

opcache.enable=0

Dependencias

El tiempo de ejecución busca un archivo composer.json en el directorio de origen de tu aplicación y usa composer para instalar las dependencias antes de iniciar la aplicación. Para obtener más información sobre cómo declarar y gestionar paquetes, consulta Usar bibliotecas de PHP.

Usar extensiones de PHP

Las siguientes extensiones de PHP están preinstaladas y habilitadas en el sistema:

Versiones de PHP compatibles

Puedes habilitar las siguientes extensiones mediante el archivo php.ini:

v7.3 y versiones anteriores

Las siguientes extensiones de PHP están inhabilitadas de forma predeterminada. Puedes habilitar las siguientes extensiones en el archivo php.ini:

Para habilitar una extensión, añade un archivo php.ini en la raíz de tu aplicación con la directiva extension:

; Enable the Redis extension
extension=redis.so

; Enable the OpenTelemetry extension (must be in an opentelemetry section)
[opentelemetry]
extension=opentelemetry.so

También puedes habilitar una extensión añadiendo un require a tu composer.json:

{
    "require": {
        "ext-redis": "*"
    }
}

Estos paquetes permiten la instalación de las extensiones de PHP más populares. Si tu aplicación requiere dependencias adicionales a nivel del sistema operativo, debes ampliar el tiempo de ejecución de PHP o usar un tiempo de ejecución personalizado para instalar los paquetes adecuados.

Proxies HTTPS y de reenvío

App Engine finaliza la conexión HTTPS en el balanceador de carga y reenvía la solicitud a tu aplicación. El servidor NGINX está configurado para asignar el valor on a la variable de entorno HTTPS ($_SERVER["HTTPS"]) cuando la solicitud se hace a través de HTTPS.

Algunas aplicaciones también necesitan determinar la dirección IP del usuario. Esta opción está disponible en el encabezado X-Forwarded-For estándar.

Funciones inhabilitadas

Las siguientes funciones están inhabilitadas con la directiva disable_functions en php.ini:

  • exec
  • passthru
  • proc_open
  • proc_close
  • shell_exec
  • show_source
  • symlink
  • system

Si necesitas alguna de las funciones anteriores, añade un archivo php.ini en la raíz de tu aplicación y cambia la directiva disable_functions. También puedes definir whitelist_functions en la sección runtime_config de app.yaml como una lista de funciones separadas por comas para permitirlas.

En PHP 7.3 y versiones anteriores, la extensión de seguridad Suhosin se instala y configura de forma predeterminada para que se ejecute en modo de simulación. En el modo de simulación se registra el uso de funciones potencialmente peligrosas, que se mostrarán en la interfaz de usuario de Cloud Logging. Si desactivas el modo de simulación, la aplicación se cerrará cuando se utilice una función potencialmente peligrosa. Para habilitar esta función de seguridad adicional, añade un php.ini en la raíz de tu proyecto con la siguiente opción:

; Prevent the use of potentially dangerous functions rather than logging them
suhosin.simulation = Off

Funciones parcheadas

La función parse_str se ha parcheado y el segundo parámetro es obligatorio. Si llamas a parse_str con un solo parámetro, se mostrará una advertencia y no se llamará a la función.

Configuraciones disponibles

Puede incluir las siguientes configuraciones en la sección runtime_config:

NombreDescripciónValor predeterminado
document_root Especifica DOCUMENT_ROOT para nginx y PHP. Debes usar una ruta relativa desde el directorio raíz del proyecto. Campo obligatorio
composer_flags Puedes anular algunas de las marcas del compositor con esta clave. --no-dev --prefer-dist
enable_stackdriver_integration Solo se admite en la versión 7.3 y anteriores. Si se le asigna el valor true, el tiempo de ejecución habilitará automáticamente la integración de Google Cloud Observability. Esta configuración requiere el paquete google/cloud v0.33 o una versión posterior. falso
skip_lockdown_document_root Solo se admite en la versión 7.3 y anteriores. De forma predeterminada, el tiempo de ejecución asignará un permiso de solo lectura estricto a todos los archivos y directorios de la carpeta document_root. Si se le asigna el valor true, el tiempo de ejecución omitirá el cambio del permiso. falso
whitelist_functions Solo se admite en la versión 7.3 y anteriores. Lista de nombres de funciones separada por comas que se van a incluir en la lista de permitidas. Una cadena vacía
front_controller_file Nombre de archivo PHP predeterminado para el acceso al directorio. index.php
nginx_conf_http_include Nombre de archivo de una configuración parcial de nginx, que se incluirá en la sección http del archivo de configuración principal de nginx. nginx-http.conf
nginx_conf_include Nombre de archivo de una configuración parcial de nginx que se incluirá en la sección server del archivo de configuración principal de nginx. nginx-app.conf
nginx_conf_override Nombre de archivo de un archivo de configuración de nginx proporcionado por el usuario, que se usará como archivo de configuración principal de nginx. nginx.conf
php_fpm_conf_override Nombre de archivo de un archivo de configuración de php-fpm proporcionado por el usuario, que se incluirá en la parte inferior de la sección [app] para que sustituya las configuraciones existentes. php-fpm.conf
php_ini_override Nombre de archivo de un archivo de configuración de PHP proporcionado por el usuario. php.ini
supervisord_conf_addition Nombre de archivo de un archivo de configuración de supervisord proporcionado por el usuario, que se incluirá en el archivo de configuración principal de supervisord. additional-supervisord.conf
supervisord_conf_override Nombre de archivo de un archivo de configuración de supervisord proporcionado por el usuario, que anulará el archivo de configuración principal de supervisord. supervisord.conf

Puedes controlar si Nginx sirve archivos estáticos para URIs coincidentes configurando la variable de entorno NGINX_SERVES_STATIC_FILES en la sección build_env_variables de tu archivo app.yaml:

runtime: php
env: flex

runtime_config:
  document_root: "web"
  operating_system: "ubuntu22"

build_env_variables:
  NGINX_SERVES_STATIC_FILES: true

Configurar supervisord en el entorno de ejecución de PHP

El entorno flexible de App Engine usa supervisord para gestionar procesos. De forma predeterminada, supervisord ejecuta nginx y php-fpm para ejecutar aplicaciones web PHP. Sin embargo, algunas aplicaciones necesitan ejecutar procesos externos. Además, a veces estas aplicaciones ni siquiera necesitan nginx ni php-fpm.

Si quieres añadir un proceso gestionado por supervisord, añade un archivo llamado additional-supervisord.conf al directorio raíz del proyecto. A continuación, se muestra un ejemplo del contenido de un archivo de configuración para este caso:

[program:quote-updater]
command = php %(ENV_APP_DIR)s/worker.php
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes=0
user = www-data
autostart = true
autorestart = true
priority = 5
stopwaitsecs = 20

Si quieres sustituir nginx y php-fpm por tu proceso, añade un archivo llamado supervisord.conf al directorio raíz del proyecto. A continuación, se muestra un ejemplo del contenido de un archivo de configuración para este caso:

[supervisord]
nodaemon = true
logfile = /dev/null
logfile_maxbytes = 0
pidfile = /var/run/supervisord.pid

[program:react-server]
command = php %(ENV_APP_DIR)s/index.php
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes=0
user = www-data
autostart = true
autorestart = true
priority = 5
stopwaitsecs = 20

Prolongar el tiempo de ejecución

El tiempo de ejecución de PHP del entorno flexible de App Engine se puede usar para crear un tiempo de ejecución personalizado. Para obtener más información, consulta Personalizar el entorno de ejecución de PHP.

Variables de entorno

El entorno de ejecución define las siguientes variables de entorno:

Variable de entorno Descripción
GAE_INSTANCE Nombre de la instancia actual.
GAE_MEMORY_MB Cantidad de memoria disponible para el proceso de la aplicación.
GAE_SERVICE El nombre del servicio especificado en el archivo app.yaml de tu aplicación o, si no se ha especificado ningún nombre de servicio, se define como default.
GAE_VERSION Etiqueta de versión de la aplicación actual.
GOOGLE_CLOUD_PROJECT El ID del proyecto asociado a tu aplicación, que se puede ver en la Google Cloud consola
PORT Puerto que recibirá las solicitudes HTTP.

Puedes definir variables de entorno adicionales con app.yaml.

Servidor de metadatos

Cada instancia de tu aplicación puede usar el servidor de metadatos de Compute Engine para consultar información sobre la instancia, como su nombre de host, su dirección IP externa, su ID de instancia, sus metadatos personalizados y la información de su cuenta de servicio. App Engine no te permite definir metadatos personalizados para cada instancia, pero puedes definir metadatos personalizados de todo el proyecto y leerlos desde tus instancias de App Engine y Compute Engine.

Esta función de ejemplo usa el servidor de metadatos para obtener la dirección IP externa de una instancia:

function get_external_ip_using_google_cloud()
{
    $metadata = new Google\Cloud\Core\Compute\Metadata();
    $externalIp = $metadata->get(
        'instance/network-interfaces/0/access-configs/0/external-ip');

    return $externalIp;
}

function get_external_ip_using_curl()
{
    $url = 'http://metadata.google.internal/computeMetadata/v1/' .
        'instance/network-interfaces/0/access-configs/0/external-ip';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Metadata-Flavor: Google'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    return curl_exec($ch);
}