PHP paling dikenal sebagai bahasa untuk membangun website, tetapi setiap instalasi PHP juga membawa interpreter command line yang lengkap. Melalui mode CLI (Command-Line Interface), kita dapat menulis skrip PHP yang berjalan langsung di terminal tanpa web server dan tanpa browser. Skrip semacam ini sangat cocok untuk pekerjaan otomasi: mencari teks di banyak berkas, memproses data CSV, membuat laporan berkala, sampai menjadi tool internal tim. Pada chapter ini kita akan belajar cara menjalankan skrip PHP dari terminal, menjadikannya berkas eksekutable, meminta input dari pengguna, lalu menyusun skrip pertama yang benar-benar berguna.
Menjalankan Skrip PHP dari Terminal #
Cara paling dasar menjalankan skrip PHP CLI adalah memanggil interpreter php diikuti nama berkas skrip. Tidak ada konfigurasi web server dan tidak ada URL — interpreter membaca berkas, mengeksekusi kode, lalu berhenti begitu baris terakhir terbaca. Mari kita mulai dengan skrip paling sederhana:
<?php
echo "Halo dari PHP CLI!\n";Output yang Dihasilkan:
Halo dari PHP CLI!Perhatikan karakter \n di akhir string. Konstruksi echo mencetak teks apa adanya tanpa menambahkan baris baru, sehingga kita menuliskan \n secara eksplisit agar output berpindah baris. Untuk kode sebaris yang sangat pendek, PHP menyediakan saklar -r (run) agar kita tidak perlu membuat berkas terlebih dahulu:
php -r 'echo "Halo sekali jalan!\n";'Output yang Dihasilkan:
Halo sekali jalan!Saklar -r menerima kode PHP tanpa tag pembuka <?php dan mengeksekusinya langsung. Fasilitas ini praktis untuk percobaan cepat, tetapi untuk kode yang akan disimpan dan dijalankan berulang kali, berkas skrip tetap pilihan yang tepat.
Skrip Eksekutable dengan Shebang #
Mengetik php di depan nama berkas setiap saat terasa repot. Sistem operasi Unix menyediakan mekanisme shebang: baris pertama berkas yang dimulai dengan #! memberi tahu kernel program mana yang harus mengeksekusi berkas tersebut. Dengan shebang #!/usr/bin/env php, skrip kita dapat dijalankan layaknya perintah biasa setelah diberi izin eksekusi:
#!/usr/bin/env php
<?php
echo "Skrip ini dijalankan tanpa perintah php\n";Output yang Dihasilkan:
Skrip ini dijalankan tanpa perintah phpBaris #!/usr/bin/env php memerintahkan program env untuk mencari eksekutor php di dalam variabel lingkungan PATH. Bentuk ini lebih portabel daripada path mutlak seperti #!/usr/bin/php karena lokasi instalasi PHP berbeda-beda antar mesin. Interpreter PHP CLI memahami shebang: baris tersebut diabaikan saat eksekusi, sehingga berkas yang sama tetap bisa dijalankan lewat php salam.php. Selanjutnya, berkas cukup diberi izin eksekusi satu kali saja:
chmod +x salam.php
./salam.phpOutput yang Dihasilkan:
Skrip ini dijalankan tanpa perintah phpAwalan ./ diperlukan saat memanggil skrip dari direktori aktif karena shell hanya mencari perintah di direktori yang terdaftar pada PATH, bukan di direktori tempat kita berdiri.
Identitas Skrip melalui $argv[0] #
Saat berjalan, PHP CLI otomatis menyiapkan variabel $argv berisi daftar argumen baris perintang. Elemen pertamanya, $argv[0], selalu berisi nama berkas skrip itu sendiri — persis seperti yang kita tulis saat memanggilnya. Skrip sederhana berikut menampilkan identitasnya sendiri:
<?php
echo "Skrip yang sedang berjalan: " . $argv[0] . "\n";Ketika dijalankan melalui interpreter, $argv[0] berisi identitas.php; ketika dijalankan langsung sebagai berkas eksekutable, nilainya menjadi ./identitas.php:
php identitas.phpOutput yang Dihasilkan:
Skrip yang sedang berjalan: identitas.phpNilai $argv[0] berguna untuk membangun pesan pemakaian yang menyebut nama skrip secara akurat. Pembahasan lengkap tentang $argv, $argc, dan pengolahan argumen akan kita bedah pada chapter Command-Line Arguments.
Meminta Input dari Pengguna #
Skrip yang berinteraksi dengan pengguna biasanya mengajukan pertanyaan lalu membaca jawaban dari standard input (stdin). Cara paling sederhana adalah mencetak pertanyaan tanpa baris baru, lalu membaca satu baris jawaban dengan fgets(STDIN):
<?php
echo "Siapa nama kamu? ";
$nama = trim((string) fgets(STDIN));
echo "Halo, $nama! Selamat belajar CLI.\n";Contoh di atas perlu dijalankan secara interaktif: skrip berhenti menunggu kita mengetik nama lalu menekan Enter. Fungsi fgets(STDIN) membaca satu baris lengkap termasuk karakter baris baru di akhirnya, sehingga trim() diperlukan untuk membuang karakter tersebut. Karena contoh ini menunggu masukan dari pengguna, sistem verifikasi chapter sengaja melewatkan eksekusinya — silakan uji sendiri di terminal Anda. Skrip yang sama juga dapat menerima input lewat pipe:
echo "Budi" | php sapa.phpOutput yang Dihasilkan:
Siapa nama kamu? Halo, Budi! Selamat belajar CLI.Pertanyaan dan jawaban tampak menyatu pada satu baris karena prompt sengaja tidak diakhiri baris baru — perilaku seperti ini normal pada program command line.
Menyimpan Skrip di Folder bin #
Ketika proyek tumbuh, skrip CLI biasanya dipisahkan dari kode aplikasi web. Konvensi yang umum dipakai adalah menempatkan seluruh tool command line di dalam folder bin/ (singkatan dari binary, warisan konvensi Unix):
proyek-toko/
├── app/ # kode aplikasi web
├── bin/ # tool command line
│ └── grepper.php
├── src/ # class dan library
├── public/ # entry point web
└── composer.jsonSkrip di dalam bin/ dipanggil dengan php bin/grepper.php dari akar proyek, atau ./bin/grepper.php bila dilengkapi shebang dan izin eksekusi. Konvensi ini juga dikenali Composer: kolom bin pada composer.json mendaftarkan tool agar dapat dipanggil dari mana saja — mekanisme ini akan kita bahas pada chapter Distributing CLI Tools.
Skrip Pertama yang Berguna #
Sekarang kita rangkai seluruh konsep menjadi satu skrip yang benar-benar berguna: grepper.php, pencari teks dalam berkas — versi mini dari perintah grep. Skrip ini menerima dua argumen (pola yang dicari dan nama berkas), memvalidasi keduanya, lalu mencetak setiap baris yang memuat pola beserta nomor barisnya. Berikut isi berkas data.txt yang menjadi target pencarian:
Budi belajar PHP
Siti belajar Python
Budi menulis skrip CLI
Ani membaca dokumentasi#!/usr/bin/env php
<?php
$pattern = $argv[1] ?? '';
$file = $argv[2] ?? '';
if ($pattern === '' || $file === '' || !is_file($file)) {
fwrite(STDERR, "Pemakaian: php grepper.php <pola> <berkas>\n");
exit(1);
}
$found = 0;
foreach (file($file, FILE_IGNORE_NEW_LINES) as $number => $line) {
if (str_contains($line, $pattern)) {
printf("%3d: %s\n", $number + 1, $line);
$found++;
}
}
exit($found > 0 ? 0 : 1);Output yang Dihasilkan:
1: Budi belajar PHP
3: Budi menulis skrip CLIMari kita telaah bagian-bagian penting skrip di atas:
- Baris 1 (
#!/usr/bin/env php): shebang memungkinkan eksekusi langsung tanpa mengetikphpdi depan nama berkas. - Baris 3-4 (
$pattern = $argv[1] ?? ''; ...): pola dan nama berkas diambil dari argumen; operator??memberi string kosong ketika argumen tidak diberikan sehingga skrip tetap aman dijalankan tanpa argumen. - Baris 6-9 (
if (...)): validasi — skrip menolak bekerja ketika pola kosong atau berkas tidak ditemukan. Pesan pemakaian dikirim ke streamSTDERR, laluexit(1)menandai kegagalan. - Baris 11-17 (
foreach…): fungsifile()membaca seluruh baris berkas ke dalam array, sedangkanFILE_IGNORE_NEW_LINESmembuang karakter baris baru di tiap baris. Fungsistr_contains()memeriksa apakah baris memuat pola, danprintf("%3d: %s\n", ...)mencetak nomor baris rata kanan selebar tiga digit. - Baris 19 (
exit(...)): skrip ditutup dengan kode0bila ada baris yang cocok dan1bila tidak ada — kontrak sederhana yang bisa diandalkan shell maupun CI.
Perilaku skrip ketika argumen tidak lengkap pun sudah teruji:
php grepper.php
echo "exit code: $?"Output yang Dihasilkan:
Pemakaian: php grepper.php <pola> <berkas>
exit code: 1Berkas contoh.php dan data.txt pada bagian bawah halaman merangkum chapter ini dalam satu program utuh yang dapat langsung Anda jalankan.
Ringkasan #
Skrip PHP CLI dijalankan lewat php berkas.php atau langsung sebagai berkas eksekutable dengan shebang #!/usr/bin/env php dan chmod +x. Variabel $argv[0] selalu memuat nama skrip, input pengguna dibaca dari stdin, dan skrip yang bermanfaat memvalidasi argumen sebelum bekerja. Dengan fondasi ini, kita siap mengolah argumen baris perintah secara menyeluruh pada chapter Command-Line Arguments.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
contoh.php
Unduh berkas<?php
// contoh.php — rangkuman Chapter Membuat Command-Line Scripts.
// Jalankan dengan: php contoh.php
// Mencari pola tetap di dalam data.txt (logika yang sama dengan grepper).
$pattern = "Budi";
$file = __DIR__ . "/data.txt";
$found = 0;
foreach (file($file, FILE_IGNORE_NEW_LINES) as $number => $line) {
if (str_contains($line, $pattern)) {
printf("%3d: %s\n", $number + 1, $line);
$found++;
}
}
echo "Ditemukan $found baris yang memuat \"$pattern\".\n";