Runtime PHP

Runtime PHP adalah stack software yang berfungsi untuk menginstal kode aplikasi dan dependensi Anda, lalu menjalankan aplikasi tersebut di lingkungan yang fleksibel.

Versi PHP

PHP 8.3 menggunakan buildpacks. Untuk mengetahui daftar lengkap versi PHP yang didukung, dan versi Ubuntu yang sesuai, lihat Jadwal dukungan runtime.

Untuk menggunakan versi PHP yang didukung, Anda harus:

  • Instal gcloud CLI versi 420.0.0 atau yang lebih baru. Anda dapat memperbarui perkakas CLI dengan menjalankan perintah gcloud components update. Untuk melihat versi yang diinstal, Anda dapat menjalankan perintah gcloud version.

  • Sertakan setelan runtime_config dan operating_system dalam file app.yaml untuk menentukan sistem operasi.

  • Deklarasikan root dokumen untuk aplikasi Anda di file app.yaml:

      runtime: php
      env: flex
    
      runtime_config:
          operating_system: "ubuntu22"
          document_root: "web"
    

    Meskipun Anda dapat menentukan direktori root project (.) sebagai root dokumen, sebaiknya gunakan subdirektori untuk setelan document_root.

    Kode sumber berada di direktori /workspace, bukan direktori utama (/). Jika Anda mengganti konfigurasi apa pun, proses NGINX atau supervisor akan merujuk kepada file konfigurasi Anda dalam direktori ini. Untuk memperbarui referensi yang terkait, Anda harus:

    • Perbarui pernyataan include apa pun dalam konfigurasi NGINX Anda agar relatif terhadap /workspace, bukan /etc/nginx.

    • Beberapa file seperti gzip_params tidak disertakan. Untuk mereferensikan file ini, sertakan file Anda sendiri atau salinan dari GitHub. File seperti mime.types dan fastcgi_params tersedia di direktori /etc/nginx.

    • Beberapa modul NGINX seperti nginx-plus-module-ndk tidak diinstal. Tetapkan nilai $docroot atau tambahkan nilai secara manual di file konfigurasi NGINX Anda.

  • Secara opsional, Anda dapat menentukan versi runtime dengan:

    • Menyertakan setelan runtime_version dalam app.yaml Anda. Secara default, versi PHP terbaru akan digunakan jika setelan runtime_version tidak ditentukan.

      • Untuk menentukan PHP 8.3 di Ubuntu 22:

        runtime: php
        env: flex
        
        runtime_config:
            operating_system: "ubuntu22"
            runtime_version: "8.3"
            document_root: .
        
      • Untuk menentukan versi PHP terbaru yang didukung di Ubuntu 22:

          runtime: php
          env: flex
        
          runtime_config:
              operating_system: "ubuntu22"
              document_root: .
        
    • Menyertakan versi PHP dalam file composer.json.

      {
          "require": {
              "php": "8.3.*"
          }
      }
      

    Lihat referensi app.yaml untuk informasi selengkapnya.

Versi runtime sebelumnya

Untuk menggunakan PHP versi 7.3 dan yang lebih lama, Anda harus:

  • Deklarasikan root dokumen untuk aplikasi Anda. Anda dapat melakukannya di file app.yaml:

    runtime: php
    env: flex
    api_version: 1
    
    runtime_config:
      document_root: .
    

    Meskipun Anda dapat menentukan direktori root project (.) sebagai root dokumen, sebaiknya gunakan subdirektori untuk setelan document_root.

  • Tentukan versi PHP di file composer.json agar aplikasi Anda tidak otomatis melakukan upgrade saat versi baru PHP tersedia.

    {
        "require": {
            "php": "7.3.*"
        }
    }
    

Dukungan untuk runtime PHP lainnya

Jika perlu menggunakan versi PHP yang tidak didukung, Anda dapat membuat runtime kustom dan memilih image dasar yang valid dengan versi PHP yang Anda butuhkan.

Untuk image dasar yang disediakan Google atau image dasar PHP Docker, lihat Mem-build runtime kustom.

Kustomisasi NGINX

Untuk menentukan file konfigurasi kustom, sertakan file nginx-app.conf di direktori root project Anda.

Secara default, pengontrol depan framework menggunakan file index.php. Anda mungkin perlu mengubahnya menjadi sesuatu yang berbeda untuk project Anda. Misalnya, framework Symfony menggunakan app.php, bukan index.php. Anda dapat mengubah nama file di bagian runtime_config dari file app.yaml:

runtime: php
env: flex

runtime_config:
  operating_system: "ubuntu22"
  document_root: .
  front_controller_file: app.php

Untuk versi 7.3 dan yang lebih lama, file konfigurasi nginx-app.conf disertakan di bagian server pada file konfigurasi NGINX utama. Misalnya, file php-app.conf konfigurasi default, berisi hal berikut:

location / {
# try to serve files directly, fallback to the front controller
try_files $uri /$front_controller_file$is_args$args;
}

Untuk menentukan file konfigurasi kustom, buat file nginx-app.conf di direktori root project Anda. Runtime akan mengganti file default dengan file yang Anda berikan.

Secara default, pengontrol depan framework menggunakan file index.php. Anda mungkin perlu mengubahnya menjadi sesuatu yang berbeda untuk project Anda. Misalnya, framework Symfony menggunakan app.php, bukan index.php. Anda dapat mengubah nama file di bagian runtime_config dari file app.yaml:

runtime: php
env: flex

runtime_config:
  document_root: .
  front_controller_file: app.php

OPcache

Aktifkan OPcache di file php.ini Anda. Lihat dokumen resmi untuk mengetahui cara mengonfigurasi OPcache.

Untuk menonaktifkan OPcache, buat atau edit file php.ini dengan baris berikut:

opcache.enable=0

Dependensi

Runtime mencari file composer.json dalam direktori sumber aplikasi Anda dan menggunakan composer untuk menginstal dependensi sebelum memulai aplikasi. Untuk informasi lebih lanjut tentang mendeklarasikan dan mengelola paket, lihat Menggunakan Library PHP.

Menggunakan ekstensi PHP

Ekstensi PHP berikut sudah diinstal dan diaktifkan di sistem:

Versi PHP yang didukung

Anda dapat mengaktifkan ekstensi berikut menggunakan file php.ini:

v7.3 dan versi sebelumnya

Ekstensi PHP berikut dinonaktifkan secara default. Anda dapat mengaktifkan ekstensi berikut menggunakan file php.ini:

Untuk mengaktifkan ekstensi, tambahkan file php.ini di root aplikasi Anda dengan perintah extension:

; Enable the Redis extension
extension=redis.so

; Enable the OpenTelemetry extension (must be in an opentelemetry section)
[opentelemetry]
extension=opentelemetry.so

Atau, Anda juga dapat mengaktifkan ekstensi dengan menambahkan require ke composer.json:

{
    "require": {
        "ext-redis": "*"
    }
}

Paket-paket ini memungkinkan penginstalan ekstensi PHP yang paling populer. Jika aplikasi memerlukan dependensi level sistem operasi tambahan, Anda harus memperpanjang runtime PHP atau menggunakan runtime kustom untuk menginstal paket yang sesuai.

HTTPS dan proxy penerusan

App Engine menghentikan koneksi HTTPS di load balancer dan meneruskan permintaan ke aplikasi Anda. Server NGINX dikonfigurasi untuk menetapkan variabel lingkungan HTTPS ($_SERVER["HTTPS"]) ke on saat permintaan dibuat melalui HTTPS.

Beberapa aplikasi juga perlu memastikan alamat IP pengguna. Ini tersedia di header X-Forwarded-For standar.

Fungsi yang dinonaktifkan

Fungsi berikut dinonaktifkan dengan perintah disable_functions di php.ini:

  • exec
  • passthru
  • proc_open
  • proc_close
  • shell_exec
  • show_source
  • symlink
  • system

Jika Anda memerlukan salah satu fungsi di atas, tambahkan file php.ini di root aplikasi Anda dan ubah perintah disable_functions. Atau, tetapkan whitelist_functions di bagian runtime_config pada app.yaml ke daftar fungsi yang dipisahkan koma untuk mengizinkan.

Untuk PHP versi 7.3 dan yang lebih lama, ekstensi Keamanan suhosin diinstal dan dikonfigurasi secara default untuk berjalan dalam mode simulasi. Mode simulasi mencatat penggunaan fungsi yang berpotensi berbahaya ke dalam log, yang akan ditampilkan di UI Cloud Logging. Menonaktifkan mode simulasi akan membuat aplikasi Anda keluar saat fungsi yang berpotensi berbahaya digunakan. Untuk mengaktifkan fitur keamanan tambahan ini, tambahkan php.ini di root project Anda dengan opsi berikut:

; Prevent the use of potentially dangerous functions rather than logging them
suhosin.simulation = Off

Fungsi yang di-patch

Fungsi parse_str di-patch dan parameter kedua bersifat wajib. Jika Anda memanggil parse_str hanya dengan satu parameter, peringatan akan ditampilkan dan fungsi tidak akan dipanggil.

Konfigurasi yang tersedia

Anda dapat menyertakan konfigurasi berikut di bagian runtime_config:

NamaDeskripsiNilai default
document_root Menentukan DOCUMENT_ROOT untuk nginx dan PHP. Anda harus menggunakan jalur relatif dari direktori root project. Kolom wajib diisi
composer_flags Anda dapat mengganti beberapa tanda komposer dengan kunci ini. --no-dev --prefer-dist
enable_stackdriver_integration Hanya didukung untuk versi 7.3 dan yang lebih lama. Jika disetel ke benar (true), runtime akan otomatis mengaktifkan integrasi Google Cloud Observability. Konfigurasi ini memerlukan paket google/cloud v0.33 atau yang lebih tinggi. false
skip_lockdown_document_root Hanya didukung untuk versi 7.3 dan yang lebih lama. Secara default, runtime akan menetapkan izin hanya baca yang ketat pada semua file dan direktori yang ada di direktori document_root. Jika disetel ke true, runtime akan melewati perubahan izin. false
whitelist_functions Hanya didukung untuk versi 7.3 dan yang lebih lama. Daftar nama fungsi yang dipisahkan koma untuk diizinkan. String kosong
front_controller_file Nama file PHP default untuk akses direktori. index.php
nginx_conf_http_include Nama file konfigurasi nginx parsial, yang akan disertakan di bagian http pada file konfigurasi nginx utama. nginx-http.conf
nginx_conf_include Nama file konfigurasi nginx parsial yang akan disertakan di bagian server pada file konfigurasi nginx utama. nginx-app.conf
nginx_conf_override Nama file dari file konfigurasi nginx yang disediakan pengguna, yang akan digunakan sebagai file konfigurasi utama nginx. nginx.conf
php_fpm_conf_override Nama file dari file konfigurasi php-fpm yang diberikan pengguna, yang akan disertakan di bagian bawah [app] sehingga akan mengganti konfigurasi yang ada. php-fpm.conf
php_ini_override Nama file dari file konfigurasi PHP yang diberikan pengguna. php.ini
supervisord_conf_addition Nama file dari file konfigurasi supervisord yang disediakan pengguna yang akan disertakan dalam file konfigurasi supervisord utama. additional-supervisord.conf
supervisord_conf_override Nama file dari file konfigurasi supervisord yang disediakan pengguna, yang akan menggantikan file konfigurasi supervisord utama. supervisord.conf

Anda dapat mengontrol apakah Nginx menayangkan file statis untuk URI yang cocok dengan menetapkan variabel lingkungan NGINX_SERVES_STATIC_FILES di bagian build_env_variables dari file app.yaml:

runtime: php
env: flex

runtime_config:
  document_root: "web"
  operating_system: "ubuntu22"

build_env_variables:
  NGINX_SERVES_STATIC_FILES: true

Mengonfigurasi supervisord di runtime PHP

Lingkungan fleksibel App Engine menggunakan supervisord untuk mengelola proses. Secara default, supervisord menjalankan nginx dan php-fpm untuk menjalankan aplikasi web PHP; namun, beberapa aplikasi perlu menjalankan proses eksternal. Selain itu, aplikasi semacam ini terkadang bahkan tidak memerlukan nginx atau php-fpm.

Jika Anda ingin menambahkan proses yang dikelola oleh supervisord, tambahkan file bernama additional-supervisord.conf ke direktori root project. Berikut adalah contoh konten file konfigurasi untuk kasus ini:

[program:quote-updater]
command = php %(ENV_APP_DIR)s/worker.php
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes=0
user = www-data
autostart = true
autorestart = true
priority = 5
stopwaitsecs = 20

Jika ingin mengganti nginx dan php-fpm dengan proses Anda, tambahkan file bernama supervisord.conf ke direktori root project. Berikut adalah contoh konten file konfigurasi untuk kasus ini:

[supervisord]
nodaemon = true
logfile = /dev/null
logfile_maxbytes = 0
pidfile = /var/run/supervisord.pid

[program:react-server]
command = php %(ENV_APP_DIR)s/index.php
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes=0
user = www-data
autostart = true
autorestart = true
priority = 5
stopwaitsecs = 20

Memperpanjang runtime

Runtime PHP lingkungan fleksibel App Engine dapat digunakan untuk membuat runtime kustom. Lihat Kustomisasi Runtime PHP untuk informasi selengkapnya.

Variabel lingkungan

Variabel lingkungan berikut ditetapkan oleh lingkungan runtime:

Variabel lingkungan Deskripsi
GAE_INSTANCE Nama instance saat ini.
GAE_MEMORY_MB Jumlah memori yang tersedia untuk proses aplikasi.
GAE_SERVICE Nama layanan yang ditentukan dalam file app.yaml aplikasi Anda, atau jika tidak ada nama layanan yang ditentukan, nama akan ditetapkan ke default.
GAE_VERSION Label versi aplikasi saat ini.
GOOGLE_CLOUD_PROJECT Project ID yang terkait dengan aplikasi Anda, yang terlihat di konsol Google Cloud
PORT Port yang akan menerima permintaan HTTP.

Anda dapat menetapkan variabel lingkungan tambahan dengan app.yaml.

Server metadata

Setiap instance aplikasi Anda dapat menggunakan server metadata Compute Engine untuk mengkueri informasi tentang instance, termasuk nama host, alamat IP eksternal, ID instance, metadata kustom, dan informasi akun layanan. Dengan App Engine, Anda tidak dapat menetapkan metadata kustom untuk setiap instance, tetapi Anda dapat menetapkan metadata kustom tingkat project serta membacanya dari instance App Engine dan Compute Engine Anda.

Fungsi contoh ini menggunakan server metadata untuk mendapatkan alamat IP eksternal instance:

function get_external_ip_using_google_cloud()
{
    $metadata = new Google\Cloud\Core\Compute\Metadata();
    $externalIp = $metadata->get(
        'instance/network-interfaces/0/access-configs/0/external-ip');

    return $externalIp;
}

function get_external_ip_using_curl()
{
    $url = 'http://metadata.google.internal/computeMetadata/v1/' .
        'instance/network-interfaces/0/access-configs/0/external-ip';

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