O tempo de execução do PHP é a pilha de software responsável por instalar o código do seu serviço Web e as respetivas dependências, bem como executar o seu serviço.
Para especificar o PHP para o ambiente padrão do App Engine, declare o tempo de execução no ficheiro
app.yaml
. Por exemplo:
runtime: phpVERSION
Onde VERSION são os números das versões do PHP MAJOR
e MINOR
. Por exemplo, para usar a versão mais recente do PHP, o PHP 8.4, especifique 84
.
Para outras versões do PHP suportadas e a versão correspondente do Ubuntu para a sua versão do PHP, consulte a programação de suporte de tempo de execução.
Versão do PHP
A versão do PHP mais recente suportada é a 8.4. O tempo de execução do PHP usa a versão estável mais recente da versão especificada no ficheiro app.yaml
. O App Engine é atualizado automaticamente para novas versões de lançamento de patches, mas não atualiza automaticamente a versão secundária.
Por exemplo, a sua app pode ser implementada no PHP 7.3.0 e, posteriormente, atualizada automaticamente para a versão 7.3.1, mas não é atualizada automaticamente para o PHP 7.4.0.
Arranque da app
Tem de implementar um controlador frontal para processar todo o encaminhamento de pedidos.
Os exemplos seguintes mostram diferentes formas de publicar a sua app:
Se a sua app contiver um ficheiro
public/index.php
ouindex.php
, o App Engine usa este ficheiro para publicar a sua app.Recomendamos que use uma framework, como Laravel, Symfony ou Slim, porque oferece um encaminhamento simples para escrever e implementar apps PHP rapidamente. Veja um exemplo de um controlador frontal Slim.
No entanto, se estiver a migrar uma app antiga, consulte o seguinte ficheiro de exemplo
index.php
para importar os ficheiros PHP de que precisa e implementar o controlador frontal manualmente:Se especificar o elemento
entrypoint
opcional no ficheiroapp.yaml
, o App Engine usa o comando no elementoentrypoint
para publicar a sua app em vez de usarpublic/index.php
ouindex.php
:entrypoint: serve path/to/my/front/controller.php
O campo
entrypoint
usa o comandoserve
incorporado, que é um programa nos runtimes do PHP que inicia a implementaçãophp-fpm
e um servidor Web em segundo plano. Este servidor Web encaminha todo o tráfego para o ficheiro PHP fornecido através do padrão de design do controlador frontal.O comando
serve
tem duas flags opcionais:--workers=N
: especifica o número N de trabalhadoresphp-fpm
. Se não definir a flag--workers
, o comandoserve
adivinha o número de trabalhadores com base na quantidade de memória disponível. Para obter os melhores resultados, defina os valores do indicador--workers
no comandoserve
e no elementomax_concurrent_requests
para serem o mesmo número.--enable-dynamic-workers
: especifica que quer que os trabalhadoresphp-fpm
sejam gerados apenas conforme necessário. A predefinição é usar uma política estática para os trabalhadoresphp-fpm
. Pode alterar o número máximo de trabalhadores gerados através da flag--workers=N
. Por predefinição, o número máximo de trabalhadores gerados é o definido pela política estática.
As flags opcionais têm de aparecer antes do caminho do controlador frontal:
entrypoint: serve --workers=2 --enable-dynamic-workers path/to/index.php
Pode implementar um processo de trabalho de execução prolongada definindo o elemento
entrypoint
para o caminho do ficheiro do processo de trabalho:entrypoint: php long-running-worker-file.php
Se o elemento
entrypoint
executar um script com um processo de execução prolongada, como um trabalhador do Pub/Sub subscrito num tópico, não use o comandoserve
.
Para mais informações, consulte a referência app.yaml
.
Extensões ativadas
As seguintes extensões foram ativadas nos tempos de execução do PHP para o App Engine:
BCMath
bz2
Calendar
core
cgi
ctype
cURL
date
dba
dom
enchant
Exif
fcgi
fileinfo
filter
FTP
GD
gettext
GMP
hash
iconv
intl
json
LDAP
libxml
mbstring
MYSQLi
mysqlnd
MySQL (PDO)
OPcache
OpenSSL
PCNTL
pcre
PDO
pgsql
Phar
posix
PostgreSQL (PDO)
Reflection
session
Shmop
SimpleXML
SOAP
Sockets
sodium (PHP 8.x only, not available for PHP 7.x)
SPL
SQLite (PDO)
SQLite3
standard
test
tidy
tokenizer
XML
XMLreader
XMLrpc (PHP 7.x only, not available for PHP 8.x)
XMLwriter
XSL
zend
Zip
Zlib
Extensões carregáveis dinamicamente
As seguintes extensões são carregáveis dinamicamente através da configuração de php.ini
:
Para ativar estas extensões, adicione diretivas para as mesmas no ficheiro php.ini
sob extension
, por exemplo:
extension=memcached.so
extension=grpc.so
extension=protobuf.so
extension=mongodb.so
extension=imagick.so
extension=opencensus.so
extension=redis.so
[opentelemetry]
extension=opentelemetry.so
Variáveis de ambiente
As seguintes variáveis de ambiente são definidas pelo tempo de execução:
Variável de ambiente | Descrição |
---|---|
GAE_APPLICATION
|
O ID da sua aplicação do App Engine. Este ID tem o prefixo "region code~", como "e~" para aplicações implementadas na Europa. |
GAE_DEPLOYMENT_ID |
O ID da implementação atual. |
GAE_ENV |
O ambiente do App Engine. Definido como standard . |
GAE_INSTANCE |
O ID da instância na qual o seu serviço está atualmente em execução. |
GAE_MEMORY_MB |
A quantidade de memória disponível para o processo da aplicação, em MB. |
GAE_RUNTIME |
O tempo de execução especificado no ficheiro app.yaml . |
GAE_SERVICE |
O nome do serviço especificado no ficheiro app.yaml . Se não for especificado nenhum nome de serviço, este é definido como default . |
GAE_VERSION |
A etiqueta da versão atual do seu serviço. |
GOOGLE_CLOUD_PROJECT |
O Google Cloud ID do projeto associado à sua aplicação. |
PORT |
A porta que recebe pedidos HTTP. |
NODE_ENV (disponível apenas no tempo de execução do Node.js) |
Definido como production quando o serviço é implementado. |
Pode definir variáveis de ambiente adicionais no ficheiro app.yaml
, mas os valores acima não podem ser substituídos, exceto o NODE_ENV
.
HTTPS e proxies de encaminhamento
O App Engine termina as ligações HTTPS no equilibrador de carga e encaminha os pedidos para a sua aplicação. Algumas aplicações precisam de determinar o IP e o protocolo do pedido original. O endereço IP do utilizador está disponível no cabeçalho X-Forwarded-For
padrão. As aplicações que requerem estas informações devem configurar a respetiva framework Web para confiar no proxy.
Sistema de ficheiros
O tempo de execução inclui um diretório /tmp
gravável, com todos os outros diretórios a terem acesso só de leitura. A escrita para /tmp
ocupa memória do sistema. Para mais
informações, consulte o tempnam()
e o apoio técnico do sys_get_temp_dir()
.
Servidor de metadados
Cada instância da sua aplicação pode usar o servidor de metadados do App Engine para consultar informações sobre a instância e o seu projeto.
Pode aceder ao servidor de metadados através dos seguintes pontos finais:
http://metadata
http://metadata.google.internal
Os pedidos enviados para o servidor de metadados têm de incluir o cabeçalho do pedido
Metadata-Flavor: Google
. Este cabeçalho indica que o pedido foi enviado com a intenção de obter valores de metadados.
A tabela seguinte lista os pontos finais onde pode fazer pedidos HTTP para metadados específicos:
Ponto final de metadados | Descrição |
---|---|
/computeMetadata/v1/project/numeric-project-id |
O número do projeto atribuído ao seu projeto. |
/computeMetadata/v1/project/project-id |
O ID do projeto atribuído ao seu projeto. |
/computeMetadata/v1/instance/region |
A região em que a instância está a ser executada. |
/computeMetadata/v1/instance/service-accounts/default/aliases |
|
/computeMetadata/v1/instance/service-accounts/default/email |
O email da conta de serviço predefinido atribuído ao seu projeto. |
/computeMetadata/v1/instance/service-accounts/default/ |
Apresenta todas as contas de serviço predefinidas do seu projeto. |
/computeMetadata/v1/instance/service-accounts/default/scopes |
Lista todos os âmbitos suportados para as contas de serviço predefinidas. |
/computeMetadata/v1/instance/service-accounts/default/token |
Devolve o token de autorização que pode ser usado para autenticar a sua aplicação noutras APIs Google Cloud. |
Por exemplo, para obter o ID do projeto, envie um pedido para
http://metadata.google.internal/computeMetadata/v1/project/project-id
.
Segue-se um exemplo de como chamar os pontos finais de metadados através do cURL ou da biblioteca cliente da Google Cloud:
Sessões
O PHP fornece uma camada de gestão de sessões que permite que as apps Web preservem as informações do estado do utilizador entre pedidos. As sessões no App Engine funcionam de forma muito semelhante às sessões em qualquer outra app PHP.
Para definir uma variável na sessão de um utilizador, pode usar o seguinte código:
session_start();
$_SESSION['Foo'] = 'Bar';
O seguinte código vai imprimir Bar
, num pedido subsequente do mesmo utilizador:
session_start();
print $_SESSION['Foo']; // prints Bar
Para sessões mais longas, use um serviço de armazenamento alternativo, como o Cloud SQL.
Chaves $_SERVER especiais
O PHP disponibiliza a matriz especial $_SERVER[]
no âmbito do pedido. Além dos parâmetros CGI padrão, o App Engine adiciona algumas chaves úteis adicionais:
GAE_APPLICATION
: ID do projeto da Google Cloud app atual.GAE_DEPLOYMENT_ID
: ID do código-fonte implementado.GAE_ENV
– O ambiente do App Engine (padrão ou flexível) onde a sua app é executada.GAE_INSTANCE
: nome da instância de execução atual.GAE_MEMORY_MB
- Quantidade de memória disponível para o processo da app, em MB.GAE_RUNTIME
- O tempo de execução especificado no seu ficheiroapp.yaml
, como php72.GAE_SERVICE
: nome do serviço implementado atualmente.GAE_VERSION
: nome da versão implementada atualmente.GOOGLE_CLOUD_PROJECT
- Google Cloud ID do projeto.HTTP_X_APPENGINE_CITY
- Nome da cidade de origem do pedido. Por exemplo, um pedido da cidade de Mountain View pode ter o valor do cabeçalho mountain view.HTTP_X_APPENGINE_CITYLATLONG
- Latitude e longitude da cidade de origem do pedido. Esta string pode ter o seguinte aspeto: "37.386051,-122.083851" para um pedido de Mountain View.HTTP_X_APPENGINE_COUNTRY
- País de origem do pedido, como um código do país da norma ISO 3166-1 alfa-2. O App Engine determina este código a partir do endereço IP do cliente.HTTP_X_APPENGINE_HTTPS
- Valida a utilização de HTTPS.HTTP_X_APPENGINE_REGION
- Nome da região de origem do pedido. Este valor só faz sentido no contexto do país em que o produto é vendidoX-Appengine-Country
. Por exemplo, se o país for "US" e a região for "ca", esse "ca" significa "Califórnia" e não Canadá.HTTP_X_APPENGINE_USER_IP
: o endereço IP do cliente. Tenha em atenção que$_SERVER['HTTP_X_APPENGINE_USER_IP']
é a única forma de a sua app obter o endereço IP do cliente. A variável$_SERVER['REMOTE_ADDR']
não está disponível no App Engine.
Diretivas com novos valores predefinidos de inicialização
A tabela seguinte especifica as diretivas cujas predefinições de inicialização diferem das fornecidas com o intérprete PHP padrão disponível em php.net. Para encontrar os valores predefinidos das diretivas não especificadas na tabela seguinte, consulte as diretivas php.ini.
Diretiva | Valor predefinido no App Engine |
---|---|
expose_php |
Off |
memory_limit |
-1 |
max_execution_time |
0 |
error_reporting |
E_ALL & ~E_DEPRECATED & ~E_STRICT |
display_errors |
Off |
display_startup_errors |
Off |
log_errors |
On |
log_errors_max_len |
0 |
ignore_repeated_errors |
Off |
ignore_repeated_source |
Off |
html_errors |
Off |
opcache.enable |
On |
opcache.validate_timestamps |
Off |
opcache.memory_consumption |
32 |
Substitua estas diretivas predefinidas incluindo-as num ficheiro php.ini
para a sua app.
Compatibilidade com tempnam()
e sys_get_temp_dir()
As apps do App Engine são executadas numa sandbox de segurança em que apenas o diretório /tmp
é gravável e armazenado na RAM da instância. Por este motivo, a versão do App Engine de
tempnam()
devolve um ficheiro temporário na memória que pode ser escrito numa solução de armazenamento permanente, como
contentores do Cloud Storage.
Segue-se um exemplo de como escrever no ficheiro temporário na memória através de
file_put_contents()
e 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);
O resultado esperado do exemplo seria:
hello world
Gerir dependências com o Composer
Para mais informações, consulte a página Especificar dependências.