チュートリアルコード

PHPでリアルタイムの金価格を取得する方法

PHPの標準cURL、正確な計算用のBCMath、429時の再試行、60秒キャッシュでgoldprice.dev APIを呼び出します。Composerは不要です。

2026年6月26日 · 読了時間:4分

PHPでリアルタイムの金価格を取得するには、標準のcURLでapi.goldprice.dev/v1/spot/XAU-USD-SPOTにGETリクエストを送ります。APIキーはX-API-Keyヘッダーに指定します。Composerは不要です。JSONをデコードし、価格は文字列のままBCMathで正確に計算します。銘柄ごとに60秒間キャッシュします。無料プランは月5,000回までで、クレジットカードは不要です。2026年6月にPHP 8.3で動作確認済みです。

goldprice.devのAPIキーを取得する

goldprice.dev/onboardingで無料アカウントを作成します。メール認証後、ダッシュボードにga_live_で始まるキーが表示されます。環境変数に設定します。

Shell
export GOLDPRICE_API_KEY=ga_live_replace_with_your_key_here

無料プランでは月5,000回まで呼び出せます。金のスポット価格は31通貨に対応しています。クレジットカードは不要です。

必要な拡張機能を確認する

Composerパッケージは不要です。curlとjsonはPHP 8に含まれ、bcmathは正確な小数計算に使う標準拡張機能です。すべて有効になっているか確認します。

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

goldpriceクライアントを作成する

次のコードをgoldprice.phpとして保存します。spot()は銘柄ごとに静的配列へ60秒間キャッシュし、429時は指数バックオフで最大3回再試行します。デコードした配列の価格は文字列のまま返すため、BCMathで正確に計算できます。

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']);

実行する

GOLDPRICE_API_KEYを設定したシェルから、CLIでファイルを実行します。初回はAPIにアクセスし、同じプロセスで60秒以内にspot()を呼ぶとキャッシュした配列を返します。静的キャッシュはプロセス単位です。PHP-FPMでリクエスト間の共有が必要なら、APCuやRedisを使います。

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

通貨や金属を変更する

銘柄の形式はMETAL-CURRENCY-SPOTです。対応する31通貨の銘柄をspot()に渡します。静的配列では銘柄ごとにキャッシュします。5銘柄を表示するページでは、キャッシュがなければ最大5回呼び出し、有効期間内の次の描画では再利用します。

goldprice.php · 複数通貨
$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');

出力例

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には、銘柄、通貨、価格、タイムスタンプと、BCMathで計算した5トロイオンス分の価格が別々の行に表示されます。後続のコードではデコードした配列を使い、価格は文字列のまま扱います。

よくあるエラー

コード症状対処方法
401RuntimeException: goldprice: unexpected status 401が出るAPIキーが未設定か無効です。php -r 'echo getenv("GOLDPRICE_API_KEY");'でPHPから環境変数を読めるか確認します。PHP-FPMにはCLIの環境変数が共有されないため、fastcgi_paramやプロセスマネージャーで設定します。値が空ならダッシュボードからキーをコピーし直してください。
429待機を挟んで3回再試行しても429が返り、RateLimitedExceptionが発生する分あたりの上限に達しています。一定のアクセスには60秒キャッシュが有効です。PHP-FPMの静的キャッシュはリクエスト単位なので、APCuのapcu_fetchとapcu_storeに置き換えて共有します。大量の呼び出しを継続する場合は、/pricingで有料プランを確認してください。
N/A価格をfloatに変換して計算すると丸め誤差が出る計算前に価格を(float)へ変換しないでください。PHPの浮動小数点数は合計時に精度が失われます。APIが返す文字列を保ち、小数点以下の桁数を明示してbcadd、bcmul、bccompを使います。関数が未定義ならbcmath拡張機能を有効にします。

活用方法

  • 静的キャッシュをapcu_storeとapcu_fetchに置き換え、取得した価格を60秒間すべてのPHP-FPMワーカーで共有します
  • /v1/bars?symbol=XAU-USD-SPOT&interval=1d&from=...&to=...用のbars()メソッドを追加し、テンプレートエンジンでデータをグラフにします
  • spot()をLaravelやSymfonyの小さなサービスにまとめ、コンテナに登録して依存性注入で使います
  • 複数のワーカーが同じ銘柄を取得する場合は、If-None-MatchとETagの確認を追加し、変更のないデータの受信を省きます
  • bcdivとトロイオンスからグラムへの換算係数を使い、小売向けにグラム単価を表示します

よくある質問

価格はどのくらいの間隔で更新されますか

スポット価格のエンドポイントは60秒ごとに更新されます。利用許諾を受けたリアルタイム価格ですが、FreeとAPIキーなしの価格は15分遅れ、有料プランはリアルタイムです。この例の有効期間も60秒です。その間にspot()を繰り返し呼んでもHTTP通信は発生せず、キャッシュした配列を返します。

自動更新しても無料プランの範囲に収まりますか

アクセス数によります。キャッシュのないリクエストごとにAPIを呼ぶページは、月5,000回の無料枠をすぐに超えることがあります。APCuでキャッシュを共有し、取得した価格を複数のリクエストに使ってください。毎時数回の取得なら無料枠に十分収まります。継続的に大量取得する場合は、/pricingで有料プランを確認してください。

商用利用できますか

すべてのプランで商用利用できます。有料プランではクレジット用のリンクは不要です。Freeでは、価格の近くにgoldprice.devへのリンクを見える形で表示する必要があります。

floatではなくBCMathを使う理由は何ですか

PHPの浮動小数点数はIEEE-754の倍精度形式です。0.1 + 0.2は0.30000000000000004となり、計算を重ねると誤差が蓄積します。金価格は小数点以下2桁で、数千件をfloatで合計するとベーシスポイント単位のずれが生じます。BCMathは小数の文字列を指定した桁数で直接計算するため、合計の精度を保てます。

ComposerやGuzzleは本当に不要ですか

はい。curlとjsonはPHP 8に含まれるため、APIキー以外に追加のインストールは不要です。すでにGuzzleを使っている場合は、curl_*を再試行ミドルウェア付きのGuzzleクライアントに置き換えられます。X-API-Keyヘッダー付きのGETというリクエスト形式は同じです。

どの金属に対応していますか

金(XAU)、銀(XAG)、銅(HG)に対応しています。プラチナとパラジウムは、どのプランでも提供していません。銘柄の金属コードを変更して使います。銀なら$client->spot("XAG-USD-SPOT")です。

Claudeにコードを書いてもらえますか

はい。goldprice.devのMCPサーバーを設定したClaude Desktopで、次のように依頼します。goldprice.devの/v1/spot用PHP 8クライアントを作成してください。Composerを使わず標準cURLを使い、銘柄ごとの60秒間の静的キャッシュと、429時の指数バックオフによる再試行を実装してください。価格はBCMath用に文字列で保ち、APIキーはGOLDPRICE_API_KEYから読み込んでください。MCPサーバーが最新のスキーマを渡すため、最初から正しいフィールド名でコードを生成できます。

続きを読む

無料のAPIキーで始める

無料プランで月5,000リクエスト利用できます。クレジットカードは不要です。

無料キーを取得