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

PHPからチャットGPTを使うとは、ブラウザの画面を通さずに、自分のPHPプログラムからOpenAIのAIへ質問を送って回答を受け取ることです。
その窓口になるのがAPIです。APIとは、他のソフトからAIを呼び出す窓口のこと。普段のチャット画面でやっている「質問して答えをもらう」動きを、プログラムが代わりにやってくれます。
できることは幅広いです。
- 問い合わせフォームの返信の下書きを自動で作る
- 商品説明やブログの要約をまとめて生成する
- WordPressやLaravelのサイトにチャット欄を付ける
- 社内のCSVやログを読ませて、分類やタグ付けをする
ここで混同しやすいのが、ChatGPTのアプリとAPIの関係。中身のAIは同じ系統ですが、契約も料金も別物です。チャット画面を開くための公式URLやログイン方法は、チャットgpt公式サイトのURLと3ステップのログイン手順にまとめています。偽サイトでキーを入力してしまう事故を防ぐためにも、一度目を通しておくと安心です。
ChatGPT自体の機能や評判を先に押さえたい方は、ChatGPTのツール詳細ページも参考になります。全体像がつかめたら、手を動かす前の準備物を確認していきます。

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


初月10ドルオフ(新規ユーザー)
ChatGPTやClaudeへの長い指示を、打たずに声で入力できる。日本語にも対応し、Mac・Windowsのどのアプリでも使える(無料は1,000語まで)
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 |
|---|---|---|
| 払い方 | 月額の定額制 | 使った分だけの従量課金 |
| 使う場所 | チャット画面 | 自分のプログラムの中 |
| 向いている人 | 自分で質問して使う人 | サイトや業務に組み込みたい人 |
| 管理画面 | ChatGPTの設定画面 | OpenAIのAPI管理画面 |
整理すると、自分で使うなら定額のChatGPT、プログラムに組み込むならAPI、という分担です。
Plusで何ができるのか気になる方は、チャットGPTプラスとは?月額20ドルでできること7つと無料版の違いが判断の助けになります。準備物が分かったところで、APIキーを実際に発行します。
APIキーを取得する4ステップ
APIキーはOpenAIのAPI管理画面(https://platform.openai.com/api-keys)から数クリックで発行できます。
手順は次の4つです。
- OpenAIのAPI管理画面にログインする(ChatGPTと同じアカウントで可)
- 支払い設定(Billing)でカードを登録し、必要ならクレジットを購入する
- 「API keys」から「Create new secret key」を押し、名前を付けて発行する
- 表示されたキーをすぐにパスワード管理ツールなどへ控える
キーの全文が表示されるのは発行した瞬間だけ。 閉じてしまうと二度と見られません。控え忘れたら、そのキーは削除して新しく作り直すのが早いです。
名前は用途が分かるものにしておくと、あとで地味に効きます。「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のニュースとアップデートを先頭に、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とライブラリ、どちらを選ぶべきか。
| 比べる | 素の | openai-php/client |
|---|---|---|
| 導入の手間 | ゼロ | 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月時点で確認できた主なモデルの単価は次の通りです。
| モデル | 入力 | 出力 | 向いている |
|---|---|---|---|
| gpt-6-astra | $10 | $50 | 最上位。難しい判断や長い推論 |
| chat-latest | $5 | $30 | ChatGPTと同じ挙動を試したい時 |
| 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のコードは、失敗するとステータス番号とメッセージを表示します。その番号を下の表で引いてください。
| ステータス | よく | 直し方 |
|---|---|---|
| 401 | APIキーが間違い・削除済み・読めていない | getenv() の結果を確認し、キーを再発行 |
| 400 | JSONの形が不正、モデル名の打ち間違い | json_encode の結果とモデル名を見直す |
| 404 | モデル名が存在しない、URLの誤り | 公式のモデル一覧で正しい名前を確認 |
| 429 | 使いすぎ、またはクレジット残高不足 | 少し待つ。残高と上限設定を確認 |
| 500・503 | OpenAI側の一時的な障害 | 時間を置いて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連携を作る前後で、比較の材料になるページをまとめました。
- コードを書く作業そのものをAIに手伝わせたいなら、AIコーディングツールのカテゴリで選択肢を眺めると、補完やレビューの道具が見つかります
- 人気の開発支援ツールを横並びで確認したいなら、AIコーディングのランキングが早いです
- ChatGPT以外のチャットAIもAPIで比べたいなら、AIチャットボットのカテゴリとAIチャットボットのランキングが参考になります
- コードを書かずに業務へAIを組み込みたいなら、AI自動化のカテゴリやAIノーコードのカテゴリが近道です
- 複数の作業を自動でこなすAIを作りたいなら、AIエージェントのカテゴリに発展形がまとまっています
次に読むならこれ。APIの請求とチャット画面の定額プランを両方使うか迷っているなら、チャットGPTプラスとは?月額20ドルでできること7つと無料版の違いを読むと、どちらにお金をかけるべきかがはっきりします。
参考にした一次情報
記事の事実関係は、次の公式ページで確認しています。仕様や料金は変わることがあるため、最新の内容は各ページで確かめてください。
- OpenAI API「料金」(公式):gpt-6-astraの標準料金は100万トークンあたり入力$10、出力$50(2026年11月確認)
- OpenAI API「GPT-6.1 Solモデル」(公式):BatchとFlexの料金は標準料金より50%安くなります(2026年11月確認)
- ChatGPT Learn「料金」(公式):APIのトークン料金はサブスクリプションの利用枠とは別に扱われます(2026年11月確認)
- OpenAI API「Flex処理」(公式):curlの例でリクエスト先が https://api.openai.com/v1/responses と示されています(2026年11月確認)

