Contact
Line : comsiam
Contact
Line : comsiam

การใช้ 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 และแนวทางนำไปใช้กับเว็บไซต์จริง
เมื่อเชื่อม PHP กับ Gemini API แล้วสามารถสร้างระบบได้หลายประเภท เช่น
ตัวอย่าง
ลูกค้ากรอกคำถาม
↓
PHP Backend
↓
Gemini API
↓
คำตอบ
↓
หน้าเว็บไซต์
หรือ
ข้อมูลสินค้า
↓
PHP
↓
Gemini API
↓
คำอธิบายสินค้า
↓
Database
PHP จึงสามารถนำ Gemini ไปใช้กับเว็บไซต์เดิมได้โดยไม่จำเป็นต้องเปลี่ยน Backend เป็น Python หรือ JavaScript
Python มี SDK ทางการ เช่น
google-genai
JavaScript มี
@google/genai
แต่สำหรับ PHP เอกสาร Google ปัจจุบันระบุว่า PHP เป็นหนึ่งในภาษาที่ไม่ได้อยู่ในกลุ่ม SDK โดยตรง
แนวทางคือใช้
PHP
↓
REST API
↓
Gemini
ข้อดีคือ REST เป็นมาตรฐาน HTTP
จึงใช้ได้กับแทบทุก PHP Framework
เช่น
ไม่ต้องรอ SDK เฉพาะภาษา
REST API คือการให้ PHP ส่ง HTTP Request ไปยัง Gemini API
องค์ประกอบหลักคือ
URL ของ API
เช่น
POST
เช่น
Content-Type: application/json
และ Credential
ข้อมูล JSON ที่ประกอบด้วย
Gemini ส่งข้อมูลกลับมาเป็น JSON
แนวคิดคือ
PHP
↓
HTTP POST
↓
JSON
↓
Gemini
↓
JSON
↓
PHP
สำหรับตัวอย่างพื้นฐานควรมี
ควรใช้ PHP รุ่นที่ยังได้รับการรองรับและเหมาะกับ Environment ของเว็บไซต์
ใช้ส่ง HTTP Request
สำหรับ Encode/Decode JSON
ใช้เข้า Google AI Studio
ใช้ Authentication
สำหรับเรียก API
ไม่จำเป็นต้องมี
เพราะ Gemini ทำงานบนระบบของ Google
เปิด Terminal
php -v
ควรเห็นข้อมูลลักษณะ
PHP 8.x
จากนั้นตรวจ cURL
php -m
หา
curl
หากไม่มี cURL ต้องเปิด Extension ตาม Environment ของ Server ก่อน
เข้า Google AI Studio
จากนั้นเปิด
Dashboard
↓
API Keys
ผู้ใช้ใหม่อาจมี Project และ Key เริ่มต้นอยู่แล้ว
หากต้องการสร้างใหม่เลือก
Create API key
จากนั้นเลือก Project
เมื่อได้ Key แล้วอย่านำไปใส่ใน
เพราะ API Key เป็น Credential
แนะนำให้ใช้ชื่อ
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
ไม่ควรเขียน
$apiKey = 'REAL_GEMINI_API_KEY';
แล้ว Upload ไฟล์ขึ้น Server
เพราะไฟล์อาจถูก
Production ควรใช้
ตาม Infrastructure
สร้าง Folder
gemini-php/
และไฟล์
gemini-php/
└── index.php
ในขั้นแรกไม่จำเป็นต้องใช้ Composer หรือ Framework
เพราะจะทดลอง REST API โดยใช้ PHP cURL โดยตรง
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
สร้าง 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
$apiKey = getenv('GEMINI_API_KEY');
ดึง Secret จาก Environment
$url = 'https://generativelanguage.googleapis.com/v1beta/interactions';
$payload = [
'model' => 'gemini-3.7-flash',
'input' => '...',
];
$ch = curl_init($url);
CURLOPT_POST => true
CURLOPT_RETURNTRANSFER => true
'x-goog-api-key: ' . $apiKey
json_encode($payload)
ขั้นตอนทั้งหมดคือการสร้าง HTTP Request มาตรฐาน
REST API ไม่ได้ส่งกลับเพียง Text String
แต่ส่ง Interaction Resource ที่มีข้อมูล เช่น
ตัวอย่างโครงสร้างแบบย่อ
{
"id": "interaction_id",
"status": "completed",
"steps": [
{
"type": "model_output",
"content": [
{
"type": "text",
"text": "..."
}
]
}
]
}
ดังนั้น PHP ต้อง Decode JSON ก่อน
ใช้
$data = json_decode(
$response,
true
);
Parameter true ทำให้ JSON Object ถูกแปลงเป็น Associative Array
จากนั้นสามารถอ่าน
$data['status']
หรือ
$data['steps']
ได้
สามารถสร้าง 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 ทั้งก้อนให้ผู้ใช้
รวม 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 ไม่ได้
ไม่ควรเขียน 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 อยู่จุดเดียว
ไม่ควรเขียน
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
ใช้ Heredoc
$prompt = <<<PROMPT
อ่านข้อความด้านล่าง
ให้ทำดังนี้:
1. สรุปเป็นภาษาไทย
2. ไม่เกิน 5 ข้อ
3. ห้ามเพิ่มข้อมูลใหม่
ข้อความ:
Gemini API สามารถนำ AI
ไปใช้ในเว็บไซต์ได้
PROMPT;
แล้วส่ง
$payload = [
'model' => GEMINI_MODEL,
'input' => $prompt,
];
เหมาะกับ Prompt ที่มี Instruction หลายข้อ
ใช้
Role
+
Task
+
Input
+
Rules
+
Output
ตัวอย่าง
$prompt = <<<PROMPT
คุณเป็นระบบจัดหมวดหมู่คำถามลูกค้า
หมวดที่อนุญาต:
- billing
- technical
- account
- other
ตอบเฉพาะชื่อหมวดหมู่
ข้อความ:
ชำระเงินแล้วแต่ระบบยังแจ้งว่าค้างชำระ
PROMPT;
Output ที่จำกัดชัดเจนทำให้ PHP นำไปใช้ต่อได้ง่ายกว่า
สมมติมี
<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 โดยไม่จำเป็น
Public Form ไม่ควรรับข้อความไม่จำกัด
ตัวอย่าง
if (
mb_strlen($prompt) > 20000
) {
exit('ข้อความยาวเกินกำหนด');
}
20000 เป็นเพียงตัวอย่าง Product Limit
ไม่ใช่ Maximum Context ของ Gemini
ควรกำหนดตาม Use Case จริง
การจำกัด Input ช่วยควบคุม
Architecture ที่ผิด
HTML
↓
JavaScript
↓
Gemini API Key
↓
Gemini API
Architecture ที่ดีกว่า
Browser
↓
PHP Backend
↓
GEMINI_API_KEY
↓
Gemini API
User เห็นเฉพาะ Endpoint ของเว็บไซต์
Secret อยู่ฝั่ง Server
PHP สามารถตรวจ
ก่อนเรียก Gemini
ตัวอย่าง
User
↓
Authentication
↓
Validation
↓
Rate Limit
↓
Gemini API
นี่เป็นเหตุผลว่าทำไม Production Web App ควรมี Backend เป็น Gatekeeper
ถ้าต้องการให้ 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
หลังดึง 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
แม้ Schema ช่วยควบคุม Structure
Application ยังต้องตรวจ Business Logic
เช่น Gemini ตอบ
priority = high
ไม่ได้หมายความว่า PHP ควรอนุมัติ
Refund
Delete
Publish
Payment
ทันที
ต้องมี Permission และ Business Rule แยก
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 นี้
ใน Web Application สามารถเก็บใน
ตัวอย่างแนวคิด
User ID
↓
Conversation
↓
Last Interaction ID
ต้องระวังว่า Interaction ID ของ User A ไม่ถูกนำไปใช้กับ User B
เพราะอาจทำให้ Conversation Context ปะปนกัน
session_start();
$previousId =
$_SESSION['gemini_interaction_id']
?? null;
หลัง Request สำเร็จ
$_SESSION['gemini_interaction_id']
= $data['id'];
จากนั้น Request ถัดไปใช้ ID นี้
อย่างไรก็ตาม Production ต้องวาง Session และ Privacy Policy ตามระบบจริง
ได้ เพราะ Interactions REST API รองรับ Streaming ผ่าน Server-Sent Events
Endpoint จะใช้ Query
?alt=sse
และ Payload
{
"stream": true
}
แต่ Streaming ใน PHP Web Environment ต้องพิจารณา
ด้วย
จึงซับซ้อนกว่าการใช้ Request ปกติ
สำหรับมือใหม่ควรทำ Non-streaming ให้สำเร็จก่อน
เหมาะกับ
แทน
User
↓
รอ 10 วินาที
↓
เห็นคำตอบทั้งหมด
สามารถเป็น
User
↓
เห็นคำตอบส่วนแรก
↓
ข้อความเพิ่ม
↓
ข้อความเพิ่ม
ช่วยเรื่อง User Experience
รายละเอียด Streaming จะมีบทความเฉพาะในลำดับ 407
เพราะ PHP ใช้ REST จึงสามารถส่ง Tool Configuration ได้เช่นเดียวกัน
Payload ตัวอย่าง
$payload = [
'model' => 'gemini-3.7-flash',
'input' => 'สรุปข่าวเทคโนโลยีล่าสุด',
'tools' => [
[
'type' => 'google_search',
],
],
];
เหมาะกับข้อมูลที่ต้องอัปเดต
แต่ไม่ควรเปิด Search กับทุก Request โดยไม่มีเหตุผล
เพราะเพิ่ม
ได้ผ่าน REST API
Developer สามารถประกาศ Function Schema
เช่น
get_order_status
Gemini ส่ง Function Call กลับมา
PHP ตรวจ
จากนั้นจึงเรียก Database หรือ Service จริง
Flow
User
↓
Gemini
↓
Function Call
↓
PHP
↓
Database
↓
Function Result
↓
Gemini
↓
User
รายละเอียดจะมีบทความ 403 โดยเฉพาะ
เมื่อ Gemini เลือก Function ไม่ได้หมายความว่า Google Server เข้ามาเรียก PHP Function ภายในเว็บไซต์เอง
Application ต้อง
จึงเป็น Developer ที่ควบคุม Tool Execution
สมมติ Gemini ขอ
refund_order
PHP ต้องตรวจว่า
ก่อน Execute
ไม่ควรใช้เพียงคำตอบจาก AI เป็น Authorization
ได้ตาม File Input Method และ API ที่รองรับ
แต่ไม่ควรเริ่มด้วยการ Convert ทุกไฟล์เป็น Base64 โดยอัตโนมัติ
ต้องพิจารณา
สำหรับ File ใหญ่ควรใช้ File API หรือ Input Method ที่เหมาะสมตามเอกสารปัจจุบัน
ได้
Gemini รองรับ Multimodal Input ตาม Model
PHP สามารถ
สำหรับไฟล์ขนาดเล็กตาม 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 มักเหมาะกว่าในการควบคุม
สำหรับ API Integration จริง
Framework เช่น Laravel ยังมี HTTP Client ที่สะดวกกว่า Native cURL
Laravel สามารถใช้ HTTP Client
แนวคิดคือ
Controller
↓
GeminiService
↓
Laravel HTTP Client
↓
Gemini API
ไม่ควรใส่ API Call ยาวทั้งหมดใน Controller
ควรสร้าง Service เช่น
app/Services/GeminiService.php
เพื่อแยก Integration Logic
Local Development อาจใช้
.env
เช่น
GEMINI_API_KEY=...
แล้ว Map ผ่าน Config
Production ควรใช้ Environment/Secret System ของ Hosting
อย่า Commit .env ที่มี Secret จริง
ได้
WordPress พัฒนาด้วย PHP จึงสามารถเรียก Gemini API จาก
ได้
Architecture ที่ดีคือ
WordPress
↓
Server-side PHP
↓
Gemini API
ไม่ควรส่ง API Key ไป JavaScript ฝั่ง Browser
หากเว็บไซต์ต้องใช้ Gemini หลายส่วน ควรสร้าง
แยกเฉพาะ
แทนใส่ API Call ลง
functions.php
หลายสิบจุด
ช่วยให้
อย่างน้อย
ใครใช้ Feature ได้
ป้องกัน Request ที่ไม่ถูกต้องใน Admin Action
ตรวจข้อมูล
ป้องกัน Abuse
รวม Gemini Logic
แจ้ง Error อย่างเหมาะสม
ไม่เก็บ API Key
สำหรับระบบ comsiam หากนำ Gemini ไปใช้กับ WordPress จริง การแยกเป็น Plugin หรือ Service เฉพาะจะดูแลรักษาง่ายกว่าการแทรก Code AI ลงหลายไฟล์ของ Theme
ต้องตรวจทั้ง
เช่น Network
เช่น 400, 403, 404, 429
Response Parse ไม่ได้
Gemini ส่ง Error Detail
อย่าตรวจเพียง
if (!$response)
แล้วถือว่า Request อื่นสำเร็จทั้งหมด
$statusCode = curl_getinfo(
$ch,
CURLINFO_HTTP_CODE
);
แล้ว
if ($statusCode < 200
|| $statusCode >= 300) {
// handle API error
}
ช่วยแยก HTTP Error ออกจาก Successful Response
อาจเกี่ยวข้องกับ
ควรอ่านข้อความ Error ที่ API ส่งกลับ
อาจเกี่ยวข้องกับ
ไม่ควรสรุปทันทีว่า API Key เสีย
อาจเกี่ยวกับ
โดยเฉพาะ Code จาก Tutorial เก่า
มักเกี่ยวกับ Rate Limit หรือ Resource/Quota
ไม่ควรแก้ด้วยการสร้าง Key จำนวนมาก
ควรตรวจ
บทความ 398 จะอธิบาย Error 429 โดยละเอียด
Production ไม่ควรปล่อย Request รอไม่จำกัด
สามารถตั้ง
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 60,
ตัวเลขเป็นตัวอย่าง
ควรกำหนดตาม Application และ Model
การมี Timeout ช่วยให้ PHP Worker ไม่ถูกจับค้างนานเกินไป
ไม่ควรทำ
while true
→ call API
ควรจำกัด Attempt
แนวคิด
Attempt 1
↓
Wait
↓
Attempt 2
↓
Longer Wait
↓
Attempt 3
↓
Stop
และ Retry เฉพาะ Error ที่เหมาะสม
เช่น Error ชั่วคราวบางประเภท
ถ้า Request สำเร็จจริงแต่ Client ไม่ได้รับ Response แล้ว Retry ซ้ำ
อาจเกิด Processing ซ้ำ
ดังนั้นระบบที่ทำ Action สำคัญควรมี Idempotency Strategy ตาม Use Case
สำหรับ Text Generation ธรรมดาความเสี่ยงมักต่ำกว่า Transaction เช่น Payment
เมื่อ User กดปุ่ม
Generate
ควรป้องกัน Double Submit
เพราะ
Click 1
Click 2
Click 3
สามารถกลายเป็น Gemini API 3 Request
ส่งผลต่อ
Frontend และ Backend ควรมี Request Control
ข้อมูลที่มีประโยชน์ เช่น
timestamp
model
status_code
latency
error_code
request_id
แต่ห้าม Log
GEMINI_API_KEY
และควรระวังการ Log Prompt/Response ที่มีข้อมูลลูกค้า
PHP สามารถจับเวลา
$start = microtime(true);
// call Gemini
$elapsed =
microtime(true) - $start;
echo $elapsed;
ช่วยดูว่า Request ใช้เวลานานแค่ไหน
ถ้า Page ช้าอาจแยกได้ว่าเกิดจาก
Interactions API Response มี Usage Metadata
เช่นแนวคิด
total_tokens
total_input_tokens
total_output_tokens
ตาม Response
PHP สามารถเก็บข้อมูลเหล่านี้เพื่อคำนวณ
ใน Production
หาก Public App ใช้ Paid Gemini API
ไม่ควรให้ User หนึ่งคน Generate ไม่จำกัด
ตัวอย่าง
Free user
→ 10 requests/day
Paid user
→ 100 requests/day
ตัวเลขขึ้นกับ Business Model
ช่วยควบคุม
ควรมี Rate Limit ของ Application เอง
ไม่ควรรอให้ Gemini API ส่ง 429 ก่อน
เช่นควบคุมตาม
ตามระบบ
Gemini API Rate Limit กับ Application Rate Limit เป็นคนละชั้น
หาก PHP Endpoint ทำงานจาก Browser และสร้าง Cost หรือ Action
ควรป้องกัน CSRF ตาม Framework
โดยเฉพาะ
อย่าเปิด Endpoint ให้เว็บไซต์อื่นยิง Request แทน User ได้ง่าย
ถ้า Endpoint เป็น
/ask-gemini
และเปิด Public โดยไม่มี Login หรือ Limit
Bot สามารถเรียกได้จำนวนมาก
ก่อนเรียก Gemini ควรตรวจ
Authentication
↓
Authorization
↓
Rate Limit
↓
Gemini
ตาม Use Case
ไม่ควรถาม
ผู้ใช้นี้ควรเป็น Admin หรือไม่
แล้วเชื่อคำตอบ AI
Source of Truth ต้องมาจาก
Gemini ใช้ช่วยตีความ Content
ไม่ใช่ระบบ Security Authority
สำหรับ Native cURL Example ไม่จำเป็น
แต่ Project ใหญ่ควรใช้ Composer สำหรับ
ตาม Architecture
ตัวอย่าง HTTP Library ยอดนิยมมีหลายตัว แต่ไม่จำเป็นต้องเพิ่ม Dependency หาก Native cURL เพียงพอกับงานเล็ก
ข้อดี
ข้อเสีย
ข้อดี
เหมาะกับ Laravel/Symfony
เลือกตาม Project
เมื่อระบบโตอาจเป็น
app/
├── Services/
│ └── GeminiService.php
├── Controllers/
├── Models/
└── Config/
หรือสำหรับ Plugin
plugin/
├── includes/
│ └── class-gemini-service.php
├── admin/
└── plugin.php
หลักคือ Gemini API Logic ควรอยู่จุดเดียว
แยก Function ที่ไม่เรียก API ออกก่อน
เช่น
function buildPrompt(
string $message
): string {
return <<<PROMPT
จัดข้อความเป็น
billing, technical, account หรือ other
ข้อความ:
{$message}
PROMPT;
}
Function นี้ Unit Test ได้โดยไม่ใช้ Token
จากนั้น Integration Test เฉพาะ API Layer แยกต่างหาก
ถ้าทุก Test Run เรียก API จริง
จะเกิด
ควร Mock HTTP Response สำหรับ Unit Test
แล้วมี Integration Test จำนวนจำกัดที่เรียก API จริง
คำถามเหมือนกันไม่ได้รับประกันว่าข้อความ Output จะเหมือนเดิมทุกตัวอักษร
ดังนั้น Test ไม่ควรเขียนว่า
Response ต้องเท่ากับประโยคนี้ทุกตัวอักษร
หาก Task เป็น Generative Text
ควร Test
ตาม Use Case
ตัวอย่างปัจจุบันใช้
gemini-3.7-flash
เพราะอยู่ใน Getting Started รุ่นปัจจุบัน
แต่ Production ควรเลือกจาก
Model มี Lifecycle
จึงควรเก็บ Model เป็น Configuration และตรวจเอกสารก่อน Deploy
ไม่
ค่าใช้จ่ายไม่ได้ขึ้นกับว่า Application เขียนด้วย
แต่ขึ้นกับ
ถ้า Request เหมือนกัน Cost Logic มาจาก Gemini API Pricing ไม่ใช่ภาษา Backend
ถ้าต้องประมวลผล
100,000 records
ไม่ควรสร้างหน้า PHP แล้ว Loop เรียก API 100,000 ครั้งโดยตรง
ควรพิจารณา
ตาม Requirement
ช่วยลดปัญหา
งานเช่น
Upload 1,000 documents
↓
Analyze
ไม่ควรให้ User เปิด Browser รอจนเสร็จ
ควรเป็น
Upload
↓
Create Job
↓
Return Status
↓
Worker Processes
↓
User Checks Result
ทำให้ระบบเสถียรกว่า
Browser
↓
PHP Application
├── Authentication
├── Validation
├── Rate Limit
├── Database
└── Gemini Service
↓
Gemini API
นี่เป็น Structure ที่ปลอดภัยกว่าการเรียก Gemini โดยตรงจาก Browser
อยู่ฝั่ง Server
ไม่ Hard-code
เปิดใช้งาน
Website ใช้ Secure Connection
ตรวจแล้ว
มีเมื่อใช้ Structured Data
มีหาก Feature ไม่ควร Public
ควบคุม Usage
กำหนด
มีขอบเขต
รองรับ HTTP/API Error
ไม่ Log Secret
ติดตาม Usage
เข้าใจ Pricing
PHP สามารถเรียก Direct REST API ได้
Secret รั่วได้
ผู้ใช้ดึงออกได้
Error ถูกมองเป็น Response ปกติ
PHP ทำงานต่อด้วยข้อมูลผิด
API อาจเปลี่ยน
Migration ยาก
PHP Worker ค้าง
Cost และ Traffic เพิ่ม
เสี่ยง Abuse
และ cURL
ผ่าน Google AI Studio
ฝั่ง Server
เริ่มจาก Script เล็ก
Model + Input
ไป Interactions API
ก่อน Parse
เป็น PHP Array
จาก Response Steps
ไม่เขียนซ้ำ
cURL + HTTP + JSON
เมื่อ Program ต้อง Parse
เมื่อสร้าง Chat
เมื่อจำเป็น
ก่อน Public
ดู Usage
Laravel/WordPress ตาม Project
หลัง Security Review
การทำตามลำดับนี้ช่วยให้ comsiam หรือเว็บไซต์ PHP อื่นสามารถเริ่มจาก REST Request เล็ก ๆ ก่อน แล้วค่อยเพิ่ม Framework และระบบ Automation โดยไม่ต้องแก้ปัญหาหลาย Layer พร้อมกัน
ตอบเฉพาะคำว่า SUCCESS
สรุปข้อความนี้เป็นภาษาไทย 5 ข้อ
จัดข้อความเป็น billing, technical, account หรือ other
ดึงชื่อ ราคา และจำนวนเป็น JSON
เขียนคำอธิบายสินค้านี้ไม่เกิน 100 คำ
สร้าง FAQ 5 ข้อจากข้อความนี้
ตรวจ PHP Function นี้และหา Bug
แปลข้อความนี้เป็นภาษาไทย
ตอบ sentiment เป็น positive, neutral หรือ negative
ตอบคำถามนี้ไม่เกิน 3 ประโยค
ได้ PHP สามารถเรียก Gemini API โดยตรงผ่าน REST API ด้วย cURL หรือ HTTP Client ของ Framework
ตามเอกสาร Google ปัจจุบัน PHP เป็นภาษาที่ไม่ได้อยู่ในกลุ่ม SDK โดยตรง จึงสามารถใช้ Direct REST Integration ซึ่งเป็น Language-agnostic และรองรับ Gemini API Feature โดยตรง
ไม่จำเป็นสำหรับ Native cURL แต่ Project ใหญ่สามารถใช้ Composer และ HTTP Client ของ Framework เพื่อจัด Code ให้สะดวกขึ้น
สำหรับ REST Interactions API สามารถส่ง Key ผ่าน Header x-goog-api-key โดย Key ควรอ่านจาก Server Environment เช่น GEMINI_API_KEY
ได้ เพราะ Structured Output เป็นความสามารถของ API ไม่ได้จำกัดเฉพาะ SDK ภาษาใดภาษาเดียว PHP สามารถกำหนด Schema ใน JSON Request ผ่าน REST ได้
ได้ โดย 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 ซ้ำกระจายไปหลายไฟล์