Dua komputer dengan versi PHP yang sama dapat berperilaku berbeda: satu mengizinkan unggahan berkas 2 MB, satunya lagi 64 MB. Penyebabnya bukan sihir, melainkan konfigurasi — ratusan pengaturan bernama directive yang mengendalikan batas memori, pelaporan galat, zona waktu, dan banyak lagi. Pada chapter ini kita akan melacak dari mana PHP membaca konfigurasi tersebut, cara melihatnya, dan cara membaca serta mengubah nilainya dari dalam skrip.

Dari Mana PHP Membaca Konfigurasi #

Saat PHP CLI berjalan, ia mencari konfigurasi dalam dua tahap: pertama berkas php.ini utama, lalu seluruh berkas *.ini tambahan di sebuah direktori pemindaian. Perintah php --ini menunjukkan dengan tepat lokasi yang sedang dipakai:

bash
php --ini

Output yang Dihasilkan:

text
Configuration File (php.ini) Path: /usr/local/etc/php
Loaded Configuration File:         (none)
Scan for additional .ini files in: /usr/local/etc/php/conf.d
Additional .ini files parsed:      (none)

Mari kita bedah keempat baris keluaran tersebut:

  1. Configuration File (php.ini) Path: direktori bawaan tempat PHP mencari php.ini, ditentukan saat PHP dikompilasi.
  2. Loaded Configuration File: berkas php.ini yang benar-benar dimuat — (none) berarti tidak ditemukan, sehingga seluruh directive memakai nilai bawaan.
  3. Scan for additional .ini files in: direktori pemindaian berkas tambahan.
  4. Additional .ini files parsed: daftar berkas tambahan yang berhasil dibaca — (none) bila direktori tersebut kosong.

Keluaran di atas berasal dari komputer tempat materi ini ditulis, jadi path-nya akan berbeda di instalasi Anda: Ubuntu misalnya memuat /etc/php/8.4/cli/php.ini plus berkas-berkas di /etc/php/8.4/cli/conf.d/. Bila Loaded Configuration File menunjukkan (none) padahal Anda yakin sudah mengedit php.ini, hampir pasti Anda mengedit berkas yang salah — kita akan membedah struktur php.ini tuntas pada Chapter php.ini .

Melihat Konfigurasi dengan php -i #

Perintah php -i mencetak seluruh konfigurasi dan informasi lingkungan dalam format teks — versi CLI dari fungsi phpinfo() yang terkenal. Keluarannya sangat panjang (ratusan baris), sehingga dalam praktik kita menyaringnya dengan grep:

bash
php -i | grep memory_limit

Output yang Dihasilkan:

text
memory_limit => 128M => 128M

Perhatikan format dua kolom: nilai di kiri adalah Local Value (nilai yang berlaku untuk eksekusi saat ini) dan nilai di kanan adalah Master Value (nilai dari berkas konfigurasi). Kedua kolom menampilkan 128M karena tidak ada yang mengubah memory_limit saat perintah di atas dijalankan. Perbedaan antara kedua kolom akan terlihat begitu kita mulai mengubah directive dari dalam skrip.

Membaca Nilai dari Skrip dengan ini_get() #

Dari dalam PHP, fungsi ini_get() membaca nilai sebuah directive berdasarkan namanya:

php
<?php
echo "memory_limit        : " . ini_get("memory_limit") . "\n";
echo "upload_max_filesize : " . ini_get("upload_max_filesize") . "\n";
echo "post_max_size       : " . ini_get("post_max_size") . "\n";
echo "max_execution_time  : " . ini_get("max_execution_time") . "\n";

Output yang Dihasilkan:

text
memory_limit        : 128M
upload_max_filesize : 2M
post_max_size       : 8M
max_execution_time  : 0

Keluaran tersebut adalah nilai bawaan PHP yang berlaku karena lingkungan pengujian materi ini tidak memuat php.ini. Di komputer Anda nilainya bisa berbeda bila php.ini mengaturnya — dan itu wajar. Perhatikan juga bahwa ini_get() selalu mengembalikan string, bukan angka: "128M" artinya 128 megabyte dalam format shorthand, dan max_execution_time bernilai "0" karena CLI memang tidak membatasi lama eksekusi skrip.

Mengubah Nilai Saat Runtime dengan ini_set() #

Untuk directive tertentu, skrip dapat mengubah nilainya sendiri saat berjalan menggunakan ini_set():

php
<?php
echo "Sebelum: " . ini_get("memory_limit") . "\n";

ini_set("memory_limit", "512M");

echo "Sesudah: " . ini_get("memory_limit") . "\n";

Output yang Dihasilkan:

text
Sebelum: 128M
Sesudah: 512M

Panggilan ini_set("memory_limit", "512M") mengubah batas memori hanya untuk eksekusi skrip saat ini — nilai di php.ini tidak tersentuh, dan setelah skrip selesai, PHP kembali ke konfigurasi semula. Dalam istilah php -i, perubahan seperti ini hanya memengaruhi Local Value dan tidak pernah menyentuh Master Value. Pola “simpan nilai lama, ubah, lalu pulihkan” dengan ini_set() dan ini_get() adalah cara standar mengubah perilaku PHP untuk satu bagian kode saja.

Batas Perubahan: Mode Directive #

Tidak semua directive dapat diubah kapan saja. Setiap directive memiliki mode yang menentukan kapan dan di mana ia boleh berubah:

ModeArtinyaContoh directive
PHP_INI_ALLDapat diubah kapan saja, termasuk lewat ini_set()memory_limit, display_errors
PHP_INI_PERDIRHanya bisa diatur sebelum skrip berjalan: php.ini, berkas .htaccess, atau flag -dupload_max_filesize, variables_order
PHP_INI_SYSTEMHanya bisa diatur di php.ini utamaextension_dir, disable_functions

Mari kita buktikan batas tersebut. Directive upload_max_filesize berstatus PHP_INI_PERDIR, sehingga upaya mengubahnya lewat ini_set() akan gagal:

php
<?php
var_dump(ini_set("upload_max_filesize", "10M"));

Output yang Dihasilkan:

text
bool(false)

Fungsi ini_set() mengembalikan false — nilai lama tidak dikembalikan dan tidak ada perubahan yang terjadi. Daftar lengkap mode setiap directive tersedia di dokumentasi daftar directive php.net ; biasakan memeriksanya sebelum menyalin kode ini_set() dari internet agar tidak bingung kenapa pengaturannya “tidak mau berubah”.

Ringkasan #

Konfigurasi PHP mengalir dari php.ini utama dan berkas tambahan di direktori pemindaian — php --ini menunjukkan lokasinya, php -i menampilkan seluruh isinya, ini_get() membaca satu directive dari skrip, dan ini_set() mengubahnya selama mode directive mengizinkan. Arsitektur ini akan terasa jauh lebih nyata setelah kita membuka dan membedah isi berkas php.ini itu sendiri, yang menjadi fokus chapter berikutnya.