วิธีใช้ Gemini API กับ PHP

การใช้ Gemini API กับ PHP เหมาะสำหรับเว็บไซต์และระบบที่พัฒนาด้วย PHP เช่น WordPress Plugin, Laravel, CodeIgniter, ระบบหลังบ้าน, CMS, REST API หรือ Web Application ที่ต้องการเพิ่มความสามารถ AI เข้าไปในระบบเดิม

ปัจจุบัน Google ยังไม่ได้มี Google Gen AI SDK ทางการสำหรับ PHP แบบเดียวกับ Python หรือ JavaScript ดังนั้นแนวทางตรงและเป็นมาตรฐานสำหรับ PHP คือ เรียก Gemini API ผ่าน REST API โดยใช้ cURL หรือ HTTP Client ของ Framework

ขั้นตอนพื้นฐานคือ สร้าง Gemini API Key → เก็บ Key เป็น Environment Variable → สร้าง JSON Request → ส่ง POST Request ด้วย PHP → อ่าน JSON Response → ดึงข้อความจาก Gemini

ตัวอย่าง Architecture คือ

PHP Application
↓
REST Request
↓
Gemini API
↓
Gemini Model
↓
JSON Response
↓
PHP Application

บทความนี้จะเริ่มตั้งแต่ API Call แรก ไปจนถึงการแยก Function, Error Handling, Structured Output, Conversation และแนวทางนำไปใช้กับเว็บไซต์จริง

❶ 🐘 Gemini API กับ PHP ใช้ทำอะไรได้บ้าง

เมื่อเชื่อม PHP กับ Gemini API แล้วสามารถสร้างระบบได้หลายประเภท เช่น

  • AI Chatbot
  • ระบบตอบคำถามลูกค้า
  • ระบบสรุปบทความ
  • ระบบสร้าง Description
  • ระบบสร้าง FAQ
  • ระบบวิเคราะห์ข้อความ
  • Sentiment Analysis
  • Classification
  • Data Extraction
  • AI Search
  • Document Analyzer
  • Coding Assistant
  • ระบบช่วยเขียน Content
  • WordPress Integration
  • Laravel AI Feature
  • Backend Automation

ตัวอย่าง

ลูกค้ากรอกคำถาม
↓
PHP Backend
↓
Gemini API
↓
คำตอบ
↓
หน้าเว็บไซต์

หรือ

ข้อมูลสินค้า
↓
PHP
↓
Gemini API
↓
คำอธิบายสินค้า
↓
Database

PHP จึงสามารถนำ Gemini ไปใช้กับเว็บไซต์เดิมได้โดยไม่จำเป็นต้องเปลี่ยน Backend เป็น Python หรือ JavaScript

❷ 🆚 PHP ใช้ Gemini API ต่างจาก Python และ JavaScript อย่างไร

Python มี SDK ทางการ เช่น

google-genai

JavaScript มี

@google/genai

แต่สำหรับ PHP เอกสาร Google ปัจจุบันระบุว่า PHP เป็นหนึ่งในภาษาที่ไม่ได้อยู่ในกลุ่ม SDK โดยตรง

แนวทางคือใช้

PHP
↓
REST API
↓
Gemini

ข้อดีคือ REST เป็นมาตรฐาน HTTP

จึงใช้ได้กับแทบทุก PHP Framework

เช่น

  • PHP Native
  • Laravel
  • Symfony
  • CodeIgniter
  • WordPress

ไม่ต้องรอ SDK เฉพาะภาษา

❸ 🌐 REST API คืออะไร

REST API คือการให้ PHP ส่ง HTTP Request ไปยัง Gemini API

องค์ประกอบหลักคือ

Endpoint

URL ของ API

Method

เช่น

POST

Headers

เช่น

Content-Type: application/json

และ Credential

Body

ข้อมูล JSON ที่ประกอบด้วย

  • Model
  • Input
  • Configuration

Response

Gemini ส่งข้อมูลกลับมาเป็น JSON

แนวคิดคือ

PHP
↓
HTTP POST
↓
JSON
↓
Gemini
↓
JSON
↓
PHP

❹ ✅ ต้องเตรียมอะไรก่อนเริ่ม

สำหรับตัวอย่างพื้นฐานควรมี

PHP

ควรใช้ PHP รุ่นที่ยังได้รับการรองรับและเหมาะกับ Environment ของเว็บไซต์

PHP cURL Extension

ใช้ส่ง HTTP Request

JSON Extension

สำหรับ Encode/Decode JSON

Google Account

ใช้เข้า Google AI Studio

Gemini API Key

ใช้ Authentication

Internet Connection

สำหรับเรียก API

ไม่จำเป็นต้องมี

  • Python
  • Node.js
  • GPU
  • AI Model ใน Server

เพราะ Gemini ทำงานบนระบบของ Google

❺ 🔍 ตรวจ PHP Version

เปิด Terminal

php -v

ควรเห็นข้อมูลลักษณะ

PHP 8.x

จากนั้นตรวจ cURL

php -m

หา

curl

หากไม่มี cURL ต้องเปิด Extension ตาม Environment ของ Server ก่อน

❻ 🔑 สร้าง Gemini API Key

เข้า Google AI Studio

จากนั้นเปิด

Dashboard
↓
API Keys

ผู้ใช้ใหม่อาจมี Project และ Key เริ่มต้นอยู่แล้ว

หากต้องการสร้างใหม่เลือก

Create API key

จากนั้นเลือก Project

เมื่อได้ Key แล้วอย่านำไปใส่ใน

  • Public GitHub
  • Blog
  • Screenshot
  • HTML
  • JavaScript Frontend
  • Public Repository

เพราะ API Key เป็น Credential

❼ 🔐 ตั้ง API Key เป็น Environment Variable

แนะนำให้ใช้ชื่อ

GEMINI_API_KEY

ตัวอย่างบน Linux/macOS

export GEMINI_API_KEY="YOUR_API_KEY"

แล้ว PHP อ่านค่าด้วย

$apiKey = getenv('GEMINI_API_KEY');

ข้อดีคือ Source Code ไม่ต้องมี Key จริง

Architecture

Server Environment
↓
GEMINI_API_KEY
↓
PHP
↓
Gemini API

❽ 🚫 อย่า Hard-code Key ใน PHP

ไม่ควรเขียน

$apiKey = 'REAL_GEMINI_API_KEY';

แล้ว Upload ไฟล์ขึ้น Server

เพราะไฟล์อาจถูก

  • Backup
  • Commit
  • Share
  • Download
  • เปิดเผยจาก Configuration ผิดพลาด

Production ควรใช้

  • Environment Variable
  • Hosting Secret
  • Secret Manager

ตาม Infrastructure

❾ 📁 สร้าง Project แรก

สร้าง Folder

gemini-php/

และไฟล์

gemini-php/
└── index.php

ในขั้นแรกไม่จำเป็นต้องใช้ Composer หรือ Framework

เพราะจะทดลอง REST API โดยใช้ PHP cURL โดยตรง

❿ 🚀 Endpoint สำหรับ Interactions API

Getting Started ปัจจุบันของ Google ใช้ Interactions API สำหรับ Application ใหม่

REST Endpoint พื้นฐานคือ

https://generativelanguage.googleapis.com/v1beta/interactions

Request จะเป็น

POST

พร้อม Header

x-goog-api-key

และ

Content-Type: application/json

PHP จึงสามารถเรียก API ได้โดยไม่ต้องมี SDK เฉพาะ PHP

⓫ 💻 Gemini API กับ PHP ตัวอย่างแรก

สร้าง index.php

<?php

$apiKey = getenv('GEMINI_API_KEY');

if (!$apiKey) {
    exit("GEMINI_API_KEY is not set.\n");
}

$url = 'https://generativelanguage.googleapis.com/v1beta/interactions';

$payload = [
    'model' => 'gemini-3.7-flash',
    'input' => 'อธิบาย Gemini API สำหรับมือใหม่เป็นภาษาไทย 5 ข้อ',
];

$ch = curl_init($url);

curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'x-goog-api-key: ' . $apiKey,
    ],
    CURLOPT_POSTFIELDS => json_encode(
        $payload,
        JSON_UNESCAPED_UNICODE
    ),
]);

$response = curl_exec($ch);

if ($response === false) {
    $error = curl_error($ch);
    curl_close($ch);

    exit("cURL error: {$error}\n");
}

$statusCode = curl_getinfo(
    $ch,
    CURLINFO_HTTP_CODE
);

curl_close($ch);

echo "HTTP Status: {$statusCode}\n";
echo $response;

จากนั้น Run

php index.php

หากทุกอย่างถูกต้องจะได้รับ JSON Response จาก Gemini API

⓬ 🔍 อธิบาย Code ทีละส่วน

อ่าน API Key

$apiKey = getenv('GEMINI_API_KEY');

ดึง Secret จาก Environment

กำหนด Endpoint

$url = 'https://generativelanguage.googleapis.com/v1beta/interactions';

สร้าง Request Body

$payload = [
    'model' => 'gemini-3.7-flash',
    'input' => '...',
];

เปิด cURL

$ch = curl_init($url);

ส่ง POST

CURLOPT_POST => true

รับ Response เป็น String

CURLOPT_RETURNTRANSFER => true

ส่ง API Key

'x-goog-api-key: ' . $apiKey

แปลง PHP Array เป็น JSON

json_encode($payload)

ขั้นตอนทั้งหมดคือการสร้าง HTTP Request มาตรฐาน

⓭ 📦 Response จาก Interactions API เป็นอย่างไร

REST API ไม่ได้ส่งกลับเพียง Text String

แต่ส่ง Interaction Resource ที่มีข้อมูล เช่น

  • ID
  • Status
  • Model
  • Usage
  • Steps
  • Output

ตัวอย่างโครงสร้างแบบย่อ

{
  "id": "interaction_id",
  "status": "completed",
  "steps": [
    {
      "type": "model_output",
      "content": [
        {
          "type": "text",
          "text": "..."
        }
      ]
    }
  ]
}

ดังนั้น PHP ต้อง Decode JSON ก่อน

⓮ 🔄 แปลง JSON เป็น PHP Array

ใช้

$data = json_decode(
    $response,
    true
);

Parameter true ทำให้ JSON Object ถูกแปลงเป็น Associative Array

จากนั้นสามารถอ่าน

$data['status']

หรือ

$data['steps']

ได้

⓯ 📝 วิธีดึงข้อความจาก Gemini Response

สามารถสร้าง Function

function extractOutputText(array $data): string
{
    $texts = [];

    foreach ($data['steps'] ?? [] as $step) {
        if (($step['type'] ?? '') !== 'model_output') {
            continue;
        }

        foreach ($step['content'] ?? [] as $content) {
            if (
                ($content['type'] ?? '') === 'text'
                && isset($content['text'])
            ) {
                $texts[] = $content['text'];
            }
        }
    }

    return implode('', $texts);
}

แล้วใช้

$data = json_decode(
    $response,
    true
);

$text = extractOutputText($data);

echo $text;

ทำให้ Application ไม่ต้องแสดง JSON ทั้งก้อนให้ผู้ใช้

⓰ ✅ ตัวอย่าง PHP ที่พร้อมอ่าน Output

รวม Code

<?php

function extractOutputText(array $data): string
{
    $texts = [];

    foreach ($data['steps'] ?? [] as $step) {
        if (($step['type'] ?? '') !== 'model_output') {
            continue;
        }

        foreach ($step['content'] ?? [] as $content) {
            if (
                ($content['type'] ?? '') === 'text'
                && isset($content['text'])
            ) {
                $texts[] = $content['text'];
            }
        }
    }

    return implode('', $texts);
}

$apiKey = getenv('GEMINI_API_KEY');

if (!$apiKey) {
    exit("GEMINI_API_KEY is not set.\n");
}

$url = 'https://generativelanguage.googleapis.com/v1beta/interactions';

$payload = [
    'model' => 'gemini-3.7-flash',
    'input' => 'อธิบาย REST API แบบง่าย ๆ 5 ข้อ',
];

$ch = curl_init($url);

curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'x-goog-api-key: ' . $apiKey,
    ],
    CURLOPT_POSTFIELDS => json_encode(
        $payload,
        JSON_UNESCAPED_UNICODE
    ),
]);

$response = curl_exec($ch);

if ($response === false) {
    $error = curl_error($ch);
    curl_close($ch);

    exit("cURL error: {$error}\n");
}

$statusCode = curl_getinfo(
    $ch,
    CURLINFO_HTTP_CODE
);

curl_close($ch);

$data = json_decode(
    $response,
    true
);

if ($statusCode < 200 || $statusCode >= 300) {
    echo "API Error ({$statusCode})\n";
    echo $response;
    exit;
}

echo extractOutputText($data);

นี่เป็นพื้นฐานที่ดีสำหรับนำไปสร้าง Service Function ต่อ

⓱ 🌏 ทำไมใช้ JSON_UNESCAPED_UNICODE

ถ้า Prompt มีภาษาไทย

json_encode(
    $payload,
    JSON_UNESCAPED_UNICODE
)

ช่วยให้ JSON ที่สร้างอ่านภาษาไทยได้ตรง ๆ

แทนการ Encode เป็น Unicode Escape จำนวนมาก

Gemini API รองรับ UTF-8 ดังนั้น PHP Application ภาษาไทยสามารถส่งข้อความไทยได้ตามปกติ

⓲ ⚠️ ต้องตรวจ json_encode() Error ไหม

ควร โดยเฉพาะ Application จริง

สามารถใช้

$json = json_encode(
    $payload,
    JSON_UNESCAPED_UNICODE
    | JSON_THROW_ON_ERROR
);

จากนั้นจัดการ JsonException

ช่วยป้องกันกรณี Payload มีข้อมูลที่ Encode ไม่ได้

⓳ 🧱 สร้าง Function สำหรับเรียก Gemini

ไม่ควรเขียน cURL ซ้ำทุกหน้า

สร้าง Function

function askGemini(string $prompt): string
{
    $apiKey = getenv('GEMINI_API_KEY');

    if (!$apiKey) {
        throw new RuntimeException(
            'GEMINI_API_KEY is not set.'
        );
    }

    $url = 'https://generativelanguage.googleapis.com/v1beta/interactions';

    $payload = [
        'model' => 'gemini-3.7-flash',
        'input' => $prompt,
    ];

    // ส่ง Request...
}

จากนั้นหน้าอื่นเรียก

$answer = askGemini(
    'สรุปข้อความนี้เป็น 5 ข้อ'
);

ทำให้ Gemini Integration อยู่จุดเดียว

⓴ 🧩 แยก Model เป็น Configuration

ไม่ควรเขียน

gemini-3.7-flash

ซ้ำหลายสิบไฟล์

สามารถใช้

const GEMINI_MODEL = 'gemini-3.7-flash';

หรือ Environment

GEMINI_MODEL

แล้วอ่าน

$model = getenv('GEMINI_MODEL')
    ?: 'gemini-3.7-flash';

เมื่อ Model เปลี่ยนจะจัดการง่ายกว่า

Model ID มี Lifecycle จึงควรตรวจเอกสาร Google ปัจจุบันก่อนใช้ Production

🧠 Prompt หลายบรรทัดใน PHP

ใช้ Heredoc

$prompt = <<<PROMPT
อ่านข้อความด้านล่าง

ให้ทำดังนี้:
1. สรุปเป็นภาษาไทย
2. ไม่เกิน 5 ข้อ
3. ห้ามเพิ่มข้อมูลใหม่

ข้อความ:
Gemini API สามารถนำ AI
ไปใช้ในเว็บไซต์ได้
PROMPT;

แล้วส่ง

$payload = [
    'model' => GEMINI_MODEL,
    'input' => $prompt,
];

เหมาะกับ Prompt ที่มี Instruction หลายข้อ

🎯 สูตร Prompt สำหรับ PHP Application

ใช้

Role
+
Task
+
Input
+
Rules
+
Output

ตัวอย่าง

$prompt = <<<PROMPT
คุณเป็นระบบจัดหมวดหมู่คำถามลูกค้า

หมวดที่อนุญาต:
- billing
- technical
- account
- other

ตอบเฉพาะชื่อหมวดหมู่

ข้อความ:
ชำระเงินแล้วแต่ระบบยังแจ้งว่าค้างชำระ
PROMPT;

Output ที่จำกัดชัดเจนทำให้ PHP นำไปใช้ต่อได้ง่ายกว่า

📥 รับข้อความจาก Form

สมมติมี

<form method="post">
    <textarea name="prompt"></textarea>
    <button type="submit">
        Ask Gemini
    </button>
</form>

PHP รับ

$prompt = trim(
    $_POST['prompt'] ?? ''
);

ก่อนส่ง Gemini ควร Validate

if ($prompt === '') {
    exit('กรุณากรอกข้อความ');
}

อย่าส่ง Empty Request โดยไม่จำเป็น

📏 จำกัดความยาว Input

Public Form ไม่ควรรับข้อความไม่จำกัด

ตัวอย่าง

if (
    mb_strlen($prompt) > 20000
) {
    exit('ข้อความยาวเกินกำหนด');
}

20000 เป็นเพียงตัวอย่าง Product Limit

ไม่ใช่ Maximum Context ของ Gemini

ควรกำหนดตาม Use Case จริง

การจำกัด Input ช่วยควบคุม

  • Cost
  • Latency
  • Abuse

🔐 อย่าส่ง API Key ไป Browser

Architecture ที่ผิด

HTML
↓
JavaScript
↓
Gemini API Key
↓
Gemini API

Architecture ที่ดีกว่า

Browser
↓
PHP Backend
↓
GEMINI_API_KEY
↓
Gemini API

User เห็นเฉพาะ Endpoint ของเว็บไซต์

Secret อยู่ฝั่ง Server

🛡️ PHP Backend ช่วยควบคุมอะไร

PHP สามารถตรวจ

  • Login
  • Permission
  • Rate Limit
  • Input
  • CSRF
  • Request Size
  • User Quota

ก่อนเรียก Gemini

ตัวอย่าง

User
↓
Authentication
↓
Validation
↓
Rate Limit
↓
Gemini API

นี่เป็นเหตุผลว่าทำไม Production Web App ควรมี Backend เป็น Gatekeeper

📦 Structured Output กับ PHP

ถ้าต้องการให้ Program ได้ JSON ไม่ควรพึ่ง Prompt เพียงอย่างเดียว

Interactions API รองรับ response_format

ตัวอย่าง Schema

$schema = [
    'type' => 'object',
    'properties' => [
        'category' => [
            'type' => 'string',
            'enum' => [
                'billing',
                'technical',
                'account',
                'other',
            ],
        ],
        'priority' => [
            'type' => 'string',
            'enum' => [
                'low',
                'medium',
                'high',
            ],
        ],
    ],
    'required' => [
        'category',
        'priority',
    ],
];

แล้ว Payload

$payload = [
    'model' => 'gemini-3.7-flash',
    'input' => 'อินเทอร์เน็ตใช้งานไม่ได้ตั้งแต่เช้า',
    'response_format' => [
        'type' => 'text',
        'mime_type' => 'application/json',
        'schema' => $schema,
    ],
];

เมื่อดึง output_text แล้วจะได้ JSON String ตาม Schema

🔄 Parse Structured Output

หลังดึง Text

$output = extractOutputText($data);

Parse

$result = json_decode(
    $output,
    true,
    512,
    JSON_THROW_ON_ERROR
);

จากนั้น

echo $result['category'];
echo $result['priority'];

เหมาะกับระบบ Automation มากกว่า Free-form Text

⚠️ Structured Output ยังต้อง Validate

แม้ Schema ช่วยควบคุม Structure

Application ยังต้องตรวจ Business Logic

เช่น Gemini ตอบ

priority = high

ไม่ได้หมายความว่า PHP ควรอนุมัติ

Refund
Delete
Publish
Payment

ทันที

ต้องมี Permission และ Business Rule แยก

💬 Conversation ด้วย PHP

Interactions API รองรับ Stateful Conversation ผ่าน

previous_interaction_id

Request แรกได้

interaction.id

จากนั้น Request ถัดไปส่ง

$payload = [
    'model' => 'gemini-3.7-flash',
    'previous_interaction_id' => $previousId,
    'input' => 'คำถามต่อไป',
];

Gemini สามารถใช้ Context ของ Interaction ก่อนหน้าใน Workflow นี้

🗄️ เก็บ Interaction ID ที่ไหน

ใน Web Application สามารถเก็บใน

  • PHP Session
  • Database
  • Cache

ตัวอย่างแนวคิด

User ID
↓
Conversation
↓
Last Interaction ID

ต้องระวังว่า Interaction ID ของ User A ไม่ถูกนำไปใช้กับ User B

เพราะอาจทำให้ Conversation Context ปะปนกัน

📋 PHP Session ตัวอย่างแนวคิด

session_start();

$previousId =
    $_SESSION['gemini_interaction_id']
    ?? null;

หลัง Request สำเร็จ

$_SESSION['gemini_interaction_id']
    = $data['id'];

จากนั้น Request ถัดไปใช้ ID นี้

อย่างไรก็ตาม Production ต้องวาง Session และ Privacy Policy ตามระบบจริง

🌊 Streaming ใช้กับ PHP ได้ไหม

ได้ เพราะ Interactions REST API รองรับ Streaming ผ่าน Server-Sent Events

Endpoint จะใช้ Query

?alt=sse

และ Payload

{
  "stream": true
}

แต่ Streaming ใน PHP Web Environment ต้องพิจารณา

  • Output Buffering
  • Web Server
  • Reverse Proxy
  • CDN
  • PHP-FPM
  • Timeout

ด้วย

จึงซับซ้อนกว่าการใช้ Request ปกติ

สำหรับมือใหม่ควรทำ Non-streaming ให้สำเร็จก่อน

⚡ Streaming เหมาะกับอะไร

เหมาะกับ

  • AI Chat
  • คำตอบยาว
  • Real-time UI

แทน

User
↓
รอ 10 วินาที
↓
เห็นคำตอบทั้งหมด

สามารถเป็น

User
↓
เห็นคำตอบส่วนแรก
↓
ข้อความเพิ่ม
↓
ข้อความเพิ่ม

ช่วยเรื่อง User Experience

รายละเอียด Streaming จะมีบทความเฉพาะในลำดับ 407

🔎 ใช้ Google Search กับ PHP

เพราะ PHP ใช้ REST จึงสามารถส่ง Tool Configuration ได้เช่นเดียวกัน

Payload ตัวอย่าง

$payload = [
    'model' => 'gemini-3.7-flash',
    'input' => 'สรุปข่าวเทคโนโลยีล่าสุด',
    'tools' => [
        [
            'type' => 'google_search',
        ],
    ],
];

เหมาะกับข้อมูลที่ต้องอัปเดต

แต่ไม่ควรเปิด Search กับทุก Request โดยไม่มีเหตุผล

เพราะเพิ่ม

  • Latency
  • Usage
  • Cost/Quota ตาม Pricing

🛠️ Function Calling กับ PHP ทำได้ไหม

ได้ผ่าน REST API

Developer สามารถประกาศ Function Schema

เช่น

get_order_status

Gemini ส่ง Function Call กลับมา

PHP ตรวจ

  • Function Name
  • Parameters
  • User Permission

จากนั้นจึงเรียก Database หรือ Service จริง

Flow

User
↓
Gemini
↓
Function Call
↓
PHP
↓
Database
↓
Function Result
↓
Gemini
↓
User

รายละเอียดจะมีบทความ 403 โดยเฉพาะ

⚠️ Gemini ไม่ได้ Execute PHP Function ของเราโดยตรง

เมื่อ Gemini เลือก Function ไม่ได้หมายความว่า Google Server เข้ามาเรียก PHP Function ภายในเว็บไซต์เอง

Application ต้อง

  1. อ่าน Function Call
  2. Validate
  3. Execute Function
  4. ส่ง Result กลับ Gemini

จึงเป็น Developer ที่ควบคุม Tool Execution

🔐 Function Calling ต้องมี Permission

สมมติ Gemini ขอ

refund_order

PHP ต้องตรวจว่า

  • User Login หรือไม่
  • Order เป็นของ User หรือไม่
  • Refund ได้หรือไม่
  • Amount ถูกต้องหรือไม่

ก่อน Execute

ไม่ควรใช้เพียงคำตอบจาก AI เป็น Authorization

📄 ส่ง PDF หรือไฟล์ด้วย PHP ได้ไหม

ได้ตาม File Input Method และ API ที่รองรับ

แต่ไม่ควรเริ่มด้วยการ Convert ทุกไฟล์เป็น Base64 โดยอัตโนมัติ

ต้องพิจารณา

  • File Size
  • MIME Type
  • API Method
  • Reuse
  • Context Limit

สำหรับ File ใหญ่ควรใช้ File API หรือ Input Method ที่เหมาะสมตามเอกสารปัจจุบัน

🖼️ รูปภาพใช้ได้ไหม

ได้

Gemini รองรับ Multimodal Input ตาม Model

PHP สามารถ

  • อ่าน File
  • Base64 Encode
  • สร้าง JSON Payload
  • ส่งผ่าน REST

สำหรับไฟล์ขนาดเล็กตาม API ที่รองรับ

เช่น

$image = file_get_contents(
    'sample.jpg'
);

$base64 = base64_encode(
    $image
);

จากนั้นสร้าง Input ตาม Format ปัจจุบันของ API

🌐 ใช้ file_get_contents() แทน cURL ได้ไหม

สามารถเรียก HTTP ผ่าน Stream Context ได้ใน Environment ที่เปิด allow_url_fopen

แต่ cURL มักเหมาะกว่าในการควบคุม

  • Header
  • Timeout
  • HTTP Status
  • Connection
  • Error

สำหรับ API Integration จริง

Framework เช่น Laravel ยังมี HTTP Client ที่สะดวกกว่า Native cURL

🔥 ใช้ Gemini API กับ Laravel

Laravel สามารถใช้ HTTP Client

แนวคิดคือ

Controller
↓
GeminiService
↓
Laravel HTTP Client
↓
Gemini API

ไม่ควรใส่ API Call ยาวทั้งหมดใน Controller

ควรสร้าง Service เช่น

app/Services/GeminiService.php

เพื่อแยก Integration Logic

🔐 Laravel เก็บ API Key ที่ไหน

Local Development อาจใช้

.env

เช่น

GEMINI_API_KEY=...

แล้ว Map ผ่าน Config

Production ควรใช้ Environment/Secret System ของ Hosting

อย่า Commit .env ที่มี Secret จริง

📝 ใช้กับ WordPress ได้ไหม

ได้

WordPress พัฒนาด้วย PHP จึงสามารถเรียก Gemini API จาก

  • Plugin
  • Custom Function
  • Admin Tool
  • Scheduled Task

ได้

Architecture ที่ดีคือ

WordPress
↓
Server-side PHP
↓
Gemini API

ไม่ควรส่ง API Key ไป JavaScript ฝั่ง Browser

⚠️ ไม่ควรใส่ Gemini API Call ลง Theme แบบกระจัดกระจาย

หากเว็บไซต์ต้องใช้ Gemini หลายส่วน ควรสร้าง

  • Plugin
  • Service Class
  • Helper

แยกเฉพาะ

แทนใส่ API Call ลง

functions.php

หลายสิบจุด

ช่วยให้

  • Rotate Key ง่าย
  • เปลี่ยน Model ง่าย
  • Error Handling สม่ำเสมอ
  • Monitor Usage ง่าย

🧩 WordPress Plugin สำหรับ AI ควรมีอะไร

อย่างน้อย

Permission Check

ใครใช้ Feature ได้

Nonce

ป้องกัน Request ที่ไม่ถูกต้องใน Admin Action

Input Validation

ตรวจข้อมูล

Rate Limit

ป้องกัน Abuse

API Service

รวม Gemini Logic

Error Handling

แจ้ง Error อย่างเหมาะสม

Logging

ไม่เก็บ API Key

สำหรับระบบ comsiam หากนำ Gemini ไปใช้กับ WordPress จริง การแยกเป็น Plugin หรือ Service เฉพาะจะดูแลรักษาง่ายกว่าการแทรก Code AI ลงหลายไฟล์ของ Theme

🚨 Error Handling ด้วย PHP

ต้องตรวจทั้ง

cURL Error

เช่น Network

HTTP Error

เช่น 400, 403, 404, 429

JSON Error

Response Parse ไม่ได้

API Error

Gemini ส่ง Error Detail

อย่าตรวจเพียง

if (!$response)

แล้วถือว่า Request อื่นสำเร็จทั้งหมด

❌ วิธีตรวจ HTTP Status

$statusCode = curl_getinfo(
    $ch,
    CURLINFO_HTTP_CODE
);

แล้ว

if ($statusCode < 200
    || $statusCode >= 300) {

    // handle API error
}

ช่วยแยก HTTP Error ออกจาก Successful Response

🧱 Error 400

อาจเกี่ยวข้องกับ

  • JSON Structure
  • Parameter
  • Model
  • Schema
  • Tool Configuration

ควรอ่านข้อความ Error ที่ API ส่งกลับ

⛔ Error 403

อาจเกี่ยวข้องกับ

  • Credential
  • Permission
  • Project
  • Feature Access

ไม่ควรสรุปทันทีว่า API Key เสีย

🔍 Error 404

อาจเกี่ยวกับ

  • Model ID
  • Endpoint
  • API Version
  • Resource

โดยเฉพาะ Code จาก Tutorial เก่า

🚨 Error 429

มักเกี่ยวกับ Rate Limit หรือ Resource/Quota

ไม่ควรแก้ด้วยการสร้าง Key จำนวนมาก

ควรตรวจ

  • Model
  • Project
  • Tier
  • Request Rate
  • Token Rate

บทความ 398 จะอธิบาย Error 429 โดยละเอียด

⏱️ ตั้ง Timeout ให้ cURL

Production ไม่ควรปล่อย Request รอไม่จำกัด

สามารถตั้ง

CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 60,

ตัวเลขเป็นตัวอย่าง

ควรกำหนดตาม Application และ Model

การมี Timeout ช่วยให้ PHP Worker ไม่ถูกจับค้างนานเกินไป

🔁 Retry อย่างไร

ไม่ควรทำ

while true
→ call API

ควรจำกัด Attempt

แนวคิด

Attempt 1
↓
Wait
↓
Attempt 2
↓
Longer Wait
↓
Attempt 3
↓
Stop

และ Retry เฉพาะ Error ที่เหมาะสม

เช่น Error ชั่วคราวบางประเภท

💰 Retry เพิ่ม Cost ได้

ถ้า Request สำเร็จจริงแต่ Client ไม่ได้รับ Response แล้ว Retry ซ้ำ

อาจเกิด Processing ซ้ำ

ดังนั้นระบบที่ทำ Action สำคัญควรมี Idempotency Strategy ตาม Use Case

สำหรับ Text Generation ธรรมดาความเสี่ยงมักต่ำกว่า Transaction เช่น Payment

🔄 อย่าส่ง Request ซ้ำจากปุ่ม Submit

เมื่อ User กดปุ่ม

Generate

ควรป้องกัน Double Submit

เพราะ

Click 1
Click 2
Click 3

สามารถกลายเป็น Gemini API 3 Request

ส่งผลต่อ

  • Cost
  • Rate Limit
  • Duplicate Output

Frontend และ Backend ควรมี Request Control

📊 Logging ควรเก็บอะไร

ข้อมูลที่มีประโยชน์ เช่น

timestamp
model
status_code
latency
error_code
request_id

แต่ห้าม Log

GEMINI_API_KEY

และควรระวังการ Log Prompt/Response ที่มีข้อมูลลูกค้า

⏱️ วัด Latency

PHP สามารถจับเวลา

$start = microtime(true);

// call Gemini

$elapsed =
    microtime(true) - $start;

echo $elapsed;

ช่วยดูว่า Request ใช้เวลานานแค่ไหน

ถ้า Page ช้าอาจแยกได้ว่าเกิดจาก

  • Gemini
  • Database
  • PHP
  • Network

📊 อ่าน Usage จาก Response

Interactions API Response มี Usage Metadata

เช่นแนวคิด

total_tokens
total_input_tokens
total_output_tokens

ตาม Response

PHP สามารถเก็บข้อมูลเหล่านี้เพื่อคำนวณ

  • Usage/User
  • Cost
  • Average Tokens
  • Feature Cost

ใน Production

💸 ควรมี User Quota

หาก Public App ใช้ Paid Gemini API

ไม่ควรให้ User หนึ่งคน Generate ไม่จำกัด

ตัวอย่าง

Free user
→ 10 requests/day

Paid user
→ 100 requests/day

ตัวเลขขึ้นกับ Business Model

ช่วยควบคุม

  • Abuse
  • Rate Limit
  • Cost

🛡️ Rate Limit ฝั่ง PHP

ควรมี Rate Limit ของ Application เอง

ไม่ควรรอให้ Gemini API ส่ง 429 ก่อน

เช่นควบคุมตาม

  • User ID
  • IP
  • Account
  • Subscription

ตามระบบ

Gemini API Rate Limit กับ Application Rate Limit เป็นคนละชั้น

🔒 CSRF สำคัญกับ Web Form

หาก PHP Endpoint ทำงานจาก Browser และสร้าง Cost หรือ Action

ควรป้องกัน CSRF ตาม Framework

โดยเฉพาะ

  • WordPress Admin
  • Laravel Form
  • Custom Dashboard

อย่าเปิด Endpoint ให้เว็บไซต์อื่นยิง Request แทน User ได้ง่าย

🔐 Authentication สำคัญ

ถ้า Endpoint เป็น

/ask-gemini

และเปิด Public โดยไม่มี Login หรือ Limit

Bot สามารถเรียกได้จำนวนมาก

ก่อนเรียก Gemini ควรตรวจ

Authentication
↓
Authorization
↓
Rate Limit
↓
Gemini

ตาม Use Case

⚠️ อย่าใช้ Gemini เป็นระบบ Authorization

ไม่ควรถาม

ผู้ใช้นี้ควรเป็น Admin หรือไม่

แล้วเชื่อคำตอบ AI

Source of Truth ต้องมาจาก

  • Database
  • Session
  • IAM
  • Permission System

Gemini ใช้ช่วยตีความ Content

ไม่ใช่ระบบ Security Authority

📦 ใช้ Composer จำเป็นไหม

สำหรับ Native cURL Example ไม่จำเป็น

แต่ Project ใหญ่ควรใช้ Composer สำหรับ

  • Autoload
  • HTTP Client
  • Framework
  • Testing

ตาม Architecture

ตัวอย่าง HTTP Library ยอดนิยมมีหลายตัว แต่ไม่จำเป็นต้องเพิ่ม Dependency หาก Native cURL เพียงพอกับงานเล็ก

⚖️ Native cURL กับ HTTP Client

Native cURL

ข้อดี

  • ไม่ต้องติดตั้ง Package
  • ใช้ได้ทั่วไป
  • Control HTTP ได้ละเอียด

ข้อเสีย

  • Code ยาว
  • Error Handling ต้องเขียนเอง

Framework HTTP Client

ข้อดี

  • Code อ่านง่าย
  • Retry/Timeout สะดวก
  • Test ง่ายกว่า

เหมาะกับ Laravel/Symfony

เลือกตาม Project

📁 โครงสร้าง Project PHP ที่ดีขึ้น

เมื่อระบบโตอาจเป็น

app/
├── Services/
│   └── GeminiService.php
├── Controllers/
├── Models/
└── Config/

หรือสำหรับ Plugin

plugin/
├── includes/
│   └── class-gemini-service.php
├── admin/
└── plugin.php

หลักคือ Gemini API Logic ควรอยู่จุดเดียว

🧪 Test Gemini Service อย่างไร

แยก Function ที่ไม่เรียก API ออกก่อน

เช่น

function buildPrompt(
    string $message
): string {
    return <<<PROMPT
จัดข้อความเป็น
billing, technical, account หรือ other

ข้อความ:
{$message}
PROMPT;
}

Function นี้ Unit Test ได้โดยไม่ใช้ Token

จากนั้น Integration Test เฉพาะ API Layer แยกต่างหาก

🧱 อย่าเรียก Gemini ใน Unit Test ทุกครั้ง

ถ้าทุก Test Run เรียก API จริง

จะเกิด

  • ช้า
  • Cost
  • Rate Limit
  • Output เปลี่ยนได้

ควร Mock HTTP Response สำหรับ Unit Test

แล้วมี Integration Test จำนวนจำกัดที่เรียก API จริง

📌 Gemini เป็น Generative Model

คำถามเหมือนกันไม่ได้รับประกันว่าข้อความ Output จะเหมือนเดิมทุกตัวอักษร

ดังนั้น Test ไม่ควรเขียนว่า

Response ต้องเท่ากับประโยคนี้ทุกตัวอักษร

หาก Task เป็น Generative Text

ควร Test

  • Schema
  • Required Fields
  • Allowed Values
  • Business Rule

ตาม Use Case

🧠 เลือก Model อย่างไร

ตัวอย่างปัจจุบันใช้

gemini-3.7-flash

เพราะอยู่ใน Getting Started รุ่นปัจจุบัน

แต่ Production ควรเลือกจาก

  • Quality
  • Cost
  • Speed
  • Context
  • Tool Support
  • Stability

Model มี Lifecycle

จึงควรเก็บ Model เป็น Configuration และตรวจเอกสารก่อน Deploy

💳 Gemini API กับ PHP เสียเงินต่างจาก Python ไหม

ไม่

ค่าใช้จ่ายไม่ได้ขึ้นกับว่า Application เขียนด้วย

  • PHP
  • Python
  • JavaScript

แต่ขึ้นกับ

  • Model
  • Input
  • Output
  • Feature
  • Tier
  • Usage

ถ้า Request เหมือนกัน Cost Logic มาจาก Gemini API Pricing ไม่ใช่ภาษา Backend

📦 งานจำนวนมากควรทำอย่างไร

ถ้าต้องประมวลผล

100,000 records

ไม่ควรสร้างหน้า PHP แล้ว Loop เรียก API 100,000 ครั้งโดยตรง

ควรพิจารณา

  • Queue
  • Worker
  • Batch API
  • Background Job

ตาม Requirement

ช่วยลดปัญหา

  • PHP Timeout
  • Browser Timeout
  • Rate Limit

⏳ Background Processing

งานเช่น

Upload 1,000 documents
↓
Analyze

ไม่ควรให้ User เปิด Browser รอจนเสร็จ

ควรเป็น

Upload
↓
Create Job
↓
Return Status
↓
Worker Processes
↓
User Checks Result

ทำให้ระบบเสถียรกว่า

🌐 Production Architecture ตัวอย่าง

Browser
↓
PHP Application
├── Authentication
├── Validation
├── Rate Limit
├── Database
└── Gemini Service
        ↓
    Gemini API

นี่เป็น Structure ที่ปลอดภัยกว่าการเรียก Gemini โดยตรงจาก Browser

✅ Checklist ก่อน Deploy

API Key

อยู่ฝั่ง Server

Environment

ไม่ Hard-code

cURL

เปิดใช้งาน

HTTPS

Website ใช้ Secure Connection

Input Validation

ตรวจแล้ว

Output Validation

มีเมื่อใช้ Structured Data

Authentication

มีหาก Feature ไม่ควร Public

Rate Limit

ควบคุม Usage

Timeout

กำหนด

Retry

มีขอบเขต

Error Handling

รองรับ HTTP/API Error

Logging

ไม่ Log Secret

Monitoring

ติดตาม Usage

Cost

เข้าใจ Pricing

🚫 10 ข้อผิดพลาดเมื่อใช้ Gemini API กับ PHP

❶ รอหา Official PHP SDK ทั้งที่ใช้ REST ได้

PHP สามารถเรียก Direct REST API ได้

❷ Hard-code API Key

Secret รั่วได้

❸ ส่ง Key ไป Browser

ผู้ใช้ดึงออกได้

❹ ไม่ตรวจ HTTP Status

Error ถูกมองเป็น Response ปกติ

❺ ไม่ตรวจ JSON Error

PHP ทำงานต่อด้วยข้อมูลผิด

❻ Copy Endpoint เก่า

API อาจเปลี่ยน

❼ Hard-code Model หลายไฟล์

Migration ยาก

❽ ไม่มี Timeout

PHP Worker ค้าง

❾ Retry ไม่จำกัด

Cost และ Traffic เพิ่ม

❿ เปิด Public Endpoint ไม่มี Rate Limit

เสี่ยง Abuse

🪜 Workflow Gemini API + PHP ที่แนะนำ

❶ ตรวจ PHP

และ cURL

❷ สร้าง API Key

ผ่าน Google AI Studio

❸ ตั้ง GEMINI_API_KEY

ฝั่ง Server

❹ สร้าง PHP File

เริ่มจาก Script เล็ก

❺ สร้าง JSON Payload

Model + Input

❻ ส่ง POST ผ่าน cURL

ไป Interactions API

❼ ตรวจ HTTP Status

ก่อน Parse

❽ Decode JSON

เป็น PHP Array

❾ ดึง Model Output

จาก Response Steps

❿ แยก Gemini Service

ไม่เขียนซ้ำ

⓫ เพิ่ม Error Handling

cURL + HTTP + JSON

⓬ เพิ่ม Structured Output

เมื่อ Program ต้อง Parse

⓭ เพิ่ม Conversation

เมื่อสร้าง Chat

⓮ เพิ่ม Tools

เมื่อจำเป็น

⓯ เพิ่ม Rate Limit

ก่อน Public

⓰ เพิ่ม Monitoring

ดู Usage

⓱ เชื่อม Framework

Laravel/WordPress ตาม Project

⓲ Deploy

หลัง Security Review

การทำตามลำดับนี้ช่วยให้ comsiam หรือเว็บไซต์ PHP อื่นสามารถเริ่มจาก REST Request เล็ก ๆ ก่อน แล้วค่อยเพิ่ม Framework และระบบ Automation โดยไม่ต้องแก้ปัญหาหลาย Layer พร้อมกัน

💡 10 Prompt สำหรับทดสอบ Gemini API กับ PHP

❶ API Test

ตอบเฉพาะคำว่า SUCCESS

❷ Summary

สรุปข้อความนี้เป็นภาษาไทย 5 ข้อ

❸ Classification

จัดข้อความเป็น billing, technical, account หรือ other

❹ JSON

ดึงชื่อ ราคา และจำนวนเป็น JSON

❺ Product Description

เขียนคำอธิบายสินค้านี้ไม่เกิน 100 คำ

❻ FAQ

สร้าง FAQ 5 ข้อจากข้อความนี้

❼ PHP Coding

ตรวจ PHP Function นี้และหา Bug

❽ Translation

แปลข้อความนี้เป็นภาษาไทย

❾ Sentiment

ตอบ sentiment เป็น positive, neutral หรือ negative

❿ จำกัด Output

ตอบคำถามนี้ไม่เกิน 3 ประโยค

❓ คำถามที่พบบ่อย

Gemini API ใช้กับ PHP ได้ไหม

ได้ PHP สามารถเรียก Gemini API โดยตรงผ่าน REST API ด้วย cURL หรือ HTTP Client ของ Framework

Google มี Gemini SDK สำหรับ PHP ไหม

ตามเอกสาร Google ปัจจุบัน PHP เป็นภาษาที่ไม่ได้อยู่ในกลุ่ม SDK โดยตรง จึงสามารถใช้ Direct REST Integration ซึ่งเป็น Language-agnostic และรองรับ Gemini API Feature โดยตรง

Gemini API กับ PHP ต้องใช้ Composer ไหม

ไม่จำเป็นสำหรับ Native cURL แต่ Project ใหญ่สามารถใช้ Composer และ HTTP Client ของ Framework เพื่อจัด Code ให้สะดวกขึ้น

PHP ต้องส่ง API Key อย่างไร

สำหรับ REST Interactions API สามารถส่ง Key ผ่าน Header x-goog-api-key โดย Key ควรอ่านจาก Server Environment เช่น GEMINI_API_KEY

PHP ใช้ Structured Output ได้ไหม

ได้ เพราะ Structured Output เป็นความสามารถของ API ไม่ได้จำกัดเฉพาะ SDK ภาษาใดภาษาเดียว PHP สามารถกำหนด Schema ใน JSON Request ผ่าน REST ได้

PHP สร้าง AI Chatbot ด้วย Gemini ได้ไหม

ได้ โดย PHP Backend รับข้อความจาก User ส่งไป Gemini API และสามารถใช้ previous_interaction_id สำหรับ Stateful Conversation ตาม Interactions API Workflow

🎯 สรุป

วิธีใช้ Gemini API กับ PHP ในปัจจุบันไม่จำเป็นต้องรอ SDK เฉพาะ PHP เพราะ Google รองรับการเชื่อมต่อแบบ Direct REST API ซึ่งใช้ได้กับภาษาใดก็ตามที่สามารถส่ง HTTP Request ได้

สำหรับ Application ใหม่สามารถเรียก Interactions API ผ่าน Endpoint REST โดยส่ง GEMINI_API_KEY ใน Header x-goog-api-key พร้อม JSON ที่ระบุ Model และ Input จากนั้น PHP ใช้ json_decode() อ่าน Interaction Resource และดึง Text จาก model_output

วิธีที่เหมาะสำหรับมือใหม่คือเริ่มจาก Native cURL ให้ Request แบบ Text สำเร็จก่อน จากนั้นค่อยแยก Code เป็น Gemini Service และเพิ่ม Structured Output, Conversation, Search, Function Calling หรือ File Input ตาม Requirement

สำหรับ Production ต้องเก็บ API Key ฝั่ง Server ห้ามส่ง Secret ไป Browser พร้อมเพิ่ม Input Validation, Authentication, Rate Limit, Timeout, Retry, Error Handling และ Usage Monitoring

PHP, Laravel และ WordPress สามารถใช้ Gemini API ได้โดยไม่จำเป็นต้องเปลี่ยน Technology Stack เพียงเพราะไม่มี SDK เฉพาะภาษา เพราะ Direct REST Integration ให้ PHP เข้าถึง Gemini API ได้โดยตรง

แนวทางของ comsiam คือเริ่มจาก PHP Service กลางเพียงจุดเดียวสำหรับติดต่อ Gemini แล้วให้ส่วนอื่นของเว็บไซต์เรียกผ่าน Service นี้ ช่วยให้จัดการ API Key, Model, Error และ Cost ได้ง่ายกว่าการเขียน cURL ซ้ำกระจายไปหลายไฟล์