Lingkungan runtime PHP 7/8

Runtime PHP adalah stack software yang bertanggung jawab untuk menginstal kode layanan web Anda dan dependensinya serta menjalankan layanan Anda.

Untuk menentukan PHP 7/8 bagi lingkungan standar App Engine, deklarasikan runtime dalam file app.yaml. Contoh:

runtime: phpVERSION

Dengan VERSION adalah nomor versi MAJOR MINOR PHP. Misalnya, PHP 8.3 menggunakan 83.

Untuk versi PHP lainnya yang didukung, dan versi Ubuntu yang sesuai dengan versi PHP Anda, lihat Jadwal dukungan runtime.

Versi PHP

Runtime PHP menggunakan rilis stabil terbaru dari versi yang ditentukan dalam file app.yaml Anda. App Engine otomatis diupdate ke versi rilis patch baru, tetapi versi minornya tidak akan otomatis diupdate.

Misalnya, aplikasi Anda mungkin di-deploy di PHP 7.3.0 dan kemudian akan diupdate secara otomatis ke versi 7.3.1, tetapi tidak akan diupdate secara otomatis ke PHP 7.4.0.

Peluncuran aplikasi

Anda harus men-deploy pengontrol depan untuk menangani semua perutean permintaan.

Contoh berikut menunjukkan berbagai cara untuk melayani aplikasi Anda:

  • Jika aplikasi Anda berisi file public/index.php atau index.php, App Engine akan menggunakan file ini untuk melayani aplikasi.

    Sebaiknya gunakan framework, seperti Laravel, Symfony, atau Slim, karena framework tersebut memberikan perutean yang ringan untuk menulis dan men-deploy aplikasi PHP dengan cepat. Lihat contoh pengontrol depan Slim.

    Namun, jika Anda memigrasikan aplikasi lama, lihat contoh file index.php berikut untuk mengimpor file PHP yang diperlukan dan menerapkan pengontrol depan secara manual:

    switch (@parse_url($_SERVER['REQUEST_URI'])['path']) {
        case '/':
            require 'homepage.php';
            break;
        case '/contact.php':
            require 'contact.php';
            break;
        default:
            http_response_code(404);
            exit('Not Found');
    }
  • Jika Anda menentukan elemen entrypoint opsional di file app.yaml, App Engine akan menggunakan perintah dalam elemen entrypoint untuk melayani aplikasi Anda, bukan menggunakan public/index.php atau index.php:

        entrypoint: serve path/to/my/front/controller.php
    

    Kolom entrypoint menggunakan perintah serve bawaan, yang merupakan program dalam runtime PHP 7/8 yang memulai implementasi php-fpm dan server web di latar belakang. Server web ini mengarahkan semua traffic ke file PHP yang disediakan menggunakan pola desain pengontrol depan.

    Perintah serve memiliki dua flag opsional:

    • --workers=N: menentukan jumlah N dari worker php-fpm. Jika Anda tidak menetapkan flag --workers, perintah serve akan menebak jumlah worker berdasarkan jumlah memori yang tersedia. Untuk hasil terbaik, tetapkan nilai untuk flag --workers pada perintah serve dan elemen max_concurrent_requests ke angka yang sama.

    • --enable-dynamic-workers: menentukan bahwa Anda ingin worker php-fpm dibuat hanya sesuai kebutuhan. Defaultnya adalah menggunakan kebijakan statis untuk worker php-fpm. Anda dapat mengubah jumlah maksimum worker yang dihasilkan menggunakan flag --workers=N. Secara default, jumlah maksimum worker yang dihasilkan akan ditetapkan secara default ke jumlah default yang ditetapkan oleh kebijakan statis.

    Flag opsional harus ditempatkan sebelum jalur pengontrol depan:

        entrypoint: serve --workers=2 --enable-dynamic-workers path/to/index.php
    
  • Anda dapat men-deploy proses worker yang berjalan lama dengan menyetel elemen entrypoint ke jalur file proses worker:

        entrypoint: php long-running-worker-file.php
    

    Jika elemen entrypoint mengeksekusi skrip dengan proses yang berjalan lama, seperti Worker Pub/Sub yang berlangganan ke topik, jangan gunakan perintah serve.

Untuk informasi selengkapnya, lihat referensi app.yaml.

Ekstensi yang diaktifkan

Ekstensi berikut telah diaktifkan di runtime PHP 7/8 untuk 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

Ekstensi yang dapat dimuat secara dinamis

Ekstensi berikut dapat dimuat secara dinamis dengan mengonfigurasi php.ini:

Untuk mengaktifkan ekstensi ini, tambahkan perintah untuk ekstensi tersebut dalam file php.ini di extension, misalnya:

extension=memcached.so
extension=grpc.so
extension=protobuf.so
extension=mongodb.so
extension=imagick.so
extension=opencensus.so
extension=redis.so

Variabel lingkungan

Variabel lingkungan berikut ditetapkan oleh runtime:

Variabel lingkungan Deskripsi
GAE_APPLICATION ID aplikasi App Engine Anda. ID ini diawali dengan 'region code~' seperti 'e~' untuk aplikasi yang di-deploy di Eropa.
GAE_DEPLOYMENT_ID ID deployment saat ini.
GAE_ENV Lingkungan App Engine. Tetapkan ke standard.
GAE_INSTANCE ID instance di mana layanan Anda saat ini berjalan.
GAE_MEMORY_MB Jumlah memori yang tersedia untuk proses aplikasi, dalam MB.
GAE_RUNTIME Runtime yang ditentukan dalam file app.yaml Anda.
GAE_SERVICE Nama layanan yang ditentukan dalam file app.yaml Anda. Jika tidak ada nama layanan yang ditentukan, nama akan ditetapkan ke default.
GAE_VERSION Label versi layanan Anda saat ini.
GOOGLE_CLOUD_PROJECT ID project Google Cloud yang terkait dengan aplikasi Anda.
PORT Port yang menerima permintaan HTTP.
NODE_ENV (Hanya tersedia di runtime Node.js) Tetapkan ke production saat layanan Anda di-deploy.

Anda dapat menentukan variabel lingkungan tambahan dalam file app.yaml, tetapi nilai di atas tidak dapat diganti, kecuali untuk NODE_ENV.

HTTPS dan proxy penerusan

App Engine menghentikan koneksi HTTPS di load balancer dan meneruskan permintaan ke aplikasi Anda. Beberapa aplikasi perlu menentukan IP dan protokol permintaan asli. Alamat IP pengguna tersedia di header X-Forwarded-For standar. Aplikasi yang memerlukan informasi ini harus mengonfigurasi framework webnya untuk memercayai proxy.

Filesystem

Runtime ini menyertakan direktori /tmp yang dapat ditulis, beserta dengan semua direktori lain yang memiliki akses hanya baca. Menulis ke /tmp akan menghabiskan memori sistem. Untuk informasi selengkapnya, lihat dukungan tempnam() dan sys_get_temp_dir().

Server metadata

Setiap instance aplikasi Anda dapat menggunakan server metadata App Engine untuk mengkueri informasi tentang instance dan project Anda.

Anda dapat mengakses server metadata melalui endpoint berikut:

  • http://metadata
  • http://metadata.google.internal

Permintaan yang dikirim ke server metadata harus menyertakan header permintaan Metadata-Flavor: Google. Header ini menunjukkan bahwa permintaan dikirim dengan tujuan mengambil nilai metadata.

Tabel berikut mencantumkan daftar endpoint tempat Anda dapat membuat permintaan HTTP untuk metadata tertentu:

Endpoint metadata Deskripsi
/computeMetadata/v1/project/numeric-project-id Nomor project yang ditetapkan ke project Anda.
/computeMetadata/v1/project/project-id Project ID yang ditetapkan ke project Anda.
/computeMetadata/v1/instance/region Region di mana instance berjalan.
/computeMetadata/v1/instance/service-accounts/default/aliases
/computeMetadata/v1/instance/service-accounts/default/email Email akun layanan default yang ditetapkan ke project Anda.
/computeMetadata/v1/instance/service-accounts/default/ Mencantumkan semua akun layanan default untuk project Anda.
/computeMetadata/v1/instance/service-accounts/default/scopes Mencantumkan semua cakupan yang didukung untuk akun layanan default.
/computeMetadata/v1/instance/service-accounts/default/token Menampilkan token autentikasi yang dapat digunakan untuk mengautentikasi aplikasi Anda ke Google Cloud API lain.

Misalnya, untuk mengambil project ID Anda, kirimkan permintaan ke http://metadata.google.internal/computeMetadata/v1/project/project-id.

Berikut adalah contoh cara memanggil endpoint metadata menggunakan cURL atau Library Klien Google Cloud:

/**
 * Requests a key from the Metadata server using the Google Cloud SDK. Install
 * the Google Cloud SDK by running "composer install google/cloud"
 *
 * @param $metadataKey the key for the metadata server
 */
function request_metadata_using_google_cloud($metadataKey)
{
    $metadata = new Google\Cloud\Core\Compute\Metadata();
    $metadataValue = $metadata->get($metadataKey);

    return $metadataValue;
}

/**
 * Requests a key from the Metadata server using cURL.
 *
 * @param $metadataKey the key for the metadata server
 */
function request_metadata_using_curl($metadataKey)
{
    $url = 'http://metadata/computeMetadata/v1/' . $metadataKey;

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

Sesi

PHP menyediakan lapisan pengelolaan sesi yang memungkinkan aplikasi web mempertahankan informasi status pengguna di antara permintaan. Sesi di App Engine bekerja seperti sesi di aplikasi PHP lainnya.

Untuk menetapkan variabel dalam sesi pengguna, Anda dapat menggunakan kode berikut:

session_start();
$_SESSION['Foo'] = 'Bar';

Kode berikut akan mencetak Bar, pada permintaan berikutnya oleh pengguna yang sama:

session_start();
print $_SESSION['Foo']; // prints Bar

Untuk sesi yang berdurasi lebih lama, gunakan layanan penyimpanan alternatif seperti Cloud SQL.

Kunci $_SERVER khusus

PHP menyediakan array $_SERVER[] khusus dalam cakupan permintaan. Selain parameter CGI standar, App Engine menambahkan beberapa kunci tambahan yang berguna:

  • GAE_APPLICATION - Project ID Google Cloud aplikasi saat ini.
  • GAE_DEPLOYMENT_ID - ID kode sumber yang di-deploy.
  • GAE_ENV - Lingkungan App Engine (standar atau fleksibel) tempat aplikasi Anda berjalan.
  • GAE_INSTANCE - Nama instance yang saat ini melakukan eksekusi.
  • GAE_MEMORY_MB - Jumlah memori yang tersedia untuk proses aplikasi, dalam MB.
  • GAE_RUNTIME - Runtime yang ditentukan dalam file app.yaml Anda, misalnya php72.
  • GAE_SERVICE - Nama layanan yang saat ini di-deploy.
  • GAE_VERSION - Nama versi yang saat ini di-deploy.
  • GOOGLE_CLOUD_PROJECT - Project ID Google Cloud.
  • HTTP_X_APPENGINE_CITY - Nama kota tempat permintaan berasal. Misalnya, permintaan dari kota Mountain View mungkin memiliki nilai header mountain view.
  • HTTP_X_APPENGINE_CITYLATLONG - Lintang dan bujur kota tempat permintaan berasal. String ini mungkin terlihat seperti "37.386051,-122.083851" untuk permintaan dari Mountain View.
  • HTTP_X_APPENGINE_COUNTRY - Negara tempat permintaan berasal, sebagai kode negara ISO 3166-1 alpha-2. App Engine menentukan kode ini dari alamat IP klien.
  • HTTP_X_APPENGINE_HTTPS - Memverifikasi penggunaan HTTPS.
  • HTTP_X_APPENGINE_REGION - Nama region tempat permintaan berasal. Nilai ini hanya dapat digunakan dalam konteks negara di X-Appengine-Country. Misalnya, jika negaranya adalah "US" dan region-nya adalah "ca", "ca" berarti "California", bukan Kanada.
  • HTTP_X_APPENGINE_USER_IP - Alamat IP klien. Perhatikan bahwa $_SERVER['HTTP_X_APPENGINE_USER_IP'] adalah satu-satunya cara aplikasi Anda dapat mengambil alamat IP klien. Variabel $_SERVER['REMOTE_ADDR'] tidak tersedia di App Engine.

Perintah dengan default inisialisasi baru

Tabel berikut menentukan perintah yang default inisialisasinya berbeda dengan yang disediakan oleh penafsir PHP standar yang tersedia dari php.net. Untuk menemukan nilai default untuk perintah yang tidak ditentukan dalam tabel berikut, lihat perintah php.ini.

Perintah Nilai Default di 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

Ganti perintah default ini dengan menyertakannya ke dalam file php.ini untuk aplikasi Anda.

Dukungan tempnam() dan sys_get_temp_dir()

Aplikasi App Engine berjalan di sandbox keamanan di mana hanya direktori /tmp yang dapat ditulis dan disimpan di RAM instance. Karena alasan ini, versi App Engine tempnam() menampilkan file sementara dalam memori yang dapat ditulis ke solusi penyimpanan permanen seperti bucket Cloud Storage.

Berikut adalah contoh cara menulis ke file sementara dalam memori menggunakan file_put_contents() dan 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);

Output yang diharapkan dari contoh tersebut adalah:

hello world

Mengelola Dependensi dengan Composer

Untuk informasi selengkapnya, lihat halaman Menentukan Dependensi.