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:

LingkunganLokasi 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:

ini
; 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 = 10M

Baris 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:

DirectiveMengaturNilai bawaan
memory_limitBatas memori satu eksekusi skrip128M
error_reportingJenis galat yang dilaporkanE_ALL
display_errorsMenampilkan galat sebagai keluaran atau tidakOn (CLI)
date.timezoneZona waktu bawaan fungsi tanggalUTC
upload_max_filesizeUkuran maksimum satu berkas unggahan2M

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:

bash
php -d memory_limit=64M -r 'echo ini_get("memory_limit"), "\n";'

Output yang Dihasilkan:

text
64M

Flag -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
<?php
echo ini_get("memory_limit"), "\n";

Output yang Dihasilkan:

text
256M

Saat 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
<?php
echo date_default_timezone_get(), "\n";

Output yang Dihasilkan:

text
Asia/Jakarta

Pola “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:

Aspekphp.ini-developmentphp.ini-production
display_errorsOn — galat langsung tampilOff — galat disembunyikan dari pengunjung
error_reportingE_ALL — semua level dilaporkanE_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:

bash
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:

text
256M 1

Keluaran 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:

bash
PHPRC=konfigurasi/php.ini php -r 'echo ini_get("memory_limit"), "\n";'

Output yang Dihasilkan:

text
256M

Untuk memastikan berkas tersebut benar-benar dimuat, kombinasikan dengan php --ini:

bash
php --ini -c konfigurasi/php.ini

Output yang Dihasilkan:

text
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.