Mengakses paket layanan lama untuk PHP

Halaman ini menjelaskan cara menginstal dan menggunakan paket layanan dengan runtime PHP untuk lingkungan standar App Engine. Aplikasi Anda dapat mengakses paket layanan melalui SDK layanan App Engine untuk PHP.

Sebelum memulai

  1. Lihat daftar API layanan paket lama yang dapat Anda panggil di runtime PHP.

  2. Update file app.yaml Anda untuk menyertakan baris berikut:

    app_engine_apis: true
    
  3. Untuk menguji aplikasi PHP, Anda harus men-deploy-nya menggunakan gcloud app deploy.

Menginstal SDK App Engine PHP

Anda dapat menemukan SDK App Engine PHP pada GitHub di appengine-php-sdk. Anda harus menggunakan versi 2.1 atau yang lebih baru untuk PHP 8.1+ dan versi 2.0.1 atau yang lebih baru untuk PHP 7.x.

Ada dua cara untuk menyertakan SDK ke dalam project Anda:

  1. Jalankan perintah Packagist untuk menambahkan SDK ke file composer.json Anda:

    composer require google/appengine-php-sdk
    
  2. Buat file composer.json secara manual dengan detail berikut:

    PHP 7/8

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

Di PHP, API App Engine memerlukan spesifikasi dependensi eksplisit. Lihat dokumen ini untuk mengetahui petunjuk tentang cara menyertakan autoload.php.

Mengimpor library

Gunakan operator use untuk mengimpor class yang Anda perlukan dari daftar API yang tersedia. Misalnya, Google\AppEngine\Api\AppIdentity\ClassName dapat diimpor dengan pernyataan:

use Google\AppEngine\Api\AppIdentity\ClassName;

Pertimbangan migrasi

Identitas Aplikasi

Anda tidak perlu mengubah konfigurasi aplikasi saat mengupgrade ke PHP. Perilaku, fitur, dan petunjuk penyiapan untuk App Identity API tetap sama. Baca Ringkasan API Identity dan Panduan referensi App Identity API untuk mengetahui detail selengkapnya.

Email

Mail API PHP sebagian besar sama seperti PHP 5 Mail API, dengan sedikit perbedaan mengenai cara mengaktifkan dan menonaktifkan layanan Email. Bagian berikut membahas perbedaan antara kedua runtime.

Class pesan

Di PHP, class Message berfungsi sama seperti di PHP 5.5, kecuali impor use yang telah diperbarui. Perbedaannya adalah sebagai berikut:

PHP 5.5

use google\appengine\api\mail\Message;

PHP 7/8

use Google\AppEngine\Api\Mail\Message;

Jika Anda tidak dapat mengubah pernyataan impor, pernyataan impor PHP 5.5 asli juga akan berfungsi untuk PHP.

Fungsi email

Pada PHP 5.5, fungsi mail() PHP native mengalami kelebihan beban akibat fungsi Email App Engine.

Di PHP, fungsi Email App Engine tidak lagi kelebihan beban secara default, dan harus diaktifkan secara eksplisit. Dengan perilaku baru ini, Anda dapat menggunakan kembali fungsi Email agar lebih sesuai dengan kebutuhan Anda. Perubahan ini juga memungkinkan Anda mendapatkan visibilitas terkait implementasi yang saat ini digunakan untuk semua panggilan fungsi Email.

Jika lebih suka menggunakan fungsi mail() PHP native untuk mengirim email menggunakan App Engine Mail API, Anda dapat mengaktifkannya di file php.ini sebagai berikut:

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

Seperti pada contoh sebelumnya, tambahkan ekstensi mailparse untuk mengaktifkan fungsi email PHP native, dan tetapkan konfigurasi runtime sendmail_path ke implementasi fungsi Email App Engine. Setelah diaktifkan, semua panggilan ke mail() akan berfungsi sama persis seperti di PHP 5.5.

Baca panduan Mengirim email dan Menerima email, serta panduan referensi Mail API untuk mengetahui detail selengkapnya.

Memcache

Agar dapat menggunakan Memcache untuk PHP, Anda perlu menambahkan deklarasi eksplisit dari library Memcache. Sebelumnya, Memcache untuk PHP 5.5 tidak memerlukan deklarasi eksplisit. Deklarasi eksplisit ini memungkinkan fleksibilitas untuk beralih antara Memcache PHP native dan Memcache App Engine.

Class Memcache PHP memiliki perilaku yang sama dengan class Memcache PHP 5, dengan pengecualian pada deklarasi eksplisit. Baca Ringkasan Memcache untuk detail selengkapnya.

PHP 5.5

Contoh Memcache untuk PHP 5.5:

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

Contoh Memcached untuk 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

Contoh Memcache API untuk PHP:

use Google\AppEngine\Api\Memcache\Memcache;

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

Contoh Memcached API untuk 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(),
]);

Jika lebih suka menggunakan perilaku asli Memcache untuk PHP 5 di PHP, Anda dapat terus memanggil Memcache secara implisit dengan menyertakan beberapa baris lagi dalam file composer.json. Setelah mengimpor paket appengine-php-sdk dari composer, tambahkan jalur file keikutsertaan berikut ke elemen files di bagian 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"
    ]
  }
}

Modul

Anda tidak perlu mengubah konfigurasi aplikasi saat mengupgrade ke PHP. Perilaku, fitur, dan petunjuk penyiapan untuk Modules API tetap sama. Baca Ringkasan Modul dan Panduan referensi Modules API untuk mengetahui detail selengkapnya.

Sesi

Sesi PHP berfungsi dengan cara yang sama seperti Sesi PHP 5.5. Namun, petunjuk penyiapannya berbeda karena Sesi PHP 5.5 menggunakan class MemcacheSessionHandler secara default.

Agar dapat menggunakan Sesi untuk PHP, Anda harus mendaftarkan class MemcacheSessionHandler dengan session_set_save_handler() dan mengonfigurasi session.save_path ke Memcache. Anda juga harus memilih untuk menggunakan Memcache saat mengakses informasi Memcache.

Contoh:

PHP 7/8

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

Baca Panduan referensi Session API untuk mengetahui detail selengkapnya.

Antrean Tugas

Anda tidak perlu mengubah konfigurasi aplikasi saat mengupgrade ke PHP. Perilaku, fitur, dan petunjuk penyiapan untuk Task Queue tetap sama. Lihat bagian Sesi di panduan Ringkasan Task Queue dan Panduan referensi Task Queue API untuk mengetahui detail selengkapnya.

URL Fetch

Agar dapat menggunakan URL Fetch untuk PHP, Anda perlu menambahkan deklarasi eksplisit dari library URL-fetch. Sebelumnya, layanan URL-fetch untuk PHP 5 tidak memerlukan deklarasi eksplisit dan digunakan secara implisit.

Di PHP 5, layanan URL-fetch App Engine adalah satu-satunya cara untuk mengambil konten internet di PHP 5.5, sehingga sebagian besar fungsi PHP 5.5 yang mengakses internet di-patch untuk menggunakan UrlFetch secara otomatis.

Di PHP, jaringan PHP native dapat mengakses internet, sehingga patching otomatis ini tidak dilakukan. Dalam beberapa kasus, Anda dapat menggunakan mekanisme UrlFetch asli, khususnya mekanisme yang menyediakan header permintaan X-Appengine-Inbound-Appid untuk mengidentifikasi aplikasi App Engine yang membuat permintaan ke aplikasi App Engine Anda.

Untuk mengaktifkan URL-fetch untuk PHP, Anda dapat menggunakan deklarasi eksplisit di wrapper aliran data, atau langsung menggunakan class UrlFetch, yang dijelaskan di bagian berikut.

Opsi 1a. Pengendali aliran data

Anda dapat mengaktifkan layanan URL-fetch App Engine untuk membuat permintaan HTTP ke pengendali aliran data PHP http:// dan https://. Untuk melakukan ini:

  1. Batalkan pendaftaran pengendali aliran data PHP native untuk HTTP(S) menggunakan stream_wrapper_unregister().
  2. Daftarkan HTTP(S) ke class UrlFetchStream menggunakan stream_wrapper_register().
  3. Panggil file_get_contents() dengan konfigurasi yang Anda inginkan untuk menggunakan wrapper aliran data.

Sebagai perbandingan, lihat contoh yang sebanding untuk PHP 5 dan 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.

Opsi 1b. Header respons HTTP dengan pengendali aliran data

Petunjuk untuk menggunakan header respons HTTP(S) dengan pengendali aliran data serupa dengan petunjuk untuk menggunakan pengendali aliran data:

  1. Batalkan pendaftaran pengendali aliran data PHP native untuk HTTP(S) menggunakan stream_wrapper_unregister().
  2. Daftarkan HTTP(S) ke class UrlFetchStream menggunakan stream_wrapper_register().
  3. Gunakan fopen(), bukan file_get_contents(), dengan konfigurasi yang Anda inginkan.
  4. Panggil stream_get_meta_data() dan ekstrak informasi header respons dengan mengindeks metadata untuk 'wrapper_data. Header respons ditampilkan dalam bentuk array yang mirip dengan $http_response_header di 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");

Opsi 2. Class UrlFetch

Class UrlFetch adalah class kustom yang menyediakan cara yang lebih spesifik dalam menggunakan layanan URL-fetch untuk permintaan HTTP(S) pada cakupan yang lebih kecil. Tidak seperti opsi pengendali aliran data, class UrlFetch tidak mengabaikan semua permintaan HTTP(S) yang dibuat dari fungsi yang kompatibel dengan wrapper aliran data untuk menggunakan layanan URL-fetch. Dibandingkan dengan opsi pengendali aliran data, konfigurasi class UrlFetch juga lebih sederhana karena tidak memerlukan penggunaan berbagai API PHP seperti:

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

Contoh Class UrlFetch berikut sebanding dengan contoh pengendali aliran data:

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();

Pengguna

Anda tidak perlu mengubah konfigurasi aplikasi saat mengupgrade ke PHP. Perilaku, fitur, dan petunjuk penyiapan untuk Users API tetap sama. Baca Ringkasan User API dan Panduan referensi Users API untuk mengetahui detail selengkapnya.

Library kontribusi komunitas

Anda dapat menggunakan API kontribusi komunitas untuk datastore saat mengupgrade ke PHP.

Pertimbangan lainnya

  • Untuk menguji fungsi paket layanan lama di aplikasi PHP, Anda dapat menggunakan server pengembangan lokal. Saat menjalankan perintah dev_appserver.py, tetapkan argumen --php_executable_path ke file PHP yang dapat dieksekusi. Perlu diperhatikan bahwa ini berbeda dari PHP 5 yang memerlukan file php-cgi yang dapat dieksekusi.

    Jika project memiliki file composer.json, tetapkan --php-composer-path ke jalur file composer.phar.

  • Untuk men-deploy aplikasi Anda, gunakan perintah gcloud app deploy.

  • Logging di runtime PHP mengikuti standar logging di Cloud Logging. Pada runtime PHP, log aplikasi tidak lagi dipaketkan dengan log permintaan, tetapi dipisahkan dalam kumpulan data yang berbeda. Untuk mempelajari lebih lanjut cara membaca dan menulis log, baca Panduan menulis dan melihat log.

Contoh

Untuk melihat contoh cara menggunakan paket layanan lama dengan PHP, download contoh kode.