Kompresi JSON dan Set Header PHP

By | January 8, 2023
Print Friendly, PDF & Email
100 Views

Bagi pembuat rest API yang return JSON berukuran cukup besar. Maka teknik kompresi perlu digunakan untuk mengecilkan file pada saat loading. Secara umum teknik kompresi menggunakan GZIP dengan kecilnya ukuran file maka berdampak pada semakin cepatnya waktu loading website/blog serta hemat bandwith.

Kompresi ini sama seperti kita meng compress file pada umumnya (.zip, .rar, .tar.gz), wah berarti ada tambahan proses yang terjadi ya? jawabnya, iya, karena server harus meng-compress setiap file yang dikirim, namun, proses ini umumnya membutuhkan resource kecil dan berlangsung sangat cepat.

Penggunaan Encoding GZIP sangat bermanfaat sekali untuk format data seperti JSON yang terdapat banyak sekali perulangan. Bahkan penggunaan teknik ini sampai bisa berkurang 90% alias ukuran file hanya 10% saja dari awal. Cara kerja sistem kompresi ini secara ringkas sebagai berikut:

  1. Browser meminta halaman tertentu kepada server disertai informasi kemampuan kompresi yang dimiliki browser.
  2. Jika browser mimiliki sistem kompresi, server akan mengirim file yang terkompresi (gzip), jika tidak, maka server akan mengirim file apa adanya.
  3. Browser menerima file tersebut. Jika bentuk file terkompresi, maka browser akan mengekstraknya terlebih dahulu sebelum menampilkannya ke user.

Kompresi Gzip pada server Apache

Apache menggunakan mod_deflatepada apache 2. Berikut pengaturan.htaccess  agar server melakukan kompresi. Kode berikut ini akan meng-compress semua file kecuali image, document (pdf, docx, dll), executable, dan file archive:

<IfModule mod_deflate.c>
   SetOutputFilter DEFLATE
   SetEnvIfNoCase Request_URI \
      \.(?:gif|jpe?g|png)$ no-gzip dont-vary
   SetEnvIfNoCase Request_URI \
      \.(?:exe|zip|rar|7z)$ no-gzip dont-vary
   SetEnvIfNoCase Request_URI \
      \.(?:pdf|docx|xlsx)$ no-gzip dont-vary
</IfModule>

Setting Header di PHP

Setelah pengaturan tersebut diatas, kita perlu set header, misalkan pada Framework Code Igniter kita akan membuat output JSON yang semula

echo (json_encode($data,JSON_NUMERIC_CHECK ));

kita akan ubah dengan Kompresi JSON dan Set Header PHP yaitu dengan skala kompresi maksimum 9

$this->output->set_header('Content-Encoding: gzip')
              ->set_header('Vary: Accept-Encoding')
              ->set_content_type('application/json')
              ->set_output(gzencode(json_encode($data,JSON_NUMERIC_CHECK), 9));

Berikut perbedaan akan sangat jelas sekali antara sebelum dan sesudah penggunaan kompresi dengan ukuran

  • 9MB sebelum menggunakan kompresi GZIP
  • menjadi 949 KB atau 1 MB saja (berkurang 90%)

Sebelum menggunakan kompresi GZIP

 

Sesudah menggunakan kompresi GZIP

Contoh Kasus

Berikut contoh penerapan Kompresi JSON dan Set Header PHP yaitu https://softscients.com/stocks/index.php/screening dengan API https://softscients.com/stocks/index.php/yahoo/getStock yang menghasilkan return JSON 85.689 record yang sangat membantu mengurangi ukuran transfer dari semula 9.52 MB menjadi hanya 1.01 MB saja

See also  Plotly JavaScript untuk Visualisasi Grafik yang Dinamis

Kita bisa melihat record dalam tabel

Apa itu Brotli?

Brotli adalah algoritma kompresi yang dikembangkan oleh dua teknisi dari Google. Brotli sengaja diciptakan untuk membuat halaman website bisa diakses lebih cepat.

Dengan teknik kompresi ini, file data menjadi berukuran lebih kecil sehingga menghemat penggunaan data saat komunikasi data terjadi. Kondisi tersebut juga membuat proses transfer data bisa berjalan lebih baik.

Tapi tidak semua browser mendukung brotli (br). LinkedIn adalah salah satu website yang sudah mengimplementasikan Brotli. LinkedIn sendiri sudah melakukan benchmarked performance antara Brotli, Zopfli, dan gzip pada sebuah file JavaScript di halaman utama LinkedIn. Mereka menemukan bahwa brotli -11 membantu mengecilkan ukuran file 30% lebih dari gzip -6. Kecepatan decompressionnya sendiri lebih cepat dari gzip dan Zopfli.

 

ref: dewaweb.com

Leave a Reply

Your email address will not be published.




Enter Captcha Here :