php 7.4 不原生支持 async/await,真异步需升级至 php 8.1+ 配合 swoole 或 roadrunner;当前可用方案为 curl_multi_exec 并行请求或 exec 后台进程分离,兼顾兼容性与非阻塞需求。

PHP 7.4 本身不原生支持 async/await,但可以通过 cURL 的非阻塞方式 或 独立进程(如 exec + &) 实现“伪异步”请求 Gemini API。真正意义的协程异步需升级到 PHP 8.1+ + Swoole 或 RoadRunner,但你用的是 PHP 7.4,所以重点是「不阻塞主线程」的实用方案。
✅ 方案一:cURL 多句柄并行(推荐,纯 PHP,无扩展依赖)
利用 curl_multi_* 系列函数同时发起多个请求,主线程可继续执行其他逻辑(比如处理页面渲染、查数据库),等所有 AI 请求结果就绪再统一处理。
- 适合:需并发调用 Gemini(如批量分析多段文本)、且不想引入外部进程或队列
- 关键点:设置
CURLOPT_RETURNTRANSFER=1、CURLOPT_TIMEOUT=30,避免单个超时拖垮整体 - 示例片段:
// 初始化 multi handle
$mh = curl_multi_init();
$chs = [];
// 为每个 Gemini 请求准备一个 cURL 句柄
foreach ($prompts as $i => $prompt) {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=YOUR_API_KEY',
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => json_encode([
'contents' => [['parts' => [['text' => $prompt]]]]
]),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 25,
]);
curl_multi_add_handle($mh, $ch);
$chs[$i] = $ch;
}
// 并行执行
$running = null;
do {
curl_multi_exec($mh, $running);
// 这里可以穿插其他轻量任务(如日志记录、状态检查)
usleep(10000); // 10ms 小休眠,避免空转耗 CPU
} while ($running > 0);
// 获取结果
$results = [];
foreach ($chs as $i => $ch) {
$results[$i] = json_decode(curl_multi_getcontent($ch), true);
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
✅ 方案二:后台进程分离(简单可靠,适合长响应)
用 exec() 或 proc_open() 启动一个独立 PHP 脚本去调用 Gemini,主流程立即返回,结果通过文件、数据库或 Redis 回写。
- 适合:单次请求耗时较长(>10s)、或需用户“提交即走”,后续轮询/通知结果
- 注意:确保 Web 服务器允许
exec(部分共享主机禁用),并加超时和错误重试 - 示例(触发后台任务):
// 主流程中
$jobId = uniqid('gemini_');
file_put_contents("/tmp/gemini_job_{$jobId}.json", json_encode(['prompt' => $prompt]));
// 启动后台脚本(不等待)
exec("php /path/to/gemini_worker.php {$jobId} > /dev/null 2>&1 &");
// 返回 jobId 给前端,用于后续轮询
echo json_encode(['job_id' => $jobId]);
对应 gemini_worker.php 中完成实际 API 调用,并把结果写入 /tmp/gemini_result_{$jobId}.json 或更新数据库状态。
⚠️ 注意事项(PHP 7.4 + Gemini 实际踩坑点)
-
API 地址与模型名:Gemini v1beta 接口地址是
v1beta/models/gemini-pro:generateContent,不是v1;免费版仅支持gemini-pro,不支持gemini-ultra -
认证方式:PHP 7.4 不建议用 Google Auth Library(依赖较新 Guzzle/Psr),直接拼
?key=YOUR_API_KEY最简可靠 -
JSON 编码安全:确保
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),避免 Gemini 拒绝含转义字符的输入 -
错误处理必须做:Gemini 返回 4xx/5xx 时,
curl_multi_getcontent()仍可能返回 false,需结合curl_getinfo($ch, CURLINFO_HTTP_CODE)判断
? 补充:如果真想“更异步”,可考虑轻量消息队列
不升级 PHP 版本的前提下,用 Redis List + `php artisan queue:work`(Laravel)或自研简易消费者,把 Gemini 请求推入队列,Web 请求只负责入队。这样解耦清晰、失败可重试、还能横向扩展 worker。
不需要复杂中间件——Redis 自带 LPUSH 和 BRPOP,几行代码就能搭出可靠任务管道。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











