
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 & Instructor at plus2net
I write and maintain practical tutorials on Python, PHP, SQL, JavaScript, HTML, jQuery, and web development at plus2net. The tutorials focus on clear explanations, working examples, and code that readers can test and adapt while learning.