Selamat datang kembali di seri Tutorial Pemrograman! Di part sebelumnya, kita telah mempelajari tentang Advanced Error Handling with Custom Exceptions in PHP. Kali ini, kita akan menyelami topik yang cukup powerful namun sering terlewatkan: PHP Stream Filters. Stream Filters memungkinkan Anda untuk memproses data secara real-time saat dibaca atau ditulis ke stream, seperti file atau koneksi jaringan. Bayangkan ini sebagai 'filter' yang membersihkan atau mengubah air sebelum mencapai tujuan. Prasyarat untuk part ini adalah pemahaman dasar tentang input/output file di PHP.
Secara sederhana, stream filter adalah komponen yang memodifikasi data saat data mengalir melalui stream. Analogi dunia nyatanya adalah penyaring air. Air (data) melewati penyaring (stream filter), dan hasilnya adalah air yang lebih bersih (data yang termodifikasi). Dalam konteks PHP, stream bisa berupa file, koneksi socket, atau bahkan string. Stream Filter dapat melakukan berbagai macam hal, mulai dari mengenkripsi data, mengkonversi karakter, hingga memampatkan data secara real-time.
Mari kita buat stream filter sederhana yang mengubah semua karakter menjadi huruf besar:
<?php
class UppercaseFilter extends php_user_filter {
public function filter($in, $out, &$consumed, $closing) {
$bucket_out = stream_bucket_make_writeable($out);
if ($bucket_out === null) {
return PSFS_ERR_FATAL;
}
$bucket_out->data = strtoupper($in->data);
$consumed = strlen($in->data);
stream_bucket_append($out, $bucket_out);
return PSFS_PASS_ON;
}
}
stream_filter_register("uppercase", "UppercaseFilter");
$file = fopen("example.txt", "r+");
stream_filter_append($file, "uppercase");
while (!feof($file)) {
echo fread($file, 8192);
}
fclose($file);
?>
Penjelasan:
PHP menyediakan beberapa stream filter bawaan, salah satunya adalah `zlib.deflate` untuk kompresi data:
<?php
$data = "Ini adalah string yang sangat panjang yang akan kita kompres.";
$file = fopen("compressed.zlib", "w");
stream_filter_append($file, "zlib.deflate", STREAM_FILTER_WRITE, ['level' => 9]);
fwrite($file, $data);
fclose($file);
$file = fopen("compressed.zlib", "r");
stream_filter_append($file, "zlib.inflate", STREAM_FILTER_READ);
echo fread($file, filesize("compressed.zlib"));
fclose($file);
?>
Penjelasan:
Buat stream filter yang mengenkripsi data menggunakan enkripsi sederhana (misalnya, Caesar cipher) saat menulis ke file dan mendekripsi data saat membaca dari file.