
We will learn how to connect our PHP project to Google Gemini using two practical scripts:
(1) Generate Content with our chosen model and prompt.
(2) List Models to discover the latest available Gemini models. Both scripts use cURL and a simple settings.php file to keep your API key separate.
settings.php with $GOOGLE_API_KEY defined.
Use this script to send a prompt to Gemini and print the response as HTML (safe for direct display). Update the $MODEL and $text as needed.
<?php
require 'settings.php'; // must define: $GOOGLE_API_KEY
$MODEL = 'gemini-2.5-flash'; // <- update model
$text = " Write a short poem about the stars."; // Update your text
$url = "https://generativelanguage.googleapis.com/v1beta/models/$MODEL:generateContent";
$payload = [
"contents" => [[
"parts" => [["text" => $text]]
]]
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
"x-goog-api-key: $GOOGLE_API_KEY",
],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$res = curl_exec($ch);
if (curl_errno($ch)) {
die('cURL error: ' . curl_error($ch));
}
curl_close($ch);
$data = json_decode($res, true);
if (isset($data['candidates'][0]['content']['parts'][0]['text'])) {
echo nl2br(htmlspecialchars($data['candidates'][0]['content']['parts'][0]['text']));
} else {
// Show full response for debugging
echo '<pre>'.print_r($data, true).'</pre>';
}
?>
gemini-2.5-flash is fast and good for short-form content. Switch to another model if needed.htmlspecialchars() to prevent injection.
This helper lists all models from the ListModels endpoint. It handles pagination and prints a compact HTML table with name, display name/description, and supported generation methods.
<?php
// list-models.php
require 'settings.php'; // must define: $GOOGLE_API_KEY
/**
* Fetch all models from Gemini ListModels endpoint (handles pagination).
* @return array Decoded list of models (each item is an associative array)
*/
function fetchAllModels($apiKey) {
$baseUrl = "https://generativelanguage.googleapis.com/v1beta/models";
$models = [];
$pageTok = null;
do {
$url = $baseUrl . ($pageTok ? ("?pageToken=" . urlencode($pageTok)) : "");
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"x-goog-api-key: $apiKey",
"Accept: application/json"
],
CURLOPT_TIMEOUT => 20,
]);
$res = curl_exec($ch);
if (curl_errno($ch)) {
throw new RuntimeException('cURL error: ' . curl_error($ch));
}
curl_close($ch);
$data = json_decode($res, true);
if (isset($data['error'])) {
throw new RuntimeException("API error: " . ($data['error']['message'] ?? 'unknown'));
}
foreach (($data['models'] ?? []) as $m) {
$models[] = $m;
}
$pageTok = $data['nextPageToken'] ?? null;
} while ($pageTok);
return $models;
}
try {
if (empty($GOOGLE_API_KEY)) {
throw new RuntimeException("Missing GOOGLE_API_KEY in settings.php");
}
$models = fetchAllModels($GOOGLE_API_KEY);
// Simple HTML table output (safe to embed in your admin/tools page)
echo "<h3>Available Gemini Models</h3>";
echo "<table border='1' cellpadding='6' cellspacing='0'>";
echo "<tr><th>Name</th><th>Description</th><th>Generation Methods</th></tr>";
foreach ($models as $m) {
$name = htmlspecialchars($m['name'] ?? '');
$desc = htmlspecialchars($m['displayName'] ?? ($m['description'] ?? ''));
$meth = htmlspecialchars(implode(', ', $m['supportedGenerationMethods'] ?? []));
echo "<tr><td><code>{$name}</code></td><td>{$desc}</td><td>{$meth}</td></tr>";
}
echo "</table>";
// Optional: quick JSON dump for debugging
// echo "<pre>" . htmlspecialchars(json_encode($models, JSON_PRETTY_PRINT)) . "</pre>";
} catch (Throwable $e) {
http_response_code(500);
echo "<pre>Error: " . htmlspecialchars($e->getMessage()) . "</pre>";
}
?>
Keep your API key outside version control (use environment variables or server configs). A simple starter:
<?php
// settings.php
$GOOGLE_API_KEY = getenv('GOOGLE_API_KEY') ?: 'YOUR_API_KEY_HERE';
?>
CURLOPT_TIMEOUT for long responses.error details from the API.| Name | Description | Generation Methods |
|---|---|---|
models/embedding-gecko-001 | Embedding Gecko | embedText, countTextTokens |
models/gemini-2.5-pro-preview-03-25 | Gemini 2.5 Pro Preview 03-25 | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.5-flash-preview-05-20 | Gemini 2.5 Flash Preview 05-20 | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.5-flash | Gemini 2.5 Flash | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.5-flash-lite-preview-06-17 | Gemini 2.5 Flash-Lite Preview 06-17 | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.5-pro-preview-05-06 | Gemini 2.5 Pro Preview 05-06 | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.5-pro-preview-06-05 | Gemini 2.5 Pro Preview | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.5-pro | Gemini 2.5 Pro | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.0-flash-exp | Gemini 2.0 Flash Experimental | generateContent, countTokens, bidiGenerateContent |
models/gemini-2.0-flash | Gemini 2.0 Flash | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.0-flash-001 | Gemini 2.0 Flash 001 | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.0-flash-exp-image-generation | Gemini 2.0 Flash (Image Generation) Experimental | generateContent, countTokens, bidiGenerateContent |
models/gemini-2.0-flash-lite-001 | Gemini 2.0 Flash-Lite 001 | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.0-flash-lite | Gemini 2.0 Flash-Lite | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.0-flash-preview-image-generation | Gemini 2.0 Flash Preview Image Generation | generateContent, countTokens, batchGenerateContent |
models/gemini-2.0-flash-lite-preview-02-05 | Gemini 2.0 Flash-Lite Preview 02-05 | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.0-flash-lite-preview | Gemini 2.0 Flash-Lite Preview | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.0-pro-exp | Gemini 2.0 Pro Experimental | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.0-pro-exp-02-05 | Gemini 2.0 Pro Experimental 02-05 | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-exp-1206 | Gemini Experimental 1206 | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.0-flash-thinking-exp-01-21 | Gemini 2.5 Flash Preview 05-20 | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.0-flash-thinking-exp | Gemini 2.5 Flash Preview 05-20 | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.0-flash-thinking-exp-1219 | Gemini 2.5 Flash Preview 05-20 | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.5-flash-preview-tts | Gemini 2.5 Flash Preview TTS | countTokens, generateContent |
models/gemini-2.5-pro-preview-tts | Gemini 2.5 Pro Preview TTS | countTokens, generateContent |
models/learnlm-2.0-flash-experimental | LearnLM 2.0 Flash Experimental | generateContent, countTokens |
models/gemma-3-1b-it | Gemma 3 1B | generateContent, countTokens |
models/gemma-3-4b-it | Gemma 3 4B | generateContent, countTokens |
models/gemma-3-12b-it | Gemma 3 12B | generateContent, countTokens |
models/gemma-3-27b-it | Gemma 3 27B | generateContent, countTokens |
models/gemma-3n-e4b-it | Gemma 3n E4B | generateContent, countTokens |
models/gemma-3n-e2b-it | Gemma 3n E2B | generateContent, countTokens |
models/gemini-flash-latest | Gemini Flash Latest | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-flash-lite-latest | Gemini Flash-Lite Latest | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-pro-latest | Gemini Pro Latest | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.5-flash-lite | Gemini 2.5 Flash-Lite | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.5-flash-image-preview | Nano Banana | generateContent, countTokens |
models/gemini-2.5-flash-image | Nano Banana | generateContent, countTokens |
models/gemini-2.5-flash-preview-09-2025 | Gemini 2.5 Flash Preview Sep 2025 | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-2.5-flash-lite-preview-09-2025 | Gemini 2.5 Flash-Lite Preview Sep 2025 | generateContent, countTokens, createCachedContent, batchGenerateContent |
models/gemini-robotics-er-1.5-preview | Gemini Robotics-ER 1.5 Preview | generateContent, countTokens |
models/gemini-2.5-computer-use-preview-10-2025 | Gemini 2.5 Computer Use Preview 10-2025 | generateContent, countTokens |
models/embedding-001 | Embedding 001 | embedContent |
models/text-embedding-004 | Text Embedding 004 | embedContent |
models/gemini-embedding-exp-03-07 | Gemini Embedding Experimental 03-07 | embedContent, countTextTokens, countTokens |
models/gemini-embedding-exp | Gemini Embedding Experimental | embedContent, countTextTokens, countTokens |
models/gemini-embedding-001 | Gemini Embedding 001 | embedContent, countTextTokens, countTokens, asyncBatchEmbedContent |
models/aqa | Model that performs Attributed Question Answering. | generateAnswer |
models/imagen-3.0-generate-002 | Imagen 3.0 | predict |
models/imagen-4.0-generate-preview-06-06 | Imagen 4 (Preview) | predict |
models/imagen-4.0-ultra-generate-preview-06-06 | Imagen 4 Ultra (Preview) | predict |
models/imagen-4.0-generate-001 | Imagen 4 | predict |
models/imagen-4.0-ultra-generate-001 | Imagen 4 Ultra | predict |
models/imagen-4.0-fast-generate-001 | Imagen 4 Fast | predict |
models/veo-2.0-generate-001 | Veo 2 | predictLongRunning |
models/veo-3.0-generate-preview | Veo 3 | predictLongRunning |
models/veo-3.0-fast-generate-preview | Veo 3 fast | predictLongRunning |
models/veo-3.0-generate-001 | Veo 3 | predictLongRunning |
models/veo-3.0-fast-generate-001 | Veo 3 fast | predictLongRunning |
models/veo-3.1-generate-preview | Veo 3.1 | predictLongRunning |
models/veo-3.1-fast-generate-preview | Veo 3.1 fast | predictLongRunning |
models/gemini-2.0-flash-live-001 | Gemini 2.0 Flash 001 | bidiGenerateContent, countTokens |
models/gemini-live-2.5-flash-preview | Gemini Live 2.5 Flash Preview | bidiGenerateContent, countTokens |
models/gemini-2.5-flash-live-preview | Gemini 2.5 Flash Live Preview | bidiGenerateContent, countTokens |
models/gemini-2.5-flash-native-audio-latest | Gemini 2.5 Flash Native Audio Latest | countTokens, bidiGenerateContent |
models/gemini-2.5-flash-native-audio-preview-09-2025 | Gemini 2.5 Flash Native Audio Preview 09-2025 | countTokens, bidiGenerateContent |
Author
🎥 Join me live on YouTubePassionate about coding and teaching, I publish practical tutorials on PHP, Python, JavaScript, SQL, and web development. My goal is to make learning simple, engaging, and project‑oriented with real examples and source code.