Dengan App Engine, Anda dapat membuat aplikasi web menggunakan Bahasa Pemrograman PHP. Aplikasi PHP Anda berjalan pada infrastruktur Google yang skalabel dan menggunakan penyimpanan dan layanan persisten berskala besar.
Memilih runtime PHP
App Engine menjalankan aplikasi web PHP Anda menggunakan penafsir PHP versi 5.5.34. Catatan: Di Linux, Anda juga harus menginstal PHP secara lokal untuk menjalankan aplikasi PHP.
Untuk menetapkan aplikasi agar menggunakan runtime PHP, tambahkan kode berikut ke file app.yaml
Anda:
runtime: php55
api_version: 1
...
Elemen pertama, runtime
, memilih lingkungan runtime PHP.
Elemen kedua, api_version
, memilih versi lingkungan runtime PHP yang akan digunakan. Saat penulisan ini, App Engine hanya memiliki satu versi lingkungan PHP, 1
. Jika ada perubahan mendatang yang mungkin tidak kompatibel dengan versi sebelumnya, tim App Engine akan menggunakan ID versi baru. Aplikasi Anda akan terus menggunakan versi yang dipilih sampai Anda mengubah setelan api_version
dan mengupload aplikasi.
Untuk informasi selengkapnya tentangapp.yaml
dan cara men-deploy aplikasi Anda ke App
Engine, lihat topik Referensi app.yaml
,
danMen-deploy Aplikasi PHP.
Sandbox
Agar App Engine dapat mendistribusikan permintaan aplikasi di beberapa server web, dan mencegah satu aplikasi mengintervensi server web lainnya, aplikasi akan berjalan di lingkungan "sandbox" yang dibatasi. Di lingkungan ini, aplikasi dapat mengeksekusi kode, menggunakan email App Engine, pengambilan URL dan layanan pengguna, serta memeriksa permintaan web pengguna dan menyiapkan respons.
Aplikasi App Engine tidak dapat:
menulis ke sistem file. Aplikasi PHP dapat menggunakan Google Cloud Storage untuk menyimpan file persisten. Membaca dari sistem file diizinkan, dan semua file aplikasi yang diupload dengan aplikasi tersedia.
merespons dengan lambat. Permintaan web ke aplikasi harus ditangani dalam beberapa detik. Proses yang memerlukan waktu sangat lama untuk merespons dihentikan agar tidak kelebihan beban pada server web.
melakukan jenis panggilan sistem lain.
Pemuatan class otomatis
Baik class Standard PHP Library (SPL) maupun class yang merupakan bagian dari SDK untuk App Engine dimuat secara otomatis saat diperlukan. Artinya, Anda tidak perlu menggunakan pernyataan include
atau require
di bagian atas skrip PHP.
Secara default, pemuatan class otomatis hanya akan terjadi untuk class yang ditentukan dalam file
yang berada di direktori root SDK untuk root App Engine (dan, jika
telah ditentukan oleh --php_executable_path
, penginstalan PHP lokal Anda ).
Untuk menambahkan lebih banyak jalur yang akan ditelusuri untuk pemuatan class otomatis, gunakan set_include_path
di skrip PHP Anda.
set_include_path('my_additional_path' . PATH_SEPARATOR . get_include_path());
Ekstensi yang diaktifkan
Ekstensi berikut telah diaktifkan di runtime PHP untuk App Engine:
- apc
- bcmath
- calendar
- Core
- ctype
- date
- dom
- ereg
- exif
- filter
- ftp
- gd
- hash
- iconv
- json
- libxml
- mailparse
- mbstring
- mcrypt
- memcache
- memcached
- mysql
- mysqli
- mysqlnd
- OAuth
- openssl
- pcre
- PDO
- pdo_mysql
- Reflection
- session
- shmop
- SimpleXML
- soap
- sockets (untuk aplikasi yang mendukung penagihan)
- SPL
- standard
- tokenizer
- xml
- xmlreader
- xmlwriter
- xsl
- zip
- zlib
Ekstensi yang dapat dimuat secara dinamis
Ekstensi berikut dapat dimuat secara dinamis dengan mengonfigurasi php.ini
.
- cURL - Ekstensi ini menggunakan layanan socket untuk membuat permintaan, dan tetap mematuhi kuota dan batasan layanan tersebut. Lihat Permintaan Keluar untuk informasi selengkapnya.
- MongoDB - Ekstensi ini memungkinkan developer terhubung ke instance MongoDB yang ada. API ini menggunakan layanan socket untuk membuat permintaan, serta tetap mematuhi kuota dan pembatasan layanan tersebut.
- ImageMagick
- intl
- fileinfo
Untuk mengaktifkan ekstensi ini, tambahkan perintah untuk ekstensi tersebut dalam file php.ini
di extension
seperti berikut:
extension = "curl.so"
extension = "mongo.so"
extension = "imagick.so"
extension = "intl.so"
extension = "fileinfo.so"
Sesi
Sebagian besar aplikasi web memerlukan cara untuk mempertahankan informasi status pengguna saat memproses permintaan. PHP menyediakan tingkatan manajemen sesi yang mudah digunakan. Sesi di App Engine berfungsi seperti sesi di aplikasi PHP lainnya.
Menetapkan variabel dalam sesi pengguna:
session_start();
$_SESSION['Foo'] = 'Bar';
Pada permintaan berikutnya oleh pengguna yang sama:
session_start();
print $_SESSION['Foo']; // prints Bar
Secara default, runtime App Engine akan menggunakan memcache untuk menyimpan informasi sesi menggunakan class MemcacheSessionHandler
. Anda dapat menyesuaikan perilaku ini dengan menentukan pengendali sesi Anda sendiri menggunakan metode session_set_save_handler()
PHP. Memcache memungkinkan data sesi disimpan dan diambil dengan cepat, yang berarti
overhead pada permintaan Anda sedikit. Namun, data di memcache App Engine
mungkin dihapus secara berkala, yang berarti informasi sesi apa pun akan
hilang. Untuk sesi berdurasi lebih lama, sebaiknya 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
lain yang berguna.
APPLICATION_ID
- App_id aplikasi ditetapkan saat aplikasi dibuat. Misalnya my-wordpressAUTH_DOMAIN
- Domain yang digunakan untuk mengautentikasi pengguna dengan Users API. Aplikasi yang dihosting di appspot.com memiliki AUTH_DOMAIN gmail.com, dan dapat menerima Akun Google apa pun Aplikasi yang dihosting di domain khusus menggunakan Google Workspace memiliki AUTH_DOMAIN yang sama dengan domain khususCURRENT_VERSION_ID
- Versi utama dan minor dari aplikasi yang sedang berjalan, sebagai "X.Y". Nomor versi utama ("X") ditentukan di file app.yaml aplikasi. Nomor versi minor ("Y") disetel secara otomatis saat setiap versi aplikasi diupload ke App Engine. Di server web pengembangan, versi minor selalu "1".DEFAULT_VERSION_HOSTNAME
- Nama host versi default aplikasi ini, misalnya my-php-app.uc.r.appspot.com.HTTP_X_APPENGINE_CITY
- Nama kota asal permintaan. Misalnya, permintaan dari kota Mountain View mungkin memiliki nilai header mountain view.HTTP_X_APPENGINE_CITYLATLONG
- Lintang dan bujur kota asal permintaan. String ini mungkin terlihat seperti "37.386051,-122.083851" untuk permintaan dari Mountain View.HTTP_X_APPENGINE_COUNTRY
- Negara asal permintaan, sebagai kode negara ISO 3166-1 alpha-2. App Engine menentukan kode ini dari alamat IP klien.HTTP_X_APPENGINE_REGION
- Nama region asal permintaan. 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.USER_EMAIL
- Menampilkan alamat email pengguna, jika mereka telah diautentikasi menggunakan Users API. Aplikasi harus menggunakan nama panggilan untuk nama yang dapat ditampilkan.USER_ID
- Jika alamat email dikaitkan dengan Akun Google, user_id akan menampilkan ID permanen unik pengguna, str. jika pengguna telah diautentikasi menggunakan Users API. ID ini selalu sama untuk pengguna, terlepas dari apakah pengguna mengubah alamat emailnya atau tidak.USER_IS_ADMIN
- 1 jika pengguna yang login juga merupakan Administrator aplikasi, jika mereka telah diautentikasi menggunakan Users API. 0 sebaliknya.USER_NICKNAME
- Untuk pengguna Akun Google, nama panggilan adalah bagian "nama" dari alamat email pengguna jika alamat berada di domain yang sama dengan aplikasi, atau alamat email lengkap pengguna.USER_ORGANIZATION
- Aplikasi yang menggunakan setelan Akun Google dapat menentukan apakah pengguna yang saat ini login menggunakan Akun Google pribadi atau akun yang dikelola oleh domain Google Workspace.
Memperbarui perilaku PHP_SELF
dan SCRIPT_NAME
pada versi 1.9.0
Implementasi $_SERVER['SCRIPT_NAME']
dan $_SERVER['PHP_SELF'
] sebelum
versi 1.9.0 berbeda secara signifikan dari versi 1.9.0 dan versi yang lebih baru. Perubahan tersebut dilakukan agar konsisten dengan implementasi Apache yang umumnya diharapkan oleh aplikasi PHP.
Contoh berikut menunjukkan perbedaannya.
Sebelum 1.9.0 | Setelah 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 |
Perintah dengan default inisialisasi baru
Tabel ini menentukan perintah yang default inisialisasinya berbeda dengan default yang disediakan oleh penafsir PHP standar yang tersedia dari php.net. Anda dapat mengganti perintah default ini dengan menyertakannya dalam file php.ini untuk aplikasi Anda.
Perintah | Nilai Default di 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 |
Fungsi yang dinonaktifkan
Beberapa fungsi PHP telah dinonaktifkan, baik untuk alasan keamanan maupun untuk kompatibilitas dengan lingkungan eksekusi App Engine. Beberapa fungsi ini dapat diaktifkan kembali secara eksplisit dalam file php.ini untuk aplikasi Anda.
Fungsi yang dinonaktifkan secara permanen
Fungsi berikut telah dinonaktifkan secara permanen di 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 tidak menyertakan ekstensi pcntl, sehingga fungsi yang disediakan oleh pcntl
tidak tersedia untuk aplikasi PHP yang berjalan di App Engine.
Dukungan tempnam()
dan sys_get_temp_dir()
Aplikasi App Engine berjalan di sandbox keamanan yang tidak mengizinkan penulisan ke sistem file lokal. Oleh karena itu, versi tempnam()
App Engine menampilkan file sementara dalam memori yang dapat ditulis nantinya ke solusi penyimpanan permanen seperti bucket Google 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
Fungsi yang dibatasi sebagian
App Engine untuk runtime PHP tidak mendukung pengubah pola /e
dari fungsi preg_replace()
dan mb_ereg_replace()
. Lihat dokumentasi PREG_REPLACE_EVAL
untuk pemberitahuan penghentian dan contoh cara memperbarui kode untuk menggunakan preg_replace_callback()
.
Fungsi yang dapat diaktifkan secara manual
Daftar ini menentukan fungsi PHP yang harus diaktifkan secara manual menggunakan perintah google_app_engine.enable_functions
di file php.ini untuk aplikasi Anda.
gc_collect_cycles()
,gc_enable()
,gc_disable()
, dangc_enabled()
getmypid()
getmyuid()
dangetmygid()
getrusage()
getmyinode()
get_current_user()
libxml_disable_entity_loader()
*parse_str()
phpinfo()
phpversion()
php_uname()
php_sapi_name()
Anda juga dapat menonaktifkan fungsi secara manual menggunakan perintah disable_functions
di file php.ini untuk aplikasi Anda.
Fungsi yang mengharuskan penagihan diaktifkan
Fungsi berikut menggunakan Socket, sehingga hanya tersedia untuk aplikasi yang mengaktifkan penagihan.
- semua Fungsi Jaringan kecuali
gethostname()
- semua Fungsi Socket
- semua fungsi FTP
- cURL, kecuali menggunakan cURL Lite
Koneksi TCP/IP ke server MySQL (Cloud SQL hanya dapat digunakan dengan socket UNIX)
Dukungan stream
Wrapper streaming I/O PHP yang didukung
Wrapper stream I/O PHP berikut didukung:
- php://input
- php://output
- php://memory
- php://temp
Wrapper stream
Banyak fungsi di PHP seperti fopen()
atau file_get_contents()
memanfaatkan antarmuka stream PHP untuk mendukung berbagai protokol.
Berikut ini adalah daftar wrapper stream bawaan yang otomatis terdaftar dan tersedia di runtime App Engine.
file://
glob://
http://
(Kode ini berperilaku seperti pengendali stream http bawaan PHP, tetapi menggunakan layanan URLfetch App Engine)https://
(Kode ini menggunakan layanan URLfetch App Engine)ftp://
gs://
(Pengendali stream untuk Google Cloud Storage)zlib://
Berikut adalah daftar pengendali stream bawaan yang tidak didukung di App Engine dan telah dibatalkan pendaftarannya.
data://
expect://
ogg://
phar://
rar://
ssh2://
Transpor stream dinonaktifkan
Transpor stream berikut telah dinonaktifkan.
ssl
sslv2
sslv3
tcp
tls
udg
udp
unix
PHP Murni
Semua kode untuk lingkungan runtime PHP harus berupa PHP murni. App Engine tidak mengizinkan Anda mengupload ekstensi C Anda sendiri.
Lingkungan ini mencakup library standar PHP. Beberapa ekstensi telah dinonaktifkan karena fungsi intinya tidak didukung oleh App Engine, seperti jaringan dan penulisan ke sistem file.
Anda dapat menyertakan library PHP murni lainnya pada aplikasi dengan menempatkan kode dalam direktori aplikasi, yaitu direktori yang sama dengan yang berisi file app.yaml
Anda.
Misalnya, Anda dapat membuat link simbolis di direktori aplikasi yang mengarah ke direktori library. Link tersebut kemudian diikuti dan library tersebut akan disertakan dalam aplikasi Anda saat Anda men-deploy ke App Engine.
Anda juga dapat menyertakan library PHP dengan menentukan perintah php.ini
dan menyertakan pernyataan include
PHP dalam kode Anda. Namun, alternatif yang lebih disukai
adalah menggunakan alat pengelolaan dependensi PHP seperti
Composer.
Contoh:
Jika Anda menyertakan direktori utama aplikasi dalam perintah
include_path
filephp.ini
Anda:include_path=".:/[ROOT_DIR]/myapp"
Selanjutnya, Anda dapat menggunakan pernyataan
include
atauinclude_once
untuk menyertakan file PHP yang terkait denganinclude_path
Anda:include_once 'myfile.php';
Jika memilih menggunakan Composer untuk menyertakan library PHP murni, Anda cukup menyertakan satu file setelah dependensi diinstal:
require_once 'vendor/autoload.php';
Saat Anda menggunakan Composer untuk menginstal dependensi aplikasi, semua paket akan ditambahkan dalam direktori aplikasi Anda di
vendor
, yang juga merupakan tempat fileautoload.php
dibuat.
Alat
SDK untuk App Engine menyertakan alat untuk menguji aplikasi Anda dan mengupload file aplikasi.
Server pengembangan menjalankan aplikasi Anda di komputer Anda untuk menguji aplikasi.
Alat gcloud
menangani semua interaksi command line dengan aplikasi Anda yang berjalan di App Engine. Anda menggunakan gcloud app deploy
untuk mengupload aplikasi ke App Engine, atau untuk memperbarui file konfigurasi individual. Anda juga dapat
melihat data log aplikasi sehingga Anda dapat menganalisis performa aplikasi menggunakan
alat Anda sendiri.
Kode sumber penafsir PHP
Anda dapat mendownload kode sumber untuk penafsir PHP App Engine dari repositori appengine-php di GitHub.
Konkurensi dan latensi
Latensi aplikasi Anda memiliki dampak terbesar pada jumlah instance yang diperlukan untuk melayani traffic Anda. Jika Anda memproses permintaan dengan cepat, satu instance dapat menangani banyak permintaan.
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 tempat layanan Anda saat ini berjalan. |
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. |
Anda dapat menentukan variabel lingkungan tambahan dalam file app.yaml
,
tetapi nilai di atas tidak dapat diganti.