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:
export GOLDPRICE_API_KEY=ga_live_replace_with_your_key_herePaket 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:
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.
<?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.
php goldprice.php# XAU-USD: 4012.75 (computed 2026-10-23T07:00:18.221118+00:00)# 5 troy oz = 20063.7500 USDGanti 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.
$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
{ "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
| Kode | Gejala | Solusi |
|---|---|---|
| 401 | RuntimeException: goldprice: unexpected status 401 | Kunci 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. |
| 429 | Tiga percobaan ulang dengan jeda semuanya menghasilkan 429, lalu RateLimitedException dilempar | Anda 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/A | Galat pembulatan saat harga diubah menjadi float untuk perhitungan | Jangan 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_fetchagar 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
bcdivdengan faktor konversi troy ounce ke gram untuk menampilkan harga eceran per gram