チャットGPTをPHPから使うとは?

チャットGPTをPHPから使うとは?

PHPからチャットGPTを使うとは、ブラウザの画面を通さずに、自分のPHPプログラムからOpenAIのAIへ質問を送って回答を受け取ることです。

その窓口になるのがAPIです。APIとは、他のソフトからAIを呼び出す窓口のこと。普段のチャット画面でやっている「質問して答えをもらう」動きを、プログラムが代わりにやってくれます。

できることは幅広いです。

  • 問い合わせフォームの返信の下書きを自動で作る
  • 商品説明やブログの要約をまとめて生成する
  • WordPressやLaravelのサイトにチャット欄を付ける
  • 社内のCSVやログを読ませて、分類やタグ付けをする

ここで混同しやすいのが、ChatGPTのアプリとAPIの関係。中身のAIは同じ系統ですが、契約も料金も別物です。チャット画面を開くための公式URLやログイン方法は、チャットgpt公式サイトのURLと3ステップのログイン手順にまとめています。偽サイトでキーを入力してしまう事故を防ぐためにも、一度目を通しておくと安心です。

ChatGPT自体の機能や評判を先に押さえたい方は、ChatGPTのツール詳細ページも参考になります。全体像がつかめたら、手を動かす前の準備物を確認していきます。


ChatGPT icon
この記事で紹介 / AIチャットボット4.65無料あり日本語◎最低料金 ¥0〜

ChatGPTが合わなかったら

ブラウザのサイドバーでChatGPT・Claude・Geminiを切り替えて、見ているページを要約できる

編集部のおすすめ

複数のAIに同じ質問をして答えを比べたり、講座で使い方を体系立てて学んだりできます。

  • ChatPlayground AI icon

    30以上のAIの回答を1画面で並べて比べられる

    AIチャットボット / 最低料金 ¥0〜

  • Aqua Voice icon

    初月10ドルオフ(新規ユーザー)

    ChatGPTやClaudeへの長い指示を、打たずに声で入力できる。日本語にも対応し、Mac・Windowsのどのアプリでも使える(無料は1,000語まで)

    AI音声・文字起こし / 最低料金 ¥0〜

  • Magai icon

    ChatGPT・Claude・Geminiなど複数のAIを、会話を続けたまま1つの画面で切り替えられる(有料プランのみ)

    AIチャットボット / 最低料金 ¥0〜

始める前に何が必要?準備物と費用の考え方

始める前に何が必要?準備物と費用の考え方

必要なのは「OpenAIのアカウント」「APIキー」「PHPが動く環境」「支払い設定」の4つです。どれも30分あれば揃います。

準備物を一覧にすると次の通りです。

準備するもの内容つまずきやすい点
OpenAIアカウントChatGPTと共通のアカウントでログイン可会社用と個人用を混ぜない
APIキー管理画面で発行する秘密の文字列発行時の1回しか全文が表示されない
PHP環境cURL拡張が有効なPHP 8系が目安レンタルサーバーは古い版が既定のことがある
支払い設定API用のクレジット購入やカード登録ChatGPT Plusの契約では代用できない

つまり、ChatGPTの有料プランに入っていても、APIを使うには別途支払いの設定が要ります。

ここは本当に勘違いが多い部分です。ChatGPT公式の料金ページ(日本向け表示)では、2026年10月29日時点でPlusが月額¥3,000、Goが月額¥1,400と案内されています。この金額はあくまでチャット画面の利用料。APIの請求には含まれません。

比べる点ChatGPT(アプリ・ブラウザ)OpenAI API
払い方月額の定額制使った分だけの従量課金
使う場所チャット画面自分のプログラムの中
向いている人自分で質問して使う人サイトや業務に組み込みたい人
管理画面ChatGPTの設定画面OpenAIのAPI管理画面

整理すると、自分で使うなら定額のChatGPT、プログラムに組み込むならAPI、という分担です。

Plusで何ができるのか気になる方は、チャットGPTプラスとは?月額20ドルでできること7つと無料版の違いが判断の助けになります。準備物が分かったところで、APIキーを実際に発行します。


APIキーを取得する4ステップ

APIキーはOpenAIのAPI管理画面(https://platform.openai.com/api-keys)から数クリックで発行できます。

手順は次の4つです。

  1. OpenAIのAPI管理画面にログインする(ChatGPTと同じアカウントで可)
  2. 支払い設定(Billing)でカードを登録し、必要ならクレジットを購入する
  3. 「API keys」から「Create new secret key」を押し、名前を付けて発行する
  4. 表示されたキーをすぐにパスワード管理ツールなどへ控える

キーの全文が表示されるのは発行した瞬間だけ。 閉じてしまうと二度と見られません。控え忘れたら、そのキーは削除して新しく作り直すのが早いです。

名前は用途が分かるものにしておくと、あとで地味に効きます。「wordpress-contact-form」「local-test」のように分けておけば、どこから使われたキーかがひと目で分かります。漏えいしたときに止める範囲も小さく済みます。

なお、管理画面の表示言語で迷ったら、チャットgptブラウザで日本語設定と料金を確認が参考になります。キーが手に入ったら、次はそれをPHPから安全に読み込む方法です。


APIキーをPHPで安全に扱う方法

APIキーはコードに直接書かず、環境変数か .env ファイルに置いてPHPから読み込みます。

キーをソースコードに書くと、GitHubへのpushやファイル共有のたびに漏れる危険があります。漏れたキーは他人に使われ、請求はあなたに来る。ここが一番の落とし穴です。

おすすめの置き方を比べました。

置き場所安全性向いている環境
サーバーの環境変数高いVPS・クラウド・Docker
.env ファイル(公開ディレクトリの外)中〜高レンタルサーバー・Laravel
PHPファイルに直書き低い使わない
JavaScript側に埋め込み非常に低い絶対に使わない

選ぶべきは、サーバーの環境変数か、公開ディレクトリの外に置いた .env の2択です。

読み込みは getenv() で済みます。

<?php
// 環境変数 OPENAI_API_KEY からキーを読む
$apiKey = getenv('OPENAI_API_KEY');

if ($apiKey =<mark> false || $apiKey </mark>= '') {
    exit("OPENAI_API_KEY が設定されていません\n");
}

ローカルでの試し方は、ターミナルで export OPENAI_API_KEY="sk-..." を実行してから php test.php を動かすだけ。Laravelなら .env に OPENAI_API_KEY= を1行足し、config/services.php 経由で読むのが定番です。

.env を使うなら .gitignore に必ず追加してください。ブラウザから https://example.com/.env で開けてしまわないかも、一度確かめておくと安心です。キーの置き場所が決まれば、いよいよ最初のコードを動かせます。


実装例1:cURLだけで最小コードを動かす

ライブラリを入れずに、PHP標準のcURLだけでチャットGPTに質問して回答を表示するコードです。

どのサーバーでも動くので、まずはこれで疎通を確かめるのが近道。以下を hello.php として保存してください。

<?php
$apiKey = getenv('OPENAI_API_KEY');
if (!$apiKey) {
    exit("OPENAI_API_KEY が設定されていません\n");
}

$payload = [
    'model' => 'gpt-6-luna',
    'input' => 'PHPで配列を逆順にする方法を1行で教えてください',
];

$ch = curl_init('https://api.openai.com/v1/responses');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'Content-Type: application/json',
        'Authorization: Bearer ' . $apiKey,
    ],
    CURLOPT_POSTFIELDS     => json_encode($payload, JSON_UNESCAPED_UNICODE),
    CURLOPT_TIMEOUT        => 60,
]);

$body   = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ($body === false) {
    exit('通信エラー: ' . curl_error($ch) . "\n");
}
curl_close($ch);

$data = json_decode($body, true);

if ($status !== 200) {
    $message = $data['error']['message'] ?? '不明なエラー';
    exit("エラー {$status}: {$message}\n");
}

// 回答テキストを取り出す
$text = '';
foreach ($data['output'] ?? [] as $item) {
    if (($item['type'] ?? '') !== 'message') {
        continue;
    }
    foreach ($item['content'] ?? [] as $part) {
        if (($part['type'] ?? '') === 'output_text') {
            $text .= $part['text'];
        }
    }
}

echo $text . "\n";

php hello.php を実行して array_reverse の説明が返ってくれば成功です。

押さえるべき点は3つあります。

  • model に使うモデル名を入れる(ここでは軽量版の名前を例にしています)
  • input がAIへの指示文。プロンプトとも呼ばれます
  • 回答は output の中の output_text に入っている

回答の取り出しが入れ子になっていて、少し面倒に見えますよね。Responses APIは画像やツール呼び出しの結果も同じ箱に入れて返すので、こういう形になっています。テキストだけ欲しいなら、上の foreach を関数にしておけば使い回せます。

CURLOPT_TIMEOUT は必ず付けてください。付けないと、AI側の応答が遅いときにPHPのプロセスが待ち続けます。長い回答を作らせるなら90〜120秒に延ばすのが無難です。

指示文を試行錯誤するときは、いきなりコードで回すより、チャット画面で文面を固めてから貼るほうが早いです。複数行の指示文を作るコツはチャットGPTで改行する3つの方法が参考になります。動作確認ができたら、もう少し書きやすい方法に移ります。


ChatGPTの新機能・料金改定を週1回メールで受け取る無料

毎週月曜の朝に、今週のChatGPTのニュースとアップデートを先頭に、AI全体の主なニュースと新しく載ったツールをまとめて届けます。登録特典は「AIツール選定チェックリスト 2026」。

確認メールのボタンを押すと登録が完了します。配信はいつでも解除できます。

実装例2:Composerのライブラリで書く

コード量を減らしたいなら、Composerで openai-php/client を入れるのが一択です。

PHP向けのOpenAIクライアントとして広く使われているコミュニティ製ライブラリです。HTTPの送受信を任せられるので、本題のロジックに集中できます。インストールは次の1行。

composer require openai-php/client guzzlehttp/guzzle

guzzlehttp/guzzle は通信を担当する部品です。入っていないと「HTTPクライアントが見つからない」というエラーになるので、一緒に入れておきます。

<?php
require __DIR__ . '/vendor/autoload.php';

$client = OpenAI::client(getenv('OPENAI_API_KEY'));

$result = $client->chat()->create([
    'model'    => 'gpt-6-luna',
    'messages' => [
        [
            'role'    => 'system',
            'content' => 'あなたはPHPに詳しい先輩エンジニアです。短く具体的に答えてください。',
        ],
        [
            'role'    => 'user',
            'content' => 'PDOでSQLインジェクションを防ぐ書き方を教えてください',
        ],
    ],
]);

echo $result->choices[0]->message->content . "\n";

ここでは昔から使われているChat Completionsの形で書いています。system がAIの役割設定、user が質問です。役割を1行決めるだけで、回答の口調と長さがかなり安定します。

ライブラリはResponses API用のメソッドも用意しています。新しく作るならそちらに寄せるのも手です。ただ、モデルによって対応するAPIの形が違うことがあります。動かないときは、公式ドキュメントのモデルページで対応状況を確かめてください。

素のcURLとライブラリ、どちらを選ぶべきか。

比べる点素のcURL(例1)openai-php/client(例2)
導入の手間ゼロComposerが必要
コード量多め少ない
レンタルサーバーほぼ確実に動くComposerが使えるか要確認
型補完・エラー処理自前で書く例外クラスが用意されている

つまり、Composerが使える環境ならライブラリ、使えないレンタルサーバーなら素のcURL、という分け方で迷いません。

Laravelを使っているなら、同じ作者によるLaravel向けパッケージもあります。設定ファイルとファサードが用意されていて重宝します。書き方が固まったところで、実務でそのまま使える形に仕上げます。


実装例3:問い合わせ返信の下書きを自動で作る

問い合わせフォームの内容をチャットGPTに渡し、担当者が手直しする前提の返信下書きを作る実装です。

AIに直接メールを送らせると、間違った内容がそのままお客さんに届きます。下書き止まりにして、人が確認してから送る。 これが事故を防ぐいちばん確実な線引きです。

<?php
function askOpenAI(string $instructions, string $input): string
{
    $apiKey  = getenv('OPENAI_API_KEY');
    $payload = json_encode([
        'model'        => 'gpt-6-luna',
        'instructions' => $instructions,
        'input'        => $input,
    ], JSON_UNESCAPED_UNICODE);

    // 混雑時のみ1回だけ再試行する
    for ($try = 1; $try <= 2; $try++) {
        $ch = curl_init('https://api.openai.com/v1/responses');
        curl_setopt_array($ch, [
            CURLOPT_POST           => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER     => [
                'Content-Type: application/json',
                'Authorization: Bearer ' . $apiKey,
            ],
            CURLOPT_POSTFIELDS     => $payload,
            CURLOPT_TIMEOUT        => 90,
        ]);
        $body   = curl_exec($ch);
        $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($status === 200) {
            $data = json_decode($body, true);
            $text = '';
            foreach ($data['output'] ?? [] as $item) {
                foreach ($item['content'] ?? [] as $part) {
                    if (($part['type'] ?? '') === 'output_text') {
                        $text .= $part['text'];
                    }
                }
            }
            return $text;
        }

        if ($status === 429 || $status >= 500) {
            sleep(5);
            continue;
        }
        break;
    }

    error_log("OpenAI API error: status={$status}");
    return '';
}

$inquiry = $_POST['message'] ?? '';
$inquiry = mb_substr(trim($inquiry), 0, 2000);

$instructions = <<<TXT
あなたはWeb制作会社のサポート担当です。
お客様の問い合わせに対する返信メールの下書きを日本語で作成してください。
料金や納期など、分からない事実は書かずに「担当者が確認します」と記載してください。
TXT;

$draft = askOpenAI($instructions, $inquiry);

echo $draft === ''
    ? '下書きを作成できませんでした。手動で対応してください。'
    : nl2br(htmlspecialchars($draft, ENT_QUOTES, 'UTF-8'));

このコードには、本番で効く工夫を4つ入れています。

  • instructions で役割と禁止事項を伝え、知らない事実を作文させない
  • 入力を2,000文字で切り、長文の貼り付けによる料金の膨らみを防ぐ
  • 混雑(429)とサーバー側のエラー(5xx)だけ、1回だけ再試行する
  • 画面に出すときは htmlspecialchars で無害化する

特に3つ目が大事です。再試行を無制限にすると、障害時にリクエストが雪だるま式に増えて請求が跳ねます。1回で諦めて、人の対応に戻すほうが安全です。

「分からない事実は書かない」という指示は、AIがそれっぽい嘘をつくこと(ハルシネーション)への対策です。完全には防げませんが、料金や納期をでっち上げる頻度はぐっと下がります。

AIが書いた文章をそのまま外に出すと、言い回しで気づかれることもあります。気になる方はチャットgptはバレる?文章・履歴・画像で見抜かれる原因と防ぎ方で、手直しのポイントを確認しておくと安心です。仕組みが動いたら、気になるのはお金の話です。


料金はいくらかかる?モデル選びと節約のコツ

APIの料金は「AIが扱う文字のかたまり」であるトークンの量で決まり、入力と出力で単価が違います。

トークンは、日本語だと1文字で1トークン前後になることが多く、英語より多めに数えられがちです。単価は100万トークンあたりで表示されます。

OpenAI公式の料金ページによると、2026年9月時点で確認できた主なモデルの単価は次の通りです。

モデル(API名)入力 / 100万トークン出力 / 100万トークン向いている用途
gpt-6-astra$10$50最上位。難しい判断や長い推論
chat-latest$5$30ChatGPTと同じ挙動を試したい時
gpt-5.6-luna(短いcontext)$0.20$1.20大量の分類・要約・下書き
gpt-6-luna / gpt-6.1-sol公式で確認公式で確認新しい軽量版と中位版

つまり、最上位と軽量版では単価に数十倍の差があります。問い合わせの下書き程度なら、軽量版で十分です。

ざっくり試算してみます。gpt-5.6-lunaで入力1,000トークン、出力500トークンの処理をした場合です。

  • 入力の料金:約$0.0002
  • 出力の料金:約$0.0006
  • 1回あたり:約$0.0008
  • 1,000回でも:約$0.8

破格と言っていい水準です。ただし最上位モデルに替えると、同じ処理で数十倍になります。

節約のコツは3つに絞れます。

  • 迷ったら軽量版で作り、品質が足りない処理だけ上位モデルに切り替える
  • 急がない一括処理は、半額になるBatchやFlexを使う
  • 管理画面で月の使用上限と通知を設定しておく

上限設定は必ずやってください。コードのループ処理を間違えたときの保険になります。料金が分かったところで、動かしたときのつまずきに備えます。


エラーが出たらどこを見る?よくある失敗と直し方

エラーの原因は、返ってきたHTTPステータスと error.message の文面でほぼ特定できます。

実装例1のコードは、失敗するとステータス番号とメッセージを表示します。その番号を下の表で引いてください。

ステータスよくある原因直し方
401APIキーが間違い・削除済み・読めていないgetenv() の結果を確認し、キーを再発行
400JSONの形が不正、モデル名の打ち間違いjson_encode の結果とモデル名を見直す
404モデル名が存在しない、URLの誤り公式のモデル一覧で正しい名前を確認
429使いすぎ、またはクレジット残高不足少し待つ。残高と上限設定を確認
500・503OpenAI側の一時的な障害時間を置いて1回だけ再試行

つまり、401と400は自分の設定ミス、429と5xxは待つか残高を見る、と覚えておけば迷いません。

PHP特有の落とし穴もあります。

  • 日本語が文字化けする:json_encode に JSON_UNESCAPED_UNICODE を付け、ファイルをUTF-8で保存する
  • SSL証明書のエラー:古いサーバーは証明書の束が古いことがある。CURLOPT_SSL_VERIFYPEER を切るのは危険なので、サーバー側の証明書を更新する
  • 30秒で処理が止まる:PHPの max_execution_time が原因。set_time_limit(120) などで延ばす
  • レンタルサーバーで外に出られない:外部への通信を制限しているプランがある。サーバー会社の仕様を確認

429は「使いすぎ」と「お金が足りない」の両方で出るのが厄介です。メッセージにquotaという単語があれば、残高不足を疑ってください。エラーを潰せたら、最後に本番公開前の確認です。


本番に載せる前に確認したい4つのポイント

本番で事故が起きやすいのは、キーの漏えい、乱用、個人情報の扱い、応答の遅さの4点です。

テスト環境で動いた時点では、まだ半分しか終わっていません。公開すると、想定外の使われ方をします。

確認項目起きがちな事故対策
キーの保管GitHubに公開して不正利用される環境変数に置き、キーは用途別に分ける
乱用対策フォームを連打されて請求が増える回数制限・CAPTCHA・入力文字数の上限
個人情報住所や電話番号をそのまま送る必要な項目だけ送る。利用規約に明記
応答速度画面が固まり離脱される非同期処理やキューで裏で動かす

つまり、コードの正しさより「外から触られたときの守り」のほうが手間がかかります。

特に乱用対策は後回しにされがちです。誰でも送れるフォームにAIを付けると、ボットに叩かれて一晩で料金が膨らむことがあります。IPごとの回数制限と、月の使用上限の二重で守るのが安心です。

APIのデータの扱いは、OpenAIの公式ドキュメント(https://platform.openai.com/docs)とデータ利用ポリシーで最新の条件を確認してください。社内規程で外部送信に決まりがあるなら、そちらが優先です。

チャットボットを一から作るのが重いと感じたら、既製品を使う道もあります。AIカスタマーサポートのカテゴリには、問い合わせ対応向けのツールがまとまっています。


AI PICKS編集部の判定

PHPでチャットGPTを使うなら、最初は素のcURLで1本動かすのが一択です。ライブラリから入ると、エラーが出たときにどこで詰まったのか分からなくなります。30行のコードで送信と受信の流れを一度体で覚えれば、その後Composerに移っても迷いません。

モデル選びは軽量版から始めるのが正解です。公開されている単価を突き合わせると、最上位と軽量版の差は数十倍。問い合わせの下書きや要約で最上位を使うのは、正直もったいないです。品質が足りない処理だけ上位に替える、という段階的な使い方が圧倒的にお得です。

逆に、AIの回答をそのままお客さんへ自動送信する作りは微妙です。分からない料金や納期を作文するリスクが残るので、人が確認する下書き止まりを強くおすすめします。キーを環境変数に置く、再試行は1回まで、使用上限を設定する。この3点を守れば、個人開発でも業務システムでも安心して組み込めます。


よくある質問(FAQ)

Q. ChatGPT Plusに入っていればAPIも無料で使えますか?

使えません。ChatGPTの月額プランとAPIは別契約です。APIは管理画面で支払い設定をして、使った分だけ請求されます。

Q. レンタルサーバーのPHPでも動きますか?

cURL拡張が有効で、外部への通信が許可されていれば動きます。Composerが使えない場合は、実装例1の素のcURLで書いてください。PHPの版が古いと動かないことがあるので、管理画面で8系に切り替えておくと安心です。

Q. WordPressに組み込むことはできますか?

できます。テーマの functions.php やプラグインから wp_remote_post() でAPIを呼ぶのが定番です。キーは wp-config.php に定数で置くか、環境変数から読み込みます。

Q. 回答を1文字ずつ表示する(ストリーミング)にはどうすればいいですか?

リクエストに stream を指定すると、回答が少しずつ届きます。PHPでは CURLOPT_WRITEFUNCTION で受け取りながら画面に流す形になります。サーバーの出力バッファ設定に左右されるので、まずは通常の一括取得で作るのがおすすめです。

Q. 会話の続きを覚えさせるには?

APIは基本的に1回ごとに独立しています。続きを話すには、過去のやり取りを毎回一緒に送るか、Responses APIの前回の応答IDを引き継ぐ仕組みを使います。過去の文章を送るほどトークンが増えるので、古い会話は要約して短くするのがコツです。

Q. APIキーが漏れたかもしれないときは?

すぐに管理画面でそのキーを削除し、新しいキーを発行してください。使用量の画面で身に覚えのない利用がないかも確認します。用途別にキーを分けておけば、止める範囲を最小限にできます。

Q. PHP以外の言語と比べて不利になりますか?

不利にはなりません。APIはHTTPでやり取りするだけなので、PHPでも他の言語と同じ機能が使えます。公式SDKの種類が少ない点はありますが、コミュニティ製のライブラリで十分補えます。


あわせて見たいツール・カテゴリ

PHP連携を作る前後で、比較の材料になるページをまとめました。

次に読むならこれ。APIの請求とチャット画面の定額プランを両方使うか迷っているなら、チャットGPTプラスとは?月額20ドルでできること7つと無料版の違いを読むと、どちらにお金をかけるべきかがはっきりします。


参考にした一次情報

記事の事実関係は、次の公式ページで確認しています。仕様や料金は変わることがあるため、最新の内容は各ページで確かめてください。