PHP 7.4 可通过 cURL 调用 Ollama REST API 实现本地大模型交互,支持同步请求(stream=false)和流式响应(stream=true),需确保 Ollama 已运行于 http://localhost:11434 并正确配置 cURL 选项及 JSON 处理逻辑。

PHP 7.4 本身不内置 HTTP/2 或流式响应支持,但可以通过 cURL 向 Ollama 的 REST API(默认 http://localhost:11434/api/chat 或 /api/generate)发送标准 POST 请求,实现本地大模型调用。关键点是:Ollama 接口是同步 JSON 接口(非 WebSocket),PHP 7.4 完全可胜任。
确认 Ollama 已运行并暴露 API
在终端执行:ollama serve
确保服务监听在 127.0.0.1:11434(默认)。可用 curl http://localhost:11434/api/tags 测试是否返回模型列表。
使用 cURL 发送 chat 请求(推荐,支持上下文)
Ollama 的 /api/chat 接口更适合对话场景,支持 message 历史和流式字段控制。PHP 7.4 示例:
将小说章节转换为电影分镜剧本。用户上传txt/md/docx文本,AI分析场景、角色、情绪、镜头语言,输出专业分镜脚本。适用于用户提及“分镜”“storyboard”“小说转分镜”“影视改编”“镜头脚本”或需要将小说改编为分镜的场景。
<?php
$model = 'qwen2:1.5b'; // 替换为你已 pull 的模型名,如 llama3, phi3 等
$messages = [
['role' => 'user', 'content' => '你好,请用中文简单介绍你自己']
];
$data = [
'model' => $model,
'messages' => $messages,
'stream' => false // 设为 true 可获取流式响应(需逐行解析),PHP 7.4 下建议先设 false 调试
];
$options = [
CURLOPT_URL => 'http://localhost:11434/api/chat',
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 300
];
$ch = curl_init();
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
if (curl_errno($ch)) {
die('cURL 错误: ' . curl_error($ch));
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
die("Ollama 返回错误状态码: {$httpCode}, 响应: {$response}");
}
$result = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
die('JSON 解析失败');
}
echo $result['message']['content'] ?? '未返回 content 字段';
?>
处理流式响应(可选进阶)
若设 "stream": true,Ollama 会返回多个以换行符分隔的 JSON 对象(NDJSON)。PHP 7.4 可用 curl_setopt($ch, CURLOPT_WRITEFUNCTION, ...) 逐块接收:
- 设置
CURLOPT_STREAMING => true(注意:PHP 7.4 的 cURL 扩展需 ≥ 7.66.0) - 用
CURLOPT_WRITEFUNCTION注册回调函数,按行切割、json_decode每段 - 注意响应头无
Content-Length,需依赖 chunked 编码或超时中断 - 实际项目中,若不需要实时流式输出,建议优先用
stream=false简化逻辑
常见问题与检查项
-
模型未加载:先在终端运行
ollama list,确认模型存在;不存在则ollama run qwen2:1.5b或ollama pull qwen2:1.5b -
连接被拒绝:检查
ollama serve是否前台运行;防火墙是否拦截 11434 端口;PHP 运行环境能否访问 localhost(Docker 中需用 host.docker.internal) -
JSON 解析失败:打印原始
$response,确认是否为空或含 HTML 错误页(比如端口错、路径错) -
中文乱码:确保 PHP 文件保存为 UTF-8 无 BOM;
header('Content-Type: text/html; charset=utf-8');(若输出到浏览器)


















