Con App Engine, puoi creare applicazioni web utilizzando il linguaggio di programmazione PHP. La tua applicazione PHP viene eseguita sull'infrastruttura scalabile di Google e utilizza servizi e spazio di archiviazione permanente su larga scala.
Selezionare il runtime PHP
App Engine esegue la tua applicazione web PHP utilizzando un interprete PHP versione 5.5.34. Nota: su Linux devi anche installare PHP localmente per eseguire le tue app PHP.
Per impostare l'app in modo che utilizzi il runtime PHP, aggiungi quanto segue al file app.yaml:
runtime: php55
api_version: 1
...
Il primo elemento, runtime, seleziona l'ambiente di runtime PHP.
Il secondo elemento, api_version, seleziona la versione dell'ambiente di runtime PHP da utilizzare. Al momento della stesura di questo articolo, App Engine ha una sola versione
dell'ambiente PHP, 1. Se in futuro verranno apportate modifiche che potrebbero non essere
retrocompatibili, il team di App Engine utilizzerà un nuovo identificatore di versione. La tua app continuerà a utilizzare la versione selezionata finché non modifichi
l'impostazione api_version e carichi l'app.
Per ulteriori informazioni sul file app.yaml e su come eseguire il deployment dell'app in App Engine, consulta gli argomenti app.yaml Reference e Deployment di un'app PHP.
La sandbox
Per consentire ad App Engine di distribuire le richieste per le applicazioni su più server web e per impedire a un'applicazione di interferire con un'altra, l'applicazione viene eseguita in un ambiente "sandbox" limitato. In questo ambiente, l'applicazione può eseguire codice, utilizzare i servizi di posta, recupero URL e utenti di App Engine ed esaminare la richiesta web dell'utente e preparare la risposta.
Un'applicazione App Engine non può:
scrivere nel file system. Le applicazioni PHP possono utilizzare Google Cloud Storage per archiviare i file persistenti. La lettura dal file system è consentita e tutti i file dell'applicazione caricati con l'applicazione sono disponibili.
rispondere lentamente. Una richiesta web a un'applicazione deve essere gestita entro pochi secondi. I processi che impiegano molto tempo per rispondere vengono terminati per evitare di sovraccaricare il server web.
effettuare altri tipi di chiamate di sistema.
Caricamento automatico delle classi
Sia le classi della libreria PHP standard (SPL) sia le classi che fanno parte dell'SDK per App Engine vengono caricate automaticamente quando necessario. Ciò significa che non devi utilizzare le istruzioni include o require
nella parte superiore degli script PHP.
Per impostazione predefinita, il caricamento automatico delle classi viene eseguito solo per le classi definite nei file
che si trovano nella directory principale della radice dell'SDK per App Engine (e, se
è stato specificato da --php_executable_path, nella tua installazione PHP locale).
Per aggiungere altri percorsi in cui eseguire la ricerca per il caricamento automatico delle classi, utilizza
set_include_path nello script PHP.
set_include_path('my_additional_path' . PATH_SEPARATOR . get_include_path());
Estensioni attivate
Nel runtime PHP per App Engine sono state abilitate le seguenti estensioni:
- apc
- bcmath
- calendario
- Definizione
- ctype
- data
- dom
- ereg
- exif
- filtro
- ftp
- gd
- hash
- iconv
- json
- libxml
- mailparse
- mbstring
- mcrypt
- memcache
- memcached
- mysql
- mysqli
- mysqlnd
- OAuth
- openssl
- pcre
- PDO
- pdo_mysql
- Riflessione
- sessione
- shmop
- SimpleXML
- sapone
- socket (per le app con fatturazione abilitata)
- SPL
- standard
- tokenizzatore
- xml
- xmlreader
- xmlwriter
- xsl
- zip
- zlib
Estensioni caricabili dinamicamente
Le seguenti estensioni sono caricabili dinamicamente configurando php.ini.
- cURL: questa estensione utilizza il servizio socket per effettuare richieste ed è soggetta alla quota e alle limitazioni di questi servizi. Per saperne di più, consulta Richieste in uscita.
- MongoDB: questa estensione consente a uno sviluppatore di connettersi a un'istanza MongoDB esistente. Utilizza il servizio socket per effettuare richieste ed è soggetto alla quota e alle limitazioni di questi servizi.
- ImageMagick
- intl
- fileinfo
Per attivare queste estensioni, aggiungi le direttive corrispondenti nel file php.ini
in extension nel seguente modo:
extension = "curl.so"
extension = "mongo.so"
extension = "imagick.so"
extension = "intl.so"
extension = "fileinfo.so"
Sessioni
La maggior parte delle applicazioni web ha bisogno di un modo per conservare le informazioni sullo stato dell'utente tra le richieste. PHP fornisce un comodo livello di gestione delle sessioni. Le sessioni in App Engine funzionano in modo molto simile alle sessioni in qualsiasi altra applicazione PHP.
Impostazione di una variabile nella sessione di un utente:
session_start();
$_SESSION['Foo'] = 'Bar';
In una richiesta successiva dello stesso utente:
session_start();
print $_SESSION['Foo']; // prints Bar
Per impostazione predefinita, il runtime di App Engine utilizza memcache per archiviare le informazioni
sulla sessione utilizzando la classe
MemcacheSessionHandler. Puoi modificare questo comportamento specificando il tuo gestore di sessione utilizzando il metodo
session_set_save_handler()
di PHP. Memcache consente di salvare e recuperare rapidamente i dati di sessione, il che significa che l'overhead della richiesta è minimo. Tuttavia, la memcache di App Engine
potrebbe essere svuotata periodicamente, il che significa che tutte le informazioni sulla sessione andranno
perse. Per sessioni di durata più lunga, potrebbe essere preferibile utilizzare un servizio di archiviazione alternativo come Cloud SQL.
Chiavi $_SERVER speciali
PHP rende disponibile l'array speciale $_SERVER[] nell'ambito della richiesta. Oltre ai parametri CGI standard, App Engine aggiunge alcune chiavi utili aggiuntive.
APPLICATION_ID: l'app_id dell'applicazione impostato al momento della creazione dell'app. Ad es. my-wordpressAUTH_DOMAIN: il dominio utilizzato per l'autenticazione degli utenti con l'API Users. Le app ospitate su appspot.com hanno un AUTH_DOMAIN di gmail.com e accettano qualsiasi Account Google. Le app ospitate su un dominio personalizzato che utilizza Google Workspace hanno un AUTH_DOMAIN uguale al dominio personalizzatoCURRENT_VERSION_ID: la versione principale e secondaria dell'applicazione attualmente in esecuzione, nel formato "X.Y". Il numero di versione principale ("X") è specificato nel file app.yaml dell'app. Il numero di versione secondaria ("Y") viene impostato automaticamente quando ogni versione dell'app viene caricata su App Engine. Sul server web di sviluppo, la versione secondaria è sempre "1".DEFAULT_VERSION_HOSTNAME: il nome host della versione predefinita di questa applicazione, ad es. my-php-app.uc.r.appspot.com.HTTP_X_APPENGINE_CITY- Nome della città da cui ha avuto origine la richiesta. Ad esempio, una richiesta della città di Mountain View potrebbe avere il valore dell'intestazione mountain view.HTTP_X_APPENGINE_CITYLATLONG: latitudine e longitudine della città da cui ha avuto origine la richiesta. Questa stringa potrebbe essere simile a "37.386051,-122.083851" per una richiesta da Mountain View.HTTP_X_APPENGINE_COUNTRY: il paese di origine della richiesta, come codice paese ISO 3166-1 alpha-2. App Engine determina questo codice dall'indirizzo IP del client.HTTP_X_APPENGINE_REGION: nome della regione da cui ha avuto origine la richiesta. Questo valore ha senso solo nel contesto del paese inX-Appengine-Country. Ad esempio, se il paese è "US" e la regione è "ca", "ca" indica la California, non il Canada.USER_EMAIL: restituisce l'indirizzo email dell'utente, se è stato autenticato utilizzando l'API Users. Le applicazioni devono utilizzare il nickname per i nomi visualizzabili.USER_ID: se l'indirizzo email è associato a un Account Google, user_id restituisce l'ID permanente univoco dell'utente, una stringa. Se l'utente è stato autenticato utilizzando l'API Users. Questo ID è sempre lo stesso per l'utente, indipendentemente dal fatto che l'utente modifichi il proprio indirizzo email.USER_IS_ADMIN- 1 se l'utente che ha eseguito l'accesso è anche un amministratore dell'applicazione, se è stato autenticato utilizzando l'API Users. 0 altrimenti.USER_NICKNAME: per gli utenti di Account Google, il nickname è la parte "nome" dell'indirizzo email dell'utente se l'indirizzo si trova nello stesso dominio dell'applicazione oppure l'indirizzo email completo dell'utente.USER_ORGANIZATION- Un'applicazione che utilizza l'impostazione Account Google può determinare se l'utente attualmente connesso utilizza un Account Google personale o un account gestito da un dominio Google Workspace.
Comportamento aggiornato di PHP_SELF e SCRIPT_NAME nella versione 1.9.0
L'implementazione di $_SERVER['SCRIPT_NAME'] e $_SERVER['PHP_SELF' prima della versione 1.9.0 differisce in modo significativo dalla versione 1.9.0 e successive. Le modifiche sono state apportate
per essere coerenti con l'implementazione Apache generalmente prevista dalle applicazioni PHP.
I seguenti esempi mostrano la differenza.
| Prima della versione 1.9.0 | Dopo la versione 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 |
Direttive con nuovi valori predefiniti di inizializzazione
Questa tabella specifica le direttive la cui inizializzazione predefinita differisce da quelle fornite con l'interprete PHP standard disponibile su php.net. Puoi eseguire l'override di queste direttive predefinite includendole in un file php.ini per la tua applicazione.
| Direttiva | Valore predefinito in 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 |
Funzioni disattivate
Per motivi di sicurezza o per compatibilità con l'ambiente di esecuzione di App Engine, alcune funzioni PHP sono state disattivate. Alcune di queste funzioni possono essere riattivate esplicitamente nel file php.ini per la tua applicazione.
Funzioni disattivate definitivamente
Le seguenti funzioni sono state disattivate definitivamente in 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 non include l'estensione pcntl e pertanto le funzioni fornite da pcntl non sono disponibili per le app PHP in esecuzione in App Engine.
Supporto di tempnam() e sys_get_temp_dir()
Le app App Engine vengono eseguite in una sandbox di sicurezza che non consente la scrittura
nel file system locale. Per questo motivo, la versione di App Engine di
tempnam() restituisce un
file temporaneo in memoria che può essere scritto in una soluzione di archiviazione permanente come
bucket Google Cloud Storage
in un secondo momento.
Ecco un esempio di come scrivere nel file temporaneo in memoria utilizzando
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);
L'output previsto dell'esempio sarebbe quindi:
hello world
Funzioni parzialmente limitate
Il runtime App Engine per PHP non supporta il modificatore di pattern /e delle funzioni preg_replace() e mb_ereg_replace(). Consulta la documentazione relativa a
PREG_REPLACE_EVAL
per l'avviso di ritiro e un esempio di come aggiornare il codice per utilizzare preg_replace_callback().
Funzioni che possono essere attivate manualmente
Questo elenco specifica la funzione PHP che deve essere abilitata manualmente utilizzando la direttiva google_app_engine.enable_functions nel file php.ini per la tua applicazione.
gc_collect_cycles(),gc_enable(),gc_disable()egc_enabled()getmypid()getmyuid()egetmygid()getrusage()getmyinode()get_current_user()libxml_disable_entity_loader()*parse_str()phpinfo()phpversion()php_uname()php_sapi_name()
Puoi anche disattivare manualmente le funzioni utilizzando la direttiva
disable_functions nel file php.ini per la tua applicazione.
Funzioni che richiedono l'abilitazione della fatturazione
Le seguenti funzioni utilizzano i socket e pertanto sono disponibili solo per le app con fatturazione abilitata.
- tutte le funzioni di rete, ad eccezione di
gethostname() - tutte le funzioni di socket
- tutte le funzioni FTP
- cURL, a meno che non utilizzi cURL Lite
Connessioni TCP/IP ai server MySQL (Cloud SQL può essere utilizzato solo con un socket UNIX)
Supporto dello streaming
Wrapper di flussi I/O PHP supportati
Sono supportati i seguenti wrapper di stream I/O PHP:
- php://input
- php://output
- php://memory
- php://temp
Wrapper di stream
Molte funzioni in PHP, come fopen() o file_get_contents(), sfruttano l'interfaccia di flussi di PHP per supportare diversi protocolli.
Di seguito è riportato un elenco di wrapper di stream integrati che vengono registrati automaticamente e sono disponibili nel runtime App Engine.
file://glob://http://(si comporta come il gestore di stream HTTP integrato di PHP, ma utilizza il servizio URLfetch di App Engine)https://(utilizza il servizio URLfetch di App Engine)ftp://gs://(il gestore di stream per Google Cloud Storage)zlib://
Di seguito è riportato un elenco di gestori di stream integrati non supportati in App Engine e che sono stati annullati.
data://expect://ogg://phar://rar://ssh2://
Trasporti di stream disattivati
I seguenti trasporti di stream sono stati disattivati.
sslsslv2sslv3tcptlsudgudpunix
PHP puro
Tutto il codice per l'ambiente di runtime PHP deve essere PHP puro. App Engine non ti consente di caricare le tue estensioni C.
L'ambiente include la libreria standard PHP. Alcune estensioni sono state disattivate perché le loro funzioni principali non sono supportate da App Engine, come la rete e la scrittura nel file system.
Puoi includere altre librerie PHP pure nella tua applicazione inserendo il codice nella directory dell'applicazione, ovvero la stessa directory che contiene il file app.yaml.
Ad esempio, puoi creare un link simbolico nella directory dell'applicazione che rimanda alla directory di una libreria. Il link viene quindi seguito e la libreria viene inclusa nell'applicazione quando esegui il deployment su App Engine.
Puoi anche includere librerie PHP specificando direttive php.ini e includendo istruzioni PHP include nel codice. Tuttavia, l'alternativa
preferita è utilizzare uno strumento di gestione delle dipendenze PHP come
Composer.
Esempi:
Se includi la directory principale dell'applicazione nella direttiva
include_pathdel filephp.ini:include_path=".:/[ROOT_DIR]/myapp"Puoi quindi utilizzare le istruzioni
includeoinclude_onceper includere i file PHP relativi ainclude_path:include_once 'myfile.php';Se scegli di utilizzare Composer per includere le tue librerie PHP pure, puoi semplicemente includere un singolo file dopo l'installazione delle dipendenze:
require_once 'vendor/autoload.php';Quando utilizzi Composer per installare le dipendenze dell'applicazione, tutti i pacchetti vengono aggiunti alla directory dell'applicazione in
vendor, dove viene generato anche il fileautoload.php.
Strumenti
L'SDK per App Engine include strumenti per testare l'applicazione e caricare i file dell'applicazione.
Il server di sviluppo esegue l'applicazione sul computer locale per testarla.
Lo strumento gcloud
gestisce tutte le interazioni da riga di comando con l'applicazione in esecuzione su App
Engine. Utilizzi gcloud app deploy per caricare l'applicazione in
App Engine o per aggiornare i singoli file di configurazione. Puoi anche
visualizzare i dati di log della tua app, in modo da analizzarne il rendimento utilizzando i tuoi
strumenti.
Codice sorgente dell'interprete PHP
Puoi scaricare il codice sorgente dell'interprete PHP di App Engine dal repository appengine-php su GitHub.
Concorrenza e latenza
La latenza della tua applicazione ha il maggiore impatto sul numero di istanze necessarie per gestire il traffico. Se elabori le richieste rapidamente, una singola istanza può gestirne molte.
Variabili di ambiente
Le seguenti variabili di ambiente vengono impostate dal runtime:
| Variabile di ambiente | Descrizione |
|---|---|
GAE_APPLICATION
|
L'ID della tua applicazione App Engine. Questo ID ha il prefisso "region code~", ad esempio "e~" per le applicazioni di cui è stato eseguito il deployment in Europa. |
GAE_DEPLOYMENT_ID |
L'ID del deployment corrente. |
GAE_ENV |
L'ambiente App Engine. Imposta su standard. |
GAE_INSTANCE |
L'ID dell'istanza su cui è attualmente in esecuzione il servizio. |
GAE_RUNTIME |
Il runtime specificato nel file app.yaml. |
GAE_SERVICE |
Il nome del servizio specificato nel file app.yaml. Se non viene specificato alcun nome del servizio, viene impostato su default. |
GAE_VERSION |
L'etichetta della versione attuale del servizio. |
GOOGLE_CLOUD_PROJECT |
L'ID progetto Google Cloud associato alla tua applicazione. |
PORT |
La porta che riceve le richieste HTTP. |
Puoi definire variabili di ambiente aggiuntive nel file app.yaml,
ma i valori riportati sopra non possono essere sostituiti.