Program php yang kita pasang pada chapter-chapter sebelumnya memiliki banyak wajah: ia dapat menjalankan berkas skrip, mengeksekusi potongan kode satu baris, memeriksa sintaks, bahkan menjadi web server sederhana. Semua kemampuan tersebut diakses melalui PHP CLI — antarmuka baris perintah PHP. Pada chapter ini kita akan mengenal pilihan-pilihan pentingnya satu per satu, karena PHP CLI akan menjadi sahabat kita sepanjang course ini.

Apa Itu PHP CLI #

PHP dapat “masuk” ke sistem melalui beberapa pintu yang berbeda, dan setiap pintu tersebut disebut SAPI (Server Application Programming Interface). PHP yang berjalan di dalam Apache memakai SAPI modul Apache, PHP yang melayani Nginx lewat PHP-FPM memakai SAPI FPM, sedangkan PHP yang dipanggil dari terminal memakai SAPI cli. Bahasa pemrogramannya sama persis; yang berbeda hanyalah cara PHP menerima permintaan dan mengirimkan hasil.

Kita dapat menanyakan pintu mana yang sedang dipakai melalui konstanta PHP_SAPI:

php
<?php
echo "Skrip ini berjalan lewat SAPI: " . PHP_SAPI . "\n";

Output yang Dihasilkan:

text
Skrip ini berjalan lewat SAPI: cli

Karena skrip di atas dieksekusi dari terminal, PHP_SAPI bernilai cli. Nilai ini penting diingat: beberapa pengaturan PHP berperilaku berbeda antara mode CLI dan mode web, misalnya batas waktu eksekusi yang dinonaktifkan pada CLI.

Menjalankan Berkas Skrip #

Cara paling mendasar memakai PHP CLI adalah menjalankan berkas skrip. Simpan kode berikut sebagai halo.php di direktori kerja Anda:

php
<?php
echo "Halo! Saya berjalan lewat PHP CLI.\n";

Output yang Dihasilkan:

text
Halo! Saya berjalan lewat PHP CLI.

Lalu jalankan dari terminal dengan memberikan nama berkas sebagai argumen pertama:

bash
php halo.php

PHP membuka berkas halo.php relatif terhadap direktori tempat Anda berada saat ini, mengeksekusi seluruh kode di dalamnya, lalu selesai begitu baris terakhir terbaca. Keluaran echo langsung tercetak ke terminal — sama seperti keluaran blok di atas.

Mengirim Argumen ke Skrip #

Skrip yang kita jalankan dapat menerima argumen tambahan, mirip seperti php sendiri menerima nama berkas. PHP menyediakan dua variabel otomatis untuk itu: $argc berisi jumlah argumen (termasuk nama skrip itu sendiri), dan $argv berisi daftar argumennya. Berkas argumen.php pada bagian bawah halaman mendemonstrasikannya:

php
<?php

// argumen.php — menampilkan argumen baris perintah yang diterima skrip

echo "Jumlah argumen: " . ($argc - 1) . "\n";

if ($argc > 1) {
    echo "Argumen pertama: " . $argv[1] . "\n";
} else {
    echo "Tidak ada argumen tambahan.\n";
}

Mari kita amati perilakunya dengan dua pemanggilan berbeda. Pertama dengan satu argumen tambahan:

bash
php argumen.php Budi

Output yang Dihasilkan:

text
Jumlah argumen: 1
Argumen pertama: Budi

Kedua tanpa argumen sama sekali:

bash
php argumen.php

Output yang Dihasilkan:

text
Jumlah argumen: 0
Tidak ada argumen tambahan.

Perhatikan bahwa $argc menghitung nama skrip sebagai argumen ke-0, sehingga jumlah argumen “sungguhan” adalah $argc - 1, dan $argv[0] selalu berisi nama berkas skrip. Karena itu argumen pertama buatan pengguna berada di $argv[1].

Menjalankan Kode Singkat dengan -r #

Untuk kode sebaris, flag -r (run) mengeksekusi kode PHP tanpa perlu berkas sama sekali:

bash
php -r 'echo "Halo dari mode -r\n";'

Output yang Dihasilkan:

text
Halo dari mode -r

Perhatikan dua hal pada contoh di atas. Pertama, kode di dalam -r ditulis tanpa tag pembuka <?php — PHP sudah tahu bahwa seluruh string adalah kode PHP. Kedua, kode dibungkus tanda kutip tunggal agar shell tidak menerjemahkan $ sebagai variabel shell; bila Anda memakai tanda kutip ganda, variabel seperti $nama akan dikosongkan oleh shell sebelum sampai ke PHP.

Memeriksa Sintaks dengan -l #

Flag -l (lint) memeriksa sintaks berkas tanpa menjalankannya — berguna memvalidasi berkas besar atau berkas yang berisi operasi berbahaya. Simpan potongan singkat berikut sebagai tes.php:

php
<?php
$total = 10 + 20;
echo "Total: $total\n";

Kemudian periksa sintaksnya:

bash
php -l tes.php

Output yang Dihasilkan:

text
No syntax errors detected in tes.php

Sekarang bayangkan berkas salah.php yang hanya berisi dua baris: tag pembuka <?php lalu pernyataan echo "tes" yang titik komanya lupa ditulis. Periksa berkas tersebut:

bash
php -l salah.php

Output yang Dihasilkan:

text
Parse error: syntax error, unexpected end of file, expecting "," or ";" in salah.php on line 3
Errors parsing salah.php

PHP CLI melaporkan lokasi masalah dengan tepat: ia menemukan akhir berkas (baris 3) padahal masih menunggu tanda ; atau ,. Perintah php -l mengembalikan exit code 0 bila sintaks benar dan 255 bila salah, sehingga pemeriksaan ini juga dapat dipasang sebagai langkah otomatis sebelum menerbitkan kode.

Server Web Bawaan #

Salah satu fitur CLI paling praktis untuk pengembangan lokal adalah server web bawaan. Alih-alih memasang Apache atau Nginx, jalankan:

bash
php -S 127.0.0.1:8080 -t publik

Terminal akan menampilkan pesan bahwa PHP Development Server telah dimulai di http://127.0.0.1:8080, lalu mencatat setiap permintaan yang masuk. Flag -t publik menjadikan direktori publik sebagai akar dokumen; setiap kunjungan ke alamat tersebut dari browser akan mengeksekusi berkas PHP di dalamnya dan mengirimkan hasilnya sebagai respons HTTP. Tekan Ctrl + C untuk menghentikan server.

Ringkasan #

PHP CLI adalah SAPI yang kita pakai sepanjang course ini: php berkas.php menjalankan skrip lengkap, $argv menampung argumen tambahan, -r mengeksekusi kode sebaris, -l memeriksa sintaks, dan -S menyalakan server web bawaan untuk uji coba. Dengan peralatan ini siap, pertanyaan berikutnya wajar muncul: versi berapa yang sebenarnya sedang berjalan di komputer Anda? Chapter berikutnya menjawabnya secara menyeluruh.

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

argumen.php

Unduh berkas
php
<?php

// argumen.php — menampilkan argumen baris perintah yang diterima skrip

echo "Jumlah argumen: " . ($argc - 1) . "\n";

if ($argc > 1) {
    echo "Argumen pertama: " . $argv[1] . "\n";
} else {
    echo "Tidak ada argumen tambahan.\n";
}