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]
- print_r(stream_get_wrappers());
- /*
- Array
- (
- [0] => https
- [1] => ftps
- [2] => compress.zlib
- [3] => compress.bzip2
- [4] => php
- [5] => file
- [6] => glob
- [7] => data
- [8] => http
- [9] => ftp
- [10] => zip
- [11] => phar
- )
- */
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]
- $string = 'Kompress aku...';
- $compressed = gzdeflate($string, 9);
- $fh = fopen('file.gz', 'w');
- fwrite($fh, $compressed);
- fclose($fh);
- $fh = fopen('file.gz', 'r');
- $read = fread($fh, filesize('file.gz'));
- $uncompressed = gzinflate($read);
- fclose($fh);
- 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]
- print_r(stream_get_filters());
- /*
- Array
- (
- [0] => zlib.*
- [1] => bzip2.*
- [2] => convert.iconv.*
- [3] => string.rot13
- [4] => string.toupper
- [5] => string.tolower
- [6] => string.strip_tags
- [7] => convert.*
- [8] => consumed
- [9] => dechunk
- [10] => mcrypt.*
- [11] => mdecrypt.*
- )
- */
Dari data diatas kita ketahui bahwa filter zlib tersedia. Maka kode bisa kita ganti menjadi berikut, menggunakan stream_filter_append():
[Textarea][RAW][Download]
- $string = 'Kompress aku...';
- $fh = fopen('file.gz', 'w');
- stream_filter_append($fh, 'zlib.deflate', STREAM_FILTER_WRITE, 9);
- fwrite($fh, $string);
- fclose($fh);
- $fh = fopen('file.gz', 'r');
- stream_filter_append($fh, 'zlib.inflate', STREAM_FILTER_READ);
- fpassthru($fh); // Kompress aku...
- fclose($fh);
Atau menerapkan filter dengan wrapper php://
[Textarea][RAW][Download]
- $string = 'Kompress aku...';
- $fh = fopen('php://filter/write=zlib.deflate/resource=file.gz', 'w');
- fwrite($fh, $string);
- fclose($fh);
- $fh = fopen('php://filter/read=zlib.inflate/resource=file.gz', 'r');
- fpassthru($fh); // Kompress aku...
- fclose($fh);
Stream juga bisa diterapkan di fungsi-fungsi filesystem lain seperti file_get_contents(), file_put_contents(), dll.
Selamat mencoba
(admin.anggit.com)