Berkas php.ini adalah pusat kendali PHP: satu berkas teks berisi ratusan baris pengaturan yang menentukan batas memori, cara galat dilaporkan, zona waktu bawaan, hingga ukuran unggahan yang diizinkan. Kita sudah melihat cara membaca konfigurasi dari skrip pada chapter sebelumnya; sekarang saatnya membuka berkas itu sendiri. Pada chapter ini kita akan mempelajari anatomi php.ini, directive yang paling sering Anda sentuh sebagai pemula, cara mencoba pengaturan tanpa mengubah berkas, serta mekanisme berkas tambahan di direktori conf.d.
Menemukan php.ini yang Aktif #
Langkah pertama selalu sama: pastikan Anda mengedit berkas yang benar-benar dibaca PHP. Jalankan php --ini dan perhatikan baris Loaded Configuration File — itulah berkas yang aktif. Lokasinya berbeda-beda tergantung sistem operasi dan cara instalasi:
| Lingkungan | Lokasi umum |
|---|---|
| Ubuntu / Debian | /etc/php/8.4/cli/php.ini (CLI) dan /etc/php/8.4/fpm/php.ini (web) |
| Fedora | /etc/php.ini |
| Windows (ZIP) | C:\php\php.ini |
| macOS (Homebrew) | /opt/homebrew/etc/php/8.4/php.ini |
Anatomi Berkas php.ini #
php.ini adalah berkas teks biasa dengan format yang mudah dibaca. Setiap pengaturan ditulis sebagai nama_directive = nilai, komentar diawali titik koma ;, dan berkas dapat dibagi menjadi bagian-bagian berjudul seperti [PHP] yang berfungsi sebagai pemisah visual saja. Berikut contoh php.ini kecil yang lengkap untuk keperluan belajar:
; php.ini kecil untuk eksperimen belajar
memory_limit = 256M
display_errors = On
error_reporting = E_ALL
date.timezone = Asia/Jakarta
upload_max_filesize = 8M
post_max_size = 10MBaris pertama adalah komentar — semua teks setelah ; hingga akhir baris diabaikan PHP. Nilai directive datang dalam beberapa bentuk: kata kunci On/Off untuk saklar, angka biasa seperti 30, string seperti Asia/Jakarta, dan shorthand bytes seperti 256M. Shorthand K, M, dan G berarti kilo-, mega-, dan gigabyte, sehingga 256M setara dengan 268435456 byte; tanpa satuan, nilai 256 berarti 256 byte.
Directive Penting untuk Pemula #
Dari ratusan directive yang tersedia, lima berikut paling sering Anda jumpai di awal perjalanan:
| Directive | Mengatur | Nilai bawaan |
|---|---|---|
memory_limit | Batas memori satu eksekusi skrip | 128M |
error_reporting | Jenis galat yang dilaporkan | E_ALL |
display_errors | Menampilkan galat sebagai keluaran atau tidak | On (CLI) |
date.timezone | Zona waktu bawaan fungsi tanggal | UTC |
upload_max_filesize | Ukuran maksimum satu berkas unggahan | 2M |
memory_limit mencegah skrip yang bocor memakan seluruh RAM server; naikkan bila Anda memproses berkas besar dan menemui galat Allowed memory size exhausted. error_reporting dan display_errors bekerja berpasangan: yang pertama memilih galat mana yang terdeteksi, yang kedua menentukan apakah galat itu ditampilkan — saat belajar, keduanya sebaiknya setinggi mungkin agar kesalahan kecil langsung terlihat. date.timezone menentukan zona waktu untuk fungsi date() dan kelas DateTime; tanpa pengaturan, PHP memakai UTC sehingga jam bisa terasa “salah” delapan jam bagi kita di Indonesia. Terakhir, upload_max_filesize membatasi satu berkas unggahan, sedangkan post_max_size membatasi total satu permintaan — pastikan post_max_size selalu lebih besar dari upload_max_filesize bila formulir Anda mengunggah beberapa berkas sekaligus.
Mencoba Pengaturan tanpa Mengubah Berkas #
Sebelum menyetel permanen, kita dapat menguji sebuah directive lewat flag -d saat menjalankan PHP. Perintah berikut menaikkan batas memori hanya untuk satu eksekusi:
php -d memory_limit=64M -r 'echo ini_get("memory_limit"), "\n";'Output yang Dihasilkan:
64MFlag -d juga dapat diterapkan pada berkas skrip biasa. Blok berikut dijalankan dengan php -d memory_limit=256M sehingga ini_get() melaporkan nilai dari flag tersebut, bukan nilai bawaan:
<?php
echo ini_get("memory_limit"), "\n";Output yang Dihasilkan:
256MSaat Anda menjalankan kode di atas tanpa flag -d, keluarannya kembali ke nilai bawaan 128M — perubahan -d memang hanya berlaku untuk satu pemanggilan. Contoh berikut menyetel zona waktu dengan cara yang sama, lalu membacanya kembali dari dalam skrip:
<?php
echo date_default_timezone_get(), "\n";Output yang Dihasilkan:
Asia/JakartaPola “uji dulu dengan -d, lalu pindahkan ke php.ini bila hasilnya sesuai” membuat eksperimen konfigurasi menjadi aman dan berbalik cepat.
Prasetel development dan production #
Distribusi PHP mengirimkan dua berkas contoh: php.ini-development dan php.ini-production. Keduanya berisi directive yang sama; yang berbeda adalah nilainya, karena targetnya memang berlawanan:
| Aspek | php.ini-development | php.ini-production |
|---|---|---|
display_errors | On — galat langsung tampil | Off — galat disembunyikan dari pengunjung |
error_reporting | E_ALL — semua level dilaporkan | E_ALL & ~E_DEPRECATED & ~E_STRICT — level peringatan “bising” diredam |
Untuk belajar, pakailah prasetel development: galat yang langsung terlihat adalah guru terbaik. Prasetel production menonaktifkan tampilan galat karena pesan kesalahan dapat membocorkan path, kueri, dan detail internal aplikasi kepada pengunjung. Anda sudah memakai prasetel development secara diam-diam bila mengikuti Chapter Instalasi PHP di Windows — di sana kita menyalin php.ini-development menjadi php.ini.
Berkas Tambahan di conf.d #
Mengedit satu php.ini raksasa bukan satu-satunya cara. Direktori pemindaian conf.d memungkinkan pengaturan dipecah menjadi banyak berkas kecil yang semuanya dibaca PHP secara berurutan — mekanisme inilah yang dipakai Ubuntu agar setiap paket ekstensi (misalnya php-curl) cukup menempatkan berkas curl.ini sendiri tanpa menyentuh php.ini utama. Kita dapat meniru mekanisme tersebut secara lokal. Dari dalam sebuah direktori kerja, buat berkas konfigurasi lalu beritahu PHP memakainya lewat flag -c:
mkdir -p konfigurasi
cat > konfigurasi/php.ini <<'INI'
; php.ini kecil untuk eksperimen
memory_limit = 256M
display_errors = On
INI
php -c konfigurasi/php.ini -r 'echo ini_get("memory_limit"), " ", ini_get("display_errors"), "\n";'Output yang Dihasilkan:
256M 1Keluaran 256M 1 membuktikan kedua directive terbaca: memory_limit menjadi 256M, dan On dikonversi PHP menjadi 1. Alternatif tanpa flag adalah variabel lingkungan PHPRC yang menunjuk ke berkas atau direktori konfigurasi:
PHPRC=konfigurasi/php.ini php -r 'echo ini_get("memory_limit"), "\n";'Output yang Dihasilkan:
256MUntuk memastikan berkas tersebut benar-benar dimuat, kombinasikan dengan php --ini:
php --ini -c konfigurasi/php.iniOutput yang Dihasilkan:
Configuration File (php.ini) Path: /usr/local/etc/php
Loaded Configuration File: /home/z/belajar-php/konfigurasi/php.ini
Scan for additional .ini files in: /usr/local/etc/php/conf.d
Additional .ini files parsed: (none)Baris Loaded Configuration File kini menunjuk ke berkas eksperimen kita (path lengkap mengikuti lokasi direktori kerja di komputer masing-masing), sementara baris pertama tetap menampilkan path bawaan hasil kompilasi — -c menimpa berkas yang dimuat, bukan path bawaannya.
Ringkasan #
php.ini memakai format sederhana directive = nilai dengan komentar ; dan shorthand K/M/G; lokasinya ditunjukkan php --ini dan lokasi umumnya bergantung sistem operasi. Directive memory_limit, error_reporting, display_errors, date.timezone, serta upload_max_filesize adalah yang paling sering disentuh pemula, dan flag -d memungkinkan semuanya diuji dulu tanpa menyentuh berkas. Satu lapis lagi di atas konfigurasi ini adalah ekstensi — modul-modul kemampuan PHP yang cara mengaktifkannya juga berputar di berkas-berkas .ini.