Menu Navigasi

Tutorial Tutorial Pemrograman Part 62: Mastering PHP Stream Filters for Data Transformation

AI Generated
29 Desember 2025
16 views
Tutorial Tutorial Pemrograman Part 62: Mastering PHP Stream Filters for Data Transformation

Pendahuluan

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.

Konsep Dasar

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.

Hands-on Coding

Contoh 1: Membuat Stream Filter Sederhana

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:

  • `class UppercaseFilter extends php_user_filter`: Mendefinisikan class filter kita, yang harus mewarisi `php_user_filter`.
  • `filter($in, $out, &$consumed, $closing)`: Method ini dipanggil setiap kali ada data yang perlu difilter. `$in` adalah bucket input, `$out` adalah bucket output.
  • `stream_bucket_make_writeable($out)`: Membuat bucket output yang bisa ditulisi.
  • `$bucket_out->data = strtoupper($in->data)`: Mengubah data menjadi huruf besar.
  • `$consumed = strlen($in->data)`: Menunjukkan berapa banyak data yang telah diproses.
  • `stream_bucket_append($out, $bucket_out)`: Menambahkan bucket output ke stream.
  • `stream_filter_register("uppercase", "UppercaseFilter")`: Mendaftarkan filter kita dengan nama "uppercase".
  • `stream_filter_append($file, "uppercase")`: Menambahkan filter "uppercase" ke stream file.

Contoh 2: Menggunakan Stream Filter Bawaan (zlib.deflate)

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:

  • `stream_filter_append($file, "zlib.deflate", STREAM_FILTER_WRITE, ['level' => 9])`: Menambahkan filter kompresi `zlib.deflate` saat menulis ke file. `['level' => 9]` mengatur tingkat kompresi (9 adalah yang tertinggi).
  • `stream_filter_append($file, "zlib.inflate", STREAM_FILTER_READ)`: Menambahkan filter dekompresi `zlib.inflate` saat membaca dari file.

Common Pittfalls

  • Lupa Mendaftarkan Filter: Pastikan Anda telah mendaftarkan filter menggunakan `stream_filter_register()` sebelum menggunakannya.
  • Tidak Menangani Bucket dengan Benar: Pemahaman yang baik tentang bucket (unit data yang diproses) sangat penting. Pastikan Anda membuat dan memanipulasi bucket dengan benar.
  • Performa: Penggunaan stream filter yang berlebihan dapat memengaruhi performa aplikasi. Uji dan optimalkan kode Anda jika perlu.
  • Mode STREAM_FILTER_READ vs STREAM_FILTER_WRITE: Pastikan anda menggunakan mode yang tepat sesuai dengan operasi yang anda lakukan.

Challenge

Buat stream filter yang mengenkripsi data menggunakan enkripsi sederhana (misalnya, Caesar cipher) saat menulis ke file dan mendekripsi data saat membaca dari file.

Sumber Referensi

Bagikan: