Blog Posts » PHP » Mengenal dan Menggunakan Stream di PHP

Mengenal dan Menggunakan Stream di PHP

Apa itu stream? bila diterjemahkan ke bahasa indonesia, stream adalah "aliran". Jika anda membayangkan streaming audio atau video, memang tidak jauh dari konsep itu. Di PHP, stream adalah sebuah obyek sumber daya (resource), yang menunjukkan perilaku dapat mengalir.

Sebelum kita membahas tentang penggunaan stream, kita harus mengetahui sebuah hal yang berkaitan dengan stream yaitu wrapper. Wrapper adalah kode tambahan yang memberi tahu stream bagaimana cara menangani suatu protokol / encoding. Wrapper menggunakan syntax seperti URL. Seperti: file:// yang merupakan standar wrapper yang digunakan PHP untuk mengakses filesystem lokal. readfile('path/to/file.ext'); adalah sama dengan readfile('file://path/to/file.ext');

Untuk melihat wrapper apa saja yang tersedia (built-in) di PHP:
[Textarea][RAW][Download]

  1. print_r(stream_get_wrappers());
  2. /*
  3. Array
  4. (
  5.     [0] => https
  6.     [1] => ftps
  7.     [2] => compress.zlib
  8.     [3] => compress.bzip2
  9.     [4] => php
  10.     [5] => file
  11.     [6] => glob
  12.     [7] => data
  13.     [8] => http
  14.     [9] => ftp
  15.     [10] => zip
  16.     [11] => phar
  17. )
  18. */


Kembali ke stream, stream direferensikan sebagai scheme://target, scheme sendiri adalah nama wrapper dan target tergantung dari wrapper yang digunakan, umumnya adalah jalur dan nama file yang dituju.

Setelah cukup mengetahui apa itu stream di PHP, kita bisa mulai membuka potensi pada stream ini. Kali ini kita akan mencoba menerapkan filter pada stream. Untuk lebih jelasnya perhatikan kode berikut ini:

[Textarea][RAW][Download]

  1. $string = 'Kompress aku...';
  2. $compressed = gzdeflate($string, 9);
  3. $fh = fopen('file.gz', 'w');
  4. fwrite($fh$compressed);
  5. fclose($fh);
  6. $fh = fopen('file.gz', 'r');
  7. $read = fread($fhfilesize('file.gz'));
  8. $uncompressed = gzinflate($read);
  9. fclose($fh);
  10. echo $uncompressed; // Kompress aku...


Kode diatas suatu proses compress dan decompress menggunakan fungsi gzdeflate() dan gzinflate() (Lihat: Beberapa Fungsi Compress di PHP). Fungsi ini akan memuat semua konten dulu ke memory sehingga tidak cocok digunakan untuk compress dan decompress data besar. Kita bisa menggantinya dengan cara menerapkan filter pada stream yang akan bekerja ketika proses stream berlangsung (on the fly).

Untuk melihat filter built-in di PHP:
[Textarea][RAW][Download]

  1. print_r(stream_get_filters());
  2. /*
  3. Array
  4. (
  5.     [0] => zlib.*
  6.     [1] => bzip2.*
  7.     [2] => convert.iconv.*
  8.     [3] => string.rot13
  9.     [4] => string.toupper
  10.     [5] => string.tolower
  11.     [6] => string.strip_tags
  12.     [7] => convert.*
  13.     [8] => consumed
  14.     [9] => dechunk
  15.     [10] => mcrypt.*
  16.     [11] => mdecrypt.*
  17. )
  18. */


Dari data diatas kita ketahui bahwa filter zlib tersedia. Maka kode bisa kita ganti menjadi berikut, menggunakan stream_filter_append():
[Textarea][RAW][Download]

  1. $string = 'Kompress aku...';
  2. $fh = fopen('file.gz', 'w');
  3. stream_filter_append($fh, 'zlib.deflate', STREAM_FILTER_WRITE, 9);
  4. fwrite($fh$string);
  5. fclose($fh);
  6. $fh = fopen('file.gz', 'r');
  7. stream_filter_append($fh, 'zlib.inflate', STREAM_FILTER_READ);
  8. fpassthru($fh); // Kompress aku...
  9. fclose($fh);


Atau menerapkan filter dengan wrapper php://

[Textarea][RAW][Download]

  1. $string = 'Kompress aku...';
  2. $fh = fopen('php://filter/write=zlib.deflate/resource=file.gz', 'w');
  3. fwrite($fh$string);
  4. fclose($fh);
  5. $fh = fopen('php://filter/read=zlib.inflate/resource=file.gz', 'r');
  6. fpassthru($fh); // Kompress aku...
  7. fclose($fh);


Stream juga bisa diterapkan di fungsi-fungsi filesystem lain seperti file_get_contents(), file_put_contents(), dll.

Selamat mencoba :)

(admin.anggit.com)