TutorialKode

Cara mengambil harga emas live di PHP

Akses API goldprice.dev dari PHP dengan cURL bawaan, BCMath untuk perhitungan presisi, percobaan ulang saat 429, dan cache 60 detik. Tanpa Composer.

26 Jun 2026 · 4 menit baca

Untuk mengambil harga emas live di PHP, kirim GET ke api.goldprice.dev/v1/spot/XAU-USD-SPOT dengan kunci API Anda di header X-API-Key menggunakan cURL bawaan. Tidak perlu Composer. Dekode JSON, pertahankan harga sebagai string, dan gunakan BCMath untuk perhitungan desimal presisi. Simpan cache tiap simbol selama 60 detik. Paket Free mencakup 5.000 panggilan/bulan, tanpa kartu kredit. Diuji pada Juni 2026 dengan PHP 8.3.

Dapatkan kunci API goldprice.dev Anda

Daftar akun gratis di goldprice.dev/onboarding. Setelah konfirmasi email, dasbor Anda menampilkan kunci berawalan ga_live_. Simpan sebagai variabel lingkungan:

Shell
export GOLDPRICE_API_KEY=ga_live_replace_with_your_key_here

Paket Free mencakup 5.000 panggilan/bulan dan harga spot emas dalam 31 mata uang. Tidak perlu kartu kredit.

Periksa ekstensi yang diperlukan

Tidak perlu paket Composer. curl dan json disertakan dalam PHP 8, sedangkan bcmath adalah ekstensi standar untuk perhitungan desimal presisi. Pastikan ketiganya aktif:

shell
php -m | grep -E '^(curl|json|bcmath)$'# curl# json# bcmath   <- if missing, install php8.3-bcmath (or enable in php.ini)

Buat klien goldprice

Simpan sebagai goldprice.php. spot() menyimpan cache tiap simbol selama 60 detik dalam array statis, mencoba ulang hingga 3 kali saat 429 dengan jeda eksponensial, dan mengembalikan array hasil dekode. Harga tetap berupa string agar BCMath dapat menghitung secara presisi.

goldprice.php
<?php// php: goldprice.php, native cURL + BCMath, no Composer// curl-equivalent: https://api.goldprice.dev/v1/spot/XAU-USD-SPOTdeclare(strict_types=1);const API_BASE = 'https://api.goldprice.dev';const TIMEOUT  = 5;   // secondsconst TTL      = 60;  // secondsfinal class RateLimitedException extends RuntimeException {}final class GoldpriceClient{    private string $apiKey;    /** @var array<string, array{data: array, expires: int}> */    private static array $cache = [];    public function __construct()    {        $key = getenv('GOLDPRICE_API_KEY');        if ($key === false || $key === '') {            throw new RuntimeException('GOLDPRICE_API_KEY not set');        }        $this->apiKey = $key;    }    /**     * Fetch live spot price. Cached 60s per symbol, retries 3x on 429.     * Prices stay as strings for BCMath.     */    public function spot(string $symbol = 'XAU-USD-SPOT'): array    {        $now = time();        if (isset(self::$cache[$symbol]) && self::$cache[$symbol]['expires'] > $now) {            return self::$cache[$symbol]['data'];        }        for ($attempt = 0; $attempt < 3; $attempt++) {            try {                $data = $this->fetch($symbol);                self::$cache[$symbol] = ['data' => $data, 'expires' => $now + TTL];                return $data;            } catch (RateLimitedException) {                sleep(1 << $attempt); // 1s, 2s, 4s            }        }        throw new RateLimitedException('goldprice: 429 after 3 retries');    }    private function fetch(string $symbol): array    {        $ch = curl_init(API_BASE . '/v1/spot/' . rawurlencode($symbol));        curl_setopt_array($ch, [            CURLOPT_RETURNTRANSFER => true,            CURLOPT_TIMEOUT        => TIMEOUT,            CURLOPT_HTTPHEADER     => ['X-API-Key: ' . $this->apiKey],        ]);        $body = curl_exec($ch);        $code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);        curl_close($ch);        if ($code === 429) {            throw new RateLimitedException('rate limited');        }        if ($code !== 200 || $body === false) {            throw new RuntimeException("goldprice: unexpected status {$code}");        }        return json_decode((string) $body, true, 512, JSON_THROW_ON_ERROR);    }}$client = new GoldpriceClient();$r = $client->spot('XAU-USD-SPOT');// Prices are strings; use BCMath for exact math (e.g. price for 5 oz):$fiveOz = bcmul($r['price'], '5', 4);printf("%s-%s: %s (computed %s)\n", $r['symbol'], $r['quote_currency'], $r['price'], $r['computed_at']);printf("5 troy oz = %s %s\n", $fiveOz, $r['quote_currency']);

Jalankan

Jalankan berkas melalui CLI dari shell tempat Anda mengekspor GOLDPRICE_API_KEY. Panggilan pertama mengakses API. Panggilan spot() berikutnya dalam proses yang sama selama 60 detik mengembalikan array dari cache. Cache statis berlaku per proses. Gunakan APCu atau Redis untuk berbagi cache antarpermintaan pada PHP-FPM.

shell
php goldprice.php# XAU-USD: 4012.75 (computed 2026-10-23T07:00:18.221118+00:00)# 5 troy oz = 20063.7500 USD

Ganti mata uang atau logam

Format simbol adalah METAL-CURRENCY-SPOT. Gunakan salah satu dari 31 mata uang spot saat memanggil spot(). Setiap simbol memiliki cache sendiri dalam array statis. Halaman yang menampilkan 5 simbol membuat paling banyak 5 panggilan tanpa cache, lalu menggunakan kembali hasilnya saat dirender selama cache masih berlaku.

goldprice.php · multivaluta
$client = new GoldpriceClient();// USD spot, default$client->spot('XAU-USD-SPOT');$client->spot('XAU-INR-SPOT');$client->spot('XAU-EUR-SPOT');// Silver in USD$client->spot('XAG-USD-SPOT');

Hasil yang diharapkan

JSON
{  "symbol": "XAU",  "quote_currency": "USD",  "unit": "troy_ounce",  "contract_type": "spot",  "price": "4012.75",  "is_stale": false,  "computed_at": "2026-10-23T07:00:18.221118+00:00"}

CLI menampilkan dua baris: simbol/mata uang/harga/waktu, lalu hasil perkalian BCMath untuk 5 troy ounce. Kode berikutnya menggunakan array hasil dekode. Harga tetap berupa string.

Kesalahan umum

KodeGejalaSolusi
401RuntimeException: goldprice: unexpected status 401Kunci API tidak tersedia atau tidak valid. Periksa apakah PHP menerima variabel: php -r 'echo getenv("GOLDPRICE_API_KEY");'. PHP-FPM tidak berbagi variabel lingkungan CLI. Atur kunci melalui fastcgi_param atau pengelola proses Anda. Jika kosong, salin ulang dari dasbor Anda.
429Tiga percobaan ulang dengan jeda semuanya menghasilkan 429, lalu RateLimitedException dilemparAnda mencapai batas per menit. Cache 60 detik mencegahnya saat trafik stabil. Pada PHP-FPM, cache statis berlaku per permintaan. Gunakan APCu (apcu_fetch / apcu_store) untuk berbagi cache antarpermintaan. Untuk volume tinggi secara terus-menerus, lihat paket berbayar di /pricing.
N/AGalat pembulatan saat harga diubah menjadi float untuk perhitunganJangan ubah harga menjadi (float) sebelum menghitung. Float PHP kehilangan presisi saat dijumlahkan. Pertahankan string dari API dan gunakan bcadd, bcmul, serta bccomp dengan skala yang ditentukan secara eksplisit. Aktifkan ekstensi bcmath jika fungsi tersebut tidak ditemukan.

Langkah berikutnya

  • Ganti cache statis dengan apcu_store / apcu_fetch agar satu pengambilan melayani semua worker PHP-FPM selama 60 detik
  • Tambahkan metode bars() untuk /v1/bars?symbol=XAU-USD-SPOT&interval=1d&from=...&to=... dan tampilkan grafik datanya melalui mesin templat Anda
  • Bungkus spot() dalam layanan Laravel atau Symfony sederhana, lalu daftarkan dalam container untuk injeksi dependensi
  • Tambahkan pemeriksaan If-None-Match / ETag saat banyak worker memeriksa simbol yang sama untuk melewati data yang tidak berubah
  • Gunakan bcdiv dengan faktor konversi troy ounce ke gram untuk menampilkan harga eceran per gram

Pertanyaan

Seberapa sering harga diperbarui?

Endpoint spot diperbarui setiap 60 detik dengan data live. Harga Free dan tanpa kunci terlambat 15 menit; paket berbayar live. TTL 60 detik mengikuti jadwal tersebut. Panggilan spot() selama periode itu mengembalikan array dari cache tanpa permintaan HTTP.

Apakah pembaruan otomatis masih masuk kuota paket Free?

Tergantung trafik. Halaman yang mengakses API pada setiap permintaan tanpa cache bisa cepat melampaui kuota Free 5.000/bulan. Gunakan cache bersama melalui APCu agar satu pengambilan melayani banyak permintaan. Situs dengan sedikit trafik dan beberapa panggilan per jam masih dalam kuota. Untuk volume tinggi secara terus-menerus, lihat paket berbayar di /pricing.

Bolehkah digunakan secara komersial?

Semua paket mengizinkan penggunaan komersial. Paket berbayar tidak mewajibkan tautan atribusi. Jika Anda menggunakan paket Free, tampilkan tautan ke goldprice.dev yang terlihat jelas di dekat harga.

Mengapa menggunakan BCMath, bukan float?

Float PHP menggunakan double IEEE-754: 0.1 + 0.2 menghasilkan 0.30000000000000004. Galat menumpuk setelah banyak operasi. Harga emas memiliki 2 angka desimal, sehingga penjumlahan ribuan nilai float bisa meleset dalam basis poin. BCMath menghitung langsung dari string desimal dengan skala tetap agar total tetap presisi.

Benarkah tidak perlu Composer atau Guzzle?

Benar. curl dan json disertakan dalam PHP 8, jadi Anda cukup menyiapkan kunci API tanpa instalasi tambahan. Jika sudah menggunakan Guzzle, ganti curl_* dengan klien Guzzle beserta middleware percobaan ulang. Bentuk permintaannya sama: GET dengan header X-API-Key.

Logam apa saja yang didukung?

Logam yang didukung adalah emas (XAU), perak (XAG), dan tembaga (HG). Platinum dan paladium tidak tersedia pada paket mana pun. Ganti kode logam dalam simbol, misalnya $client->spot("XAG-USD-SPOT").

Bisakah Claude membuatkan kode ini?

Bisa. Buka Claude Desktop dengan server MCP goldprice.dev terpasang, lalu minta: Buat klien PHP 8 untuk endpoint goldprice.dev /v1/spot. Gunakan cURL bawaan tanpa Composer, cache statis per simbol selama 60 detik, percobaan ulang saat 429 dengan jeda eksponensial, dan harga berupa string untuk BCMath. Baca kunci API dari GOLDPRICE_API_KEY. Server MCP menyediakan skema terkini agar nama kolom benar sejak awal.

Baca selanjutnya

Mulai dengan kunci API gratis

5.000 permintaan per bulan pada paket gratis. Tanpa kartu kredit.

Dapatkan kunci gratis