88
Informasi File
Kesuksesan operasi-operasi file sedikit banyak sangat di-
pengaruhi oleh ketersediaan informasi mengenai file terkait.
Dengan demikian, sudah sepantasnya jika kita memahami
informasi-informasi penting tersebut, khususnya di bagian
awal ini.
• Eksistensi File
Informasi mengenai eksistensi file merupakan senjata wajib
guna mencegah kegagalan operasi selanjutnya. Dalam prak-
203
tiknya, kita memanfaatkan fungsi file_exists() yang
akan mengembalikan nilai true jika file ditemukan.
if (file_exists('test.txt')) {
// Laksanakan operasi selanjutnya
// ...
}
$info = pathinfo($fl);
echo $info['basename']; // Output: test.txt
echo $info['filename']; // Output: test
echo $info['extension']; // Output: txt
• Pemisah Path
Apabila Anda ingin menetapkan pemisah path yang portable,
gunakan slash (/) karena karakter ini dapat bekerja baik di
lingkungan Windows maupun Unix/Linux.
var_dump(file_exists('C:/tmp/test.txt'));
var_dump(file_exists('/tmp/test.txt'));
204
Meskipun ekstensi Directory juga menyediakan kons-
tanta DIRECTORY_SEPARATOR, namun lebih efisien jika
kita menggunakan karakter slash.
89
Properti File
Ketersediaan fungsi yang cukup lengkap di ekstensi
Filesystem memungkinkan kita untuk mengungkap infor-
masi detail pada suatu file. Lebih jelasnya, di sini kita akan
memanfaatkan fungsi-fungsi yang ada sesuai kebutuhan.
• Properti Standar
Layaknya explorer file, kita dapat menyajikan informasi
spesifik mengenai properti file, seperti tipe, lokasi, ukuran,
dan waktu pembuatan serta modifikasi.
$fl = './test.txt';
205
persoalan ini dengan mengonversi ukuran ke satuan terdekat,
misalnya KB, MB, atau GB.
public static function getSize($fl) {
// Array satuan
$arr = array('B','KB','MB','GB','TB','PB');
$size = filesize($fl);
$cnt = 0;
while ($size >= 1024) {
$cnt++;
$size /= 1024;
}
return number_format($size,
($cnt ? 2 : 0), ',', '.') . ' '.$arr[$cnt];
}
• Atribut File
Untuk mendapatkan informasi mengenai atribut file, guna-
kan fungsi-fungsi berawalan is_, seperti is_executable(),
is_readable(), dan is_writable().
$fl = './test.txt';
var_dump(is_readable($fl));
var_dump(is_writable($fl));
var_dump(is_executable($fl));
var_dump(is_writable($fl));
// Output: true
var_dump(is_executable($fl));
// Output: false
206
90
Operasi File
Sehubungan dengan fungsionalitas utamanya, ada beberapa
operasi file yang disediakan oleh ekstensi Filesystem. Operasi-
operasi yang lazim dilakukan meliputi pembuatan, pengha-
pusan, penulisan, dan pembacaan.
• Penulisan File
Untuk melakukan penulisan string ke file secara praktis,
Anda dapat memanfaatkan fungsi file_put_contents().
Fungsi yang diperkenalkan sejak PHP 5 ini akan melakukan
tiga pekerjaan sekaligus, yakni membuka, menulis, dan me-
nutup file.
$str = 'Dirgahayu RI Ke-63';
$fl = './test.txt';
if ($write) {
echo 'Berhasil, ', $write, ' byte tersimpan';
}
207
} else {
if (is_array($data)) {
$data = implode($data);
}
$byte = fwrite($fp, $data);
fclose($fp);
return $byte;
}
// Contoh penggunaan
$str = 'Dirgahayu RI ke-63';
// Replace
var_dump(file_put_contents('test.txt', $str));
// Append
var_dump(file_put_contents('test2.txt', $str,
true));
208
Sebagai alternatif, jika Anda ingin membaca file per baris,
gunakan fungsi fgets(). Sementara itu, apabila Anda hanya
ingin membaca karakter tunggal, tersedia fungsi fgetc().
Berbeda dengan pendekatan-pendekatan sebelumnya, kedua
fungsi ini memerlukan pointer file.
$fp = fopen($fl, 'r') or
die('Gagal membuka file');
if ($fp) {
while (!feof($fp)) {
$buffer = fgets($fp, 4096);
echo $buffer;
}
fclose($fp);
}
91
Highlight Sintaks
Untuk menghasilkan visualisasi kode dengan dukungan
syntax highlighting, Anda cukup menyimpan file program
dengan ekstensi .phps. Langkah ini mengambil asumsi bahwa
server Anda mendukung fitur highlighting dan mengaktifkan
baris berikut:
AddType application/x-httpd-php-source .phps
209
Apabila Anda ingin mengimplementasikan syntax
highlighting secara independen (tanpa bergantung pada
dukungan server), Anda bisa memanfaatkan fungsi
highlight_string() atau highlight_file(). Kedua
fungsi ini berbeda dalam hal penerimaan jenis argumen,
yaitu string dan file.
$kode = <<<EOQ
<?php
/**
* Tes Komentar
*
*/
function test() {
// Tes Komentar
echo 'Mari Bersatu Menuju Kejayaan';
}
?>
EOQ;
highlight_string($kode);
210
</td>
</tr>
</table>
<?php
}
$opsi = array(
'numbers' => HL_NUMBERS_TABLE,
'tabsize' => 4,
);
211
92
Include/Require File
Mengacu pada struktur aplikasi web, yang lazimnya terdiri
atas beberapa file, tidak mungkin kita dapat menghasilkan
aplikasi tanpa meng-include file lain. Sehubungan dengan hal
ini, akan dijelaskan mengenai tip dan trik seputar include/
require file.
• Menspesifikasikan File
File-file yang dimaksudkan untuk di-include, atau tidak
dijalankan secara langsung, sebaiknya disimpan dengan
ekstensi khusus, misalnya inc atau inc.php. Umumnya jenis
ekstensi kedua lebih disukai, meskipun Anda sudah mem-
proteksi file-file inc.
Untuk mencegah kegagalan include yang diakibatkan tidak
ditemukannya file, kita bisa memeriksa eksistensi file terlebih
dahulu.
function include_eksis($fl) {
if (file_exists($fl)) {
include $fl;
} else {
// Misal keluar dari program
exit('File ' . $fl . ' tidak ditemukan');
}
}
include_eksis('nothing.php');
212
• Mencegah Include/Require Ulang
Untuk mencegah include/require ulang, gunakan fungsi
include_once() atau require_once(). Kedua fungsi ini
memastikan bahwa file yang sama hanya akan di-include
sekali.
require 'test2.php';
echo '<pre>';
print_r(get_included_files());
• Include vs Require
Perbedaan mendasar antara include dan require terletak pada
reaksi yang ditimbulkan manakala file tidak ditemukan. Pada
pendekatan include, parser akan menampilkan pesan
warning dan mencoba melanjutkan eksekusi. Sementara itu,
pada require akan menimbulkan pesan fatal error dan
eksekusi program segera dihentikan.
include 'nothing1.php';
echo 'Ini masih dieksekusi';
require 'nothing2.php';
echo 'Ini sudah tidak dieksekusi';
213
kan require jika ingin agar eksekusi tidak dilanjutkan, dan
sebaliknya manfaatkan include.
93
File Konfigurasi
Menyimpan konfigurasi-konfigurasi aplikasi di sebuah file
merupakan suatu langkah praktis, khususnya jika kita tidak
memiliki DBMS. File yang digunakan untuk penyimpanan
ini juga variatif, namun umumnya adalah file-file berekstensi
ini atau php.
Apabila Anda menggunakan file ini, Anda bisa meman-
faatkan fungsi parse_ini_file() untuk mengelola file.
Fungsi ini memungkinkan kita untuk menguraikan file .ini
dengan mudah. Sebagai contoh, kita memiliki file test.ini
seperti berikut:
; Contoh file .ini
[Seksi_1]
satu = 1
; Ini komentar, tidak diproses
dua = 5
[Seksi_2]
tiga = "tiga"
empat = "empat"
214
// Mengakses elemen tiga
echo $ini1['tiga']; // Output: tiga
print_r($ini1);
/* Output
Array
(
[satu] => 1
[dua] => 5
[tiga] => tiga
[empat] => empat
)
*/
215
informasi apa pun ketika mencoba mengakses file konfi-
gurasi.
94
Informasi Direktori
Untuk mendapatkan informasi-informasi direktori, kita bisa
memanfaatkan fungsi-fungsi Filesystem. Selain itu, PHP juga
menyediakan ekstensi Directory yang khusus didesain untuk
menangani direktori.
• Eksistensi Direktori
Fungsi file_exists() tak hanya dimaksudkan untuk me-
meriksa eksistensi file, namun juga mencakup direktori.
Sementara itu, untuk memastikan bahwa objek benar-benar
merupakan direktori, gunakan fungsi is_dir().
var_dump(file_exists('./dir'));
// Memeriksa eksistensi subdirektori
var_dump(file_exists('./dir/subdir'));
216
// Mengembalikan path absolut
echo realpath($dir);
• Properti Direktori
Layaknya bekerja dengan file, kita bisa memanfaatkan fungsi-
fungsi berawalan is_ untuk mendapatkan informasi
mengenai properti direktori.
$dir = 'dir/subdir';
var_dump(is_readable($dir));
var_dump(is_writeable($dir));
95
Traversal File
Berbekal fungsi-fungsi yang telah tersedia, Anda tidak akan
kesulitan melakukan operasi ini. Namun bagaimana imple-
mentasinya secara nyata? Bagaimana pula mengimplemen-
tasikan traversal pada direktori dan subdirektori?
Bagi pengguna PHP 5 ke atas, Anda dapat memanfaatkan
fungsi scandir() untuk memindai file-file di suatu direk-
tori. Di samping mendapatkan nama-nama file dan direktori,
fungsi ini juga mengembalikan metaentry “.” (current
direktori) dan ‘..” (direktori induk). Oleh karena itu, jika
Anda hanya ingin mengambil nama-nama file, gunakan
fungsi is_file() untuk menyaring entry.
class Traversal {
217
public static function scanFile($dir) {
$arr = array();
if (is_dir($dir)) {
$fls = scandir($dir);
foreach ($fls as $fl) {
$path = $dir . '/' . $fl;
// Hanya mengambil file
if (is_file($path)) {
$arr[] = $fl;
}
}
return $arr;
} else {
return false;
}
}
218
while (false !== ($fl = $d->read())) {
$path = $dir . '/' . $fl;
// Hanya mengambil file
if (is_file($path)) {
$arr[] = $fl;
}
}
$d->close();
return $arr;
}
219
96
Pencarian dan Penyaringan File
Untuk melakukan pencarian dan penyaringan file, PHP
menyediakan pendekatan yang variatif. Bagian ini akan
mengulas beberapa pendekatan yang nantinya mungkin bisa
Anda adopsi atau kembangkan lebih lanjut.
Salah satu pendekatan yang praktis adalah dengan meman-
faatkan fungsi glob(). Fungsi ini menerima argumen
berupa pola, dan akan mengembalikan array berisi file/
direktori yang sesuai.
// Mencari file berekstensi .php
$list = glob('*.php');
$list = glob(basename($d));
foreach ($list as $fl) {
echo $fl, '<br />';
}
220
class Pencarian {
if (is_dir($dir)) {
$fls = scandir($dir);
foreach ($fls as $fl) {
// Abaikan metaentry
if ($fl != '.' && $fl != '..') {
$path = $dir . '/' . $fl;
// Jika direktori, cari secara rekursif
if (is_dir($path)) {
$arr = array_merge($arr,
Pencarian::find($key, $path));
} else {
// Jika sesuai, simpan ke array
if ((stripos($fl, $key)) !== false) {
$arr[] = $path;
}
}
}
}
return $arr;
} else {
return false;
}
}
echo '<pre>';
// Mencari file test
print_r(Pencarian::find('test', '/tmp'));
221
Gambar 8.2 Pencarian dan penyaringan file
97
Operasi Direktori
Sebagaimana diketahui, operasi-operasi direktori yang utama
meliputi pembuatan dan penghapusan. Secara umum,
operasi-operasi ini dapat kita lakukan dengan mudah melalui
fungsi-fungsi yang tersedia.
Untuk menciptakan direktori baru, PHP menyediakan fungsi
built-in mkdir().
$dir = './test';
if (!is_dir($dir)) {
// Buat direktori baru
mkdir($dir);
}
222
bisa memanfaatkan program mkdir sistem. Dalam imple-
mentasinya, gunakan fungsi exec() atau system() untuk
menjalankan program tersebut.
// Untuk lingkungan Unix/Linux
public static function mkdirNix($dir) {
if (!is_dir($dir)) {
$dir = escapeshellarg($dir);
exec('/bin/mkdir -p ' . $dir);
return true;
} else {
return false;
}
}
223
// Hapus file
unlink ($path);
}
}
}
return rmdir($dir);
} else {
return false;
}
}
224
98
Iterator Direktori
Jika di bab awal kita telah mengulas SPL, kali ini akan di-
jelaskan implementasinya terkait dengan operasi direktori.
Setidaknya ada dua kelas khusus yang dapat kita manfaatkan
untuk bekerja dengan direktori, yakni DirectoryIterator
dan RecursiveDirectoryIterator.
Melalui objek DirectoryIterator, kita dapat memindai
entry di dalam direktori secara praktis. Dalam pengguna-
annya, isikan path direktori sebagai argumen konstruktor
kelas ini.
$dir = '/tmp';
try {
// Menciptakan objek iterator direktori
$di = new DirectoryIterator($dir);
} catch(Exception $e) {
echo 'File tidak ditemukan..';
}
try {
// Menciptakan objek iterator rekursif
$rdi = new RecursiveDirectoryIterator($dir);
$rii = new RecursiveIteratorIterator($rdi);
225
// Cetak semua file beserta path-nya
foreach ($rii as $fl) {
echo $fl, '<br />';
}
} catch(Exception $e) {
echo 'File tidak ditemukan..';
}
99
Operasi File dengan PEAR
Bagian ini secara khusus akan menjelaskan operasi-operasi
file dengan memanfaatkan paket PEAR. Sebenarnya ada
beberapa paket yang terkait dengan operasi file, namun di
sini kita memfokuskan pada fungsionalitas paket File dan
File_Find.
• Paket File
Paket ini memungkinkan kita melakukan operasi-operasi
standar pada file dan direktori dengan mudah. Secara umum,
fungsionalitas ekstensi Filesystem terangkum di dalam paket
File.
require_once 'File.php';
$fl = './test.txt';
226
• Paket File_Find
Paket ini memungkinkan kita melakukan pencarian file
dengan pola yang variatif. Bagi Anda yang terbiasa meng-
gunakan explorer file, Anda bisa memanfaatkan jenis pola
shell.
require_once 'File/Find.php';
$dir = '/tmp';
echo '<pre>';
print_r($fl);
echo '<pre>';
print_r($fl);
• Paket File_SearchReplace
Paket ini sangat berguna ketika Anda ingin me-replace teks di
satu atau lebih file. Kelebihan lain dari paket ini adalah
mampu menangani semua file di direktori dan mengabaikan
baris teks tertentu.
Require_once 'File/SearchReplace.php' ;
// File target
$files = array( 'test1.txt',
227
'test2.txt',
'test3.txt'
);
$dir = './';
// Menciptakan objek
$sr = new File_SearchReplace($find, $repl,
$files, $dir, $sub, $ignoreline) ;
100
Upload File
Di PEAR, kita bisa memanfaatkan paket HTTP_Upload
untuk mengirim file dengan mudah dan aman. Fitur yang
disediakan paket ini tergolong cukup lengkap, meliputi me-
kanisme validasi, informasi upload, dan penanganan bebe-
rapa file sekaligus. Berikut contoh sederhana penggunaan
HTTP_Upload.
<form action="<?php $_SERVER['PHP_SELF'];?>"
method="post" enctype="multipart/form-data">
<input type="file" name="fl" />
<input type="submit" name="submit" />
</form>
<?php
228
if (isset($_POST['submit'])) {
require_once 'HTTP/Upload.php';
// Lokasi upload
$dir = 'upload';
if ($fl->isValid()) {
// Upload file
$moved = $fl->moveTo($dir);
if (!PEAR::isError($moved)) {
echo 'Upload berhasil';
echo '<pre>';
// Debug (print info)
print_r($fl->getProp());
} else {
echo $moved->getMessage();
}
} elseif ($fl->isMissing()) {
echo 'File Kosong';
} elseif ($fl->isError()) {
echo $file->errorMsg();
}
<?php
if (isset($_POST['submit'])) {
require_once 'HTTP/Upload.php';
// Lokasi upload
$dir = 'upload';
229
$hu = new HTTP_Upload('en');
// Mendapatkan array file
$fls = $hu->getFiles();
foreach($fls as $fl){
if (PEAR::isError($fl)) {
echo $fl->getMessage();
}
if ($fl->isValid()) {
$moved = $fl->moveTo($dir);
if (PEAR::isError($moved)) {
echo $moved->getMessage();
}
$real = $fl->getProp('real');
echo 'File ' . $real .
' berhasil diupload', '<br />';
} elseif ($fl->isMissing()) {
echo 'File Kosong', '<br />';
} elseif ($fl->isError()) {
echo $fl->errorMsg();
}
}
101
Kompres/Dekompres File
PHP tidak hanya mampu digunakan untuk mendukung
operasi-operasi file standar, tetapi juga memungkinkan
melakukan operasi spesifik, seperti kompres/dekompres file.
Untuk melakukan operasi ini, Anda bisa memilih pendekatan
ekstensi built-in, PEAR, atau menulis program sendiri.
Di bagian ini, kita memilih langkah yang paling praktis, yakni
memanfaatkan ekstensi Zip File. Sebelumnya, pastikan
bahwa Anda sudah mengaktifkan ekstensi karena normalnya
230
belum aktif. Berikut contoh penggunaan ekstensi Zip File
yang direpresentasikan melalui objek ZipArchive.
$zip = new ZipArchive();
$fl = './test.zip';
231
require_once 'Archive/Tar.php';
// Isi arsip
$fl[0] = './dir/elex.gif';
$fl[1] = './dir/test.doc';
$fl[2] = './dir/test.txt';
232