Runtime PHP adalah stack software yang bertanggung jawab untuk menginstal kode layanan web Anda dan dependensinya serta menjalankan layanan Anda.
Untuk menentukan PHP bagi lingkungan standar App Engine, deklarasikan runtime dalam file app.yaml
. Contoh:
runtime: phpVERSION
Dengan VERSION adalah nomor versi MAJOR
dan MINOR
PHP. Misalnya, untuk menggunakan versi PHP terbaru, PHP 8.3, tentukan 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
atauindex.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:Jika Anda menentukan elemen
entrypoint
opsional di fileapp.yaml
, App Engine akan menggunakan perintah dalam elemenentrypoint
untuk melayani aplikasi Anda, bukan menggunakanpublic/index.php
atauindex.php
:entrypoint: serve path/to/my/front/controller.php
Kolom
entrypoint
menggunakan perintahserve
bawaan, yang merupakan program dalam runtime PHP yang memulai implementasiphp-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 workerphp-fpm
. Jika Anda tidak menetapkan flag--workers
, perintahserve
akan menebak jumlah worker berdasarkan jumlah memori yang tersedia. Untuk hasil terbaik, tetapkan nilai untuk flag--workers
pada perintahserve
dan elemenmax_concurrent_requests
ke angka yang sama.--enable-dynamic-workers
: menentukan bahwa Anda ingin workerphp-fpm
dibuat hanya sesuai kebutuhan. Defaultnya adalah menggunakan kebijakan statis untuk workerphp-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 perintahserve
.
Untuk informasi selengkapnya, lihat referensi app.yaml
.
Ekstensi yang diaktifkan
Ekstensi berikut telah diaktifkan di runtime PHP 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
[opentelemetry]
extension=opentelemetry.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:
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 fileapp.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 diX-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. Oleh karena itu, 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.