Accedere ai servizi in bundle legacy per PHP

Questa pagina descrive come installare e utilizzare i servizi in bundle con il runtime PHP per l' ambiente standard di App Engine. La tua app può accedere ai servizi in bundle tramite l'SDK dei servizi App Engine per PHP.

Prima di iniziare

  1. Consulta l'elenco delle API dei servizi in bundle legacy che puoi chiamare nel runtime PHP.

  2. Aggiorna il file app.yaml per specificare uno o più servizi in bundle legacy. Ad esempio:

    app_engine_bundled_services:
    - memcache
    - urlfetch
    
  3. Per testare l'app PHP, devi eseguirne il deployment utilizzando gcloud app deploy.

Installare l'SDK App Engine per PHP

Puoi trovare l'SDK App Engine per PHP su GitHub all'indirizzo appengine-php-sdk. Devi utilizzare la versione 2.1 o successive per PHP 8.1+ e la versione 2.0.1 o successive per PHP 7.x.

Esistono due modi per incorporare l'SDK nel tuo progetto:

  1. Esegui il comando Packagist per aggiungere l'SDK al file composer.json:

    composer require google/appengine-php-sdk
    
  2. Crea manualmente un file composer.json con i seguenti dettagli:

    PHP 7/8

    {
        "require": {
            "google/appengine-php-sdk": "^2.1" // Or any later version
        }
    }
    

In PHP, le API App Engine richiedono una specifica di dipendenza esplicita. Consulta questo documento per istruzioni su come includere autoload.php.

Importare le librerie

Utilizza l'operatore use per importare la classe di cui hai bisogno dall'elenco delle API disponibili. Ad esempio, Google\AppEngine\Api\AppIdentity\ClassName può essere importato con l'istruzione:

use Google\AppEngine\Api\AppIdentity\ClassName;

Considerazioni sulla migrazione

App Identity

Non devi apportare modifiche alla configurazione dell'app durante l'upgrade a PHP. Il comportamento, le funzionalità e le istruzioni di configurazione dell'API App Identity rimangono invariati. Per ulteriori dettagli, consulta la panoramica dell'API Identity e la guida di riferimento dell'API App Identity.

Posta

L'API Mail PHP rimane in gran parte la stessa dell'API Mail PHP 5, con alcune lievi differenze su come abilitare e disabilitare i servizi Mail. Le sezioni seguenti illustrano le differenze tra i due runtime.

Classe Message

In PHP, la classe Message funziona come in PHP 5.5, tranne per gli import use che sono stati aggiornati. Le differenze sono le seguenti:

PHP 5.5

use google\appengine\api\mail\Message;

PHP 7/8

use Google\AppEngine\Api\Mail\Message;

Se non riesci a modificare le istruzioni di importazione, l'istruzione di importazione PHP 5.5 originale funzionerà anche per PHP.

Funzione Mail

In PHP 5.5, la funzione PHP nativa mail() è stata sottoposta a overload dalla funzione Mail di App Engine.

In PHP, la funzione Mail di App Engine non è più sottoposta a overload per impostazione predefinita e deve essere abilitata in modo esplicito. Questo nuovo comportamento ti consente di riutilizzare la funzione Mail per soddisfare meglio le tue esigenze. Questa modifica ti consente anche di avere visibilità su quale implementazione viene attualmente utilizzata per tutte le chiamate alla funzione Mail.

Se preferisci utilizzare la funzione mail() PHP nativa per inviare email utilizzando l'API Mail di App Engine, puoi abilitarla nel file php.ini come segue:

extension = mailparse.so
sendmail_path = "php ./vendor/google/appengine-php-sdk/src/Runtime/SendMail.php -t -i"

Come mostrato nell'esempio precedente, aggiungi l'estensione mailparse per abilitare la funzione mail PHP nativa e imposta la configurazione del runtime sendmail_path sull'implementazione della funzione Mail di App Engine. Dopo aver abilitato questa opzione, tutte le chiamate a mail() funzioneranno esattamente come in PHP 5.5.

Per ulteriori dettagli, consulta le guide Invio di email e Ricezione di email e la guida di riferimento dell'API Mail.

Memcache

Per utilizzare Memcache per PHP, devi aggiungere una dichiarazione esplicita delle librerie Memcache. In precedenza, Memcache per PHP 5.5 non richiedeva una dichiarazione esplicita. Questa dichiarazione esplicita consente di passare in modo flessibile tra Memcache PHP nativo e Memcache App Engine.

Le classi Memcache PHP hanno lo stesso comportamento delle classi Memcache PHP 5, ad eccezione della dichiarazione esplicita. Per ulteriori dettagli, consulta la panoramica di Memcache.

PHP 5.5

Esempio di Memcache per PHP 5.5:

$memcache = new Memcache();
return $memcache->get($key);

Esempio di Memcached per PHP 5.5:

$memcache = new Memcached();
$memcache->set('who', $request->get('who'));
return $twig->render('memcache.html.twig', [
    'who' => $request->get('who'),
    'count' => $memcache->increment('count', 1, 0),
    'host' => $request->getHost(),
]);

PHP 7/8

Esempio di API Memcache per PHP:

use Google\AppEngine\Api\Memcache\Memcache;

$memcache = new Memcache();
return $memcache->get($key);

Esempio di API Memcached per PHP:

use Google\AppEngine\Api\Memcache\Memcached;

$memcache = new Memcached();
$memcache->set('who', $request->get('who'));
return $twig->render('memcache.html.twig', [
    'who' => $request->get('who'),
    'count' => $memcache->increment('count', 1, 0),
    'host' => $request->getHost(),
]);

Se preferisci utilizzare il comportamento originale di Memcache per PHP 5 in PHP, puoi continuare a chiamare Memcache in modo implicito includendo alcune righe aggiuntive nel file composer.json. Dopo aver importato il pacchetto appengine-php-sdk da Composer, aggiungi il seguente percorso del file di attivazione all'elemento files nella sezione autoload:

PHP 7/8

{
  "require": {
    "google/appengine-php-sdk": "^2.1" // Or any later version
  },
  "autoload": {
    "files": [
    "./vendor/google/appengine-php-sdk/src/Api/Memcache/MemcacheOptIn.php"
    ]
  }
}

Moduli

Non devi apportare modifiche alla configurazione dell'app durante l'upgrade a PHP. Il comportamento, le funzionalità e le istruzioni di configurazione dell'API Modules rimangono invariati. Per ulteriori dettagli, consulta la panoramica dei moduli e la guida di riferimento dell'API Modules.

Sessione

Le sessioni PHP funzionano allo stesso modo delle sessioni PHP 5.5. Tuttavia, le istruzioni di configurazione sono diverse perché le sessioni PHP 5.5 utilizzavano la classe MemcacheSessionHandler per impostazione predefinita.

Per utilizzare le sessioni per PHP, devi registrare la MemcacheSessionHandler classe con session_set_save_handler() e configurare session.save_path su Memcache. Dovresti anche attivare Memcache quando accedi alle informazioni di Memcache.

Ad esempio:

PHP 7/8

ini_set('session.save_path', 'Google\AppEngine\Api\Memcache\Memcache');
session_set_save_handler(new Google\AppEngine\Ext\Session\MemcacheSessionHandler(), true);

Per ulteriori dettagli, consulta la guida di riferimento dell'API Session.

Coda di attività

Non devi apportare modifiche alla configurazione dell'app durante l'upgrade a PHP. Il comportamento, le funzionalità e le istruzioni di configurazione della coda di attività rimangono invariati. Per ulteriori dettagli, consulta la sezione Sessioni nella guida Panoramica della coda di attività e nella guida di riferimento dell'API Task Queue.

Recupero URL

Per utilizzare il recupero URL per PHP, devi aggiungere una dichiarazione esplicita delle librerie di recupero URL. In precedenza, il servizio di recupero URL per PHP 5 non richiedeva una dichiarazione esplicita e veniva utilizzato in modo implicito.

In PHP 5, il servizio di recupero URL di App Engine era l'unico modo per recuperare contenuti internet in PHP 5.5, quindi la maggior parte delle funzioni PHP 5.5 che accedevano a internet sono state corrette per utilizzare UrlFetch automaticamente.

In PHP, la rete PHP nativa può accedere a internet, quindi questa correzione automatica non viene eseguita. In alcuni casi, puoi utilizzare il meccanismo UrlFetch originale, in particolare il meccanismo che fornisce l' X-Appengine-Inbound-Appid intestazione della richiesta per identificare l'app App Engine che sta effettuando una richiesta alla tua app App Engine.

Per abilitare il recupero URL per PHP, puoi utilizzare una dichiarazione esplicita nel wrapper dello stream oppure utilizzare direttamente la classe UrlFetch, come descritto nelle sezioni seguenti.

Opzione 1a. Gestori di stream

Puoi abilitare il servizio di recupero URL di App Engine per effettuare richieste HTTP ai gestori di stream PHP http:// e https://. A tal fine:

  1. Annulla la registrazione del gestore di stream PHP nativo per HTTP(S) utilizzando stream_wrapper_unregister().
  2. Registra HTTP(S) nella UrlFetchStream classe utilizzando stream_wrapper_register().
  3. Chiama file_get_contents() con la configurazione che vuoi utilizzare il wrapper dello stream.

Per un confronto, consulta gli esempi equivalenti per PHP 5 e PHP:

PHP 5.5

...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

// Using Url Fetch service. No option to use the native php stream wrapper.
$result = file_get_contents('http://example.com', false, $context);
echo $result;

PHP 7/8

use google\appengine\api\urlfetch\UrlFetchStream;
...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

// Using the native php stream wrapper.
$result = file_get_contents('http://example.com', false, $context);
echo $result;

stream_wrapper_unregister("http");
stream_wrapper_register("http", "UrlFetchStream");

// Now using the Url Fetch service.
$result = file_get_contents('http://example.com', false, $context);
echo $result;

stream_wrapper_unregister("http");
stream_wrapper_restore("http");

// Now using the native php stream wrapper again.

Opzione 1b. Intestazioni della risposta HTTP con gestori di stream

Le istruzioni per l'utilizzo delle intestazioni della risposta HTTP(S) con i gestori di stream sono simili alle istruzioni per l'utilizzo dei gestori di stream:

  1. Annulla la registrazione del gestore di stream PHP nativo per HTTP(S) utilizzando stream_wrapper_unregister().
  2. Registra HTTP(S) nella classe UrlFetchStream utilizzando stream_wrapper_register().
  3. Utilizza fopen() anziché file_get_contents() con la configurazione che preferisci.
  4. Chiama stream_get_meta_data() ed estrai le informazioni dell'intestazione della risposta indicizzando i metadati per 'wrapper_data. Le intestazioni della risposta vengono restituite in un formato di array simile a quello di $http_response_header in PHP 5.5.

PHP 5.5

...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

// Using file_get_contents and the Url Fetch service.
$result = file_get_contents('http://example.com', false, $context);

// Print Http Response Headers
print_r($http_response_header);

PHP 7/8

use google\appengine\api\urlfetch\UrlFetchStream;
...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

stream_wrapper_unregister("http");
stream_wrapper_register("http", "UrlFetchStream");

// Now using fopen and the Url Fetch service.
$result = fopen('http://example.com', 'r', false, $context);

// Print Http Response Headers
$meta_data = stream_get_meta_data($result);
$headers = $meta_data['wrapper_data'];
print_r($headers);

stream_wrapper_unregister("http");
stream_wrapper_restore("http");

Opzione 2. Classe UrlFetch

La classe UrlFetch è una classe personalizzata che fornisce un modo più mirato di utilizzare il servizio di recupero URL per una richiesta HTTP(S) in un ambito più piccolo. A differenza dell'opzione del gestore di stream, la classe UrlFetch non esegue l'override di tutte le richieste HTTP(S) effettuate dalle funzioni compatibili con il wrapper dello stream per utilizzare il servizio di recupero URL. Rispetto all'opzione del gestore di stream, anche la configurazione della classe UrlFetch è più semplice, in quanto non richiede l'utilizzo di varie API PHP come:

  • stream_context_create()
  • stream_wrapper_unregister()
  • stream_wrapper_register()
  • file_get_contents()

L'esempio seguente della classe UrlFetch è equivalente all'esempio del gestore di stream:

PHP 7/8

use google\appengine\api\urlfetch\UrlFetch;
...
$urlfetch = new UrlFetch();
$result = $urlfetch->fetch($url, 'POST', $headers, http_build_query($data));
echo $result->getContent();

Utenti

Non devi apportare modifiche alla configurazione dell'app durante l'upgrade a PHP. Il comportamento, le funzionalità e le istruzioni di configurazione dell'API Users rimangono invariati. Per ulteriori dettagli, consulta la panoramica dell'API Users e la guida di riferimento dell'API Users.

Librerie fornite dalla community

Puoi utilizzare l'API fornita dalla community per datastore durante l'upgrade a PHP.

Altre considerazioni

  • Per testare la funzionalità dei servizi in bundle legacy nella tua app PHP, puoi utilizzare il server di sviluppo locale. Quando esegui il comando dev_appserver.py, imposta l'argomento --php_executable_path su un eseguibile PHP. Tieni presente che è diverso da PHP 5, che richiede un eseguibile php-cgi.

    Se il progetto ha un file composer.json, imposta --php-composer-path sul percorso del file composer.phar.

  • Per eseguire il deployment dell'app, utilizza il gcloud app deploy comando.

  • L'accesso al runtime PHP segue lo standard di logging in Cloud Logging. Nel runtime PHP, i log dell'app non sono più raggruppati con i log delle richieste, ma sono separati in record diversi. Per saperne di più sulla lettura e la scrittura dei log, consulta la guida Scrittura e visualizzazione dei log.

Esempi

Per vedere esempi di come utilizzare i servizi in bundle legacy con PHP, scarica gli esempi di codice.