Lingkungan Runtime PHP 5

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-wordpress
  • AUTH_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 khusus
  • CURRENT_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 di X-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.0Setelah 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(), dan gc_enabled()
  • getmypid()
  • getmyuid() dan getmygid()
  • 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.

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 file php.ini Anda:

    include_path=".:/[ROOT_DIR]/myapp"
    

    Selanjutnya, Anda dapat menggunakan pernyataan include atau include_once untuk menyertakan file PHP yang terkait dengan include_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 file autoload.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.