本文将介绍如何使用PHP调用DeepSeekAPI,实现流式对话并保存对话记录,PHP版本使用面向对象的方式实现,代码结构清晰,易于维护,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
目录
简介1. 环境准备1.1 系统要求1.2 项目结构2. 完整代码实现3. 代码详解3.1 类结构3.2 关键功能文件操作cURL 配置3.3 参数说明4.错误处理5. 使用方法5.1 修改配置5.2 运行程序5.3 交互方式6. 性能优化建议总结简介
本文将介绍如何使用 PHP 调用 DeepSeek API,实现流式对话并保存对话记录。PHP 版本使用面向对象的方式实现,代码结构清晰,易于维护。
1. 环境准备
1.1 系统要求
PHP 7.0 或更高版本PHP cURL 扩展文件写入权限1.2 项目结构
deepseek-project/├── main.php # 主程序└── conversation.txt # 对话记录文件
2. 完整代码实现
<?phpclass DeepSeekChat { private $url = 'https://api.siliconflow.cn/v1/chat/completions'; private $apiKey = 'YOUR_API_KEY'; // 替换为你的 API Key private $logFile = 'conversation.txt'; public function __construct() { // 确保日志文件存在且可写 if (!file_exists($this->logFile)) { touch($this->logFile); } } private function saveToFile($content, $isQuestion = false) { $timestamp = date('Y-m-d H:i:s'); $text = $isQuestion ? "\n[$timestamp] Question:\n$content\n\n[$timestamp] Answer:\n" : $content; file_put_contents($this->logFile, $text, FILE_APPEND); } private function processStreamingResponse($handle) { $buffer = ''; while (!feof($handle)) { $chunk = fread($handle, 1024); $buffer .= $chunk; // 处理缓冲区中的每一行 while (($pos = strpos($buffer, "\n")) !== false) { $line = substr($buffer, 0, $pos); $buffer = substr($buffer, $pos + 1); if (strlen(trim($line)) > 0) { if (strpos($line, 'data: ') === 0) { $data = substr($line, 6); // 移除 "data: " 前缀 if ($data === '[DONE]') { continue; } $json = json_decode($data, true); if ($json && isset($json['choices'][0]['delta']['content'])) { $content = $json['choices'][0]['delta']['content']; echo $content; flush(); $this->saveToFile($content); } } } } } } public function chat() { while (true) { echo "\n请输入您的问题 (输入 q 退出): "; $question = trim(fgets(STDIN)); if ($question === 'q') { echo "程序已退出\n"; break; } // 保存问题 $this->saveToFile($question, true); // 准备请求数据 $data = [ 'model' => 'deepseek-ai/DeepSeek-V3', 'messages' => [ [ 'role' => 'user', 'content' => $question ] ], 'stream' => true, 'max_tokens' => 2048, 'temperature' => 0.7, 'top_p' => 0.7, 'top_k' => 50, 'frequency_penalty' => 0.5, 'n' => 1, 'response_format' => [ 'type' => 'text' ] ]; // 准备 cURL 请求 $ch = curl_init($this->url); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($data), CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Authorization: Bearer ' . $this->apiKey ], CURLOPT_WRITEFUNCTION => function($ch, $data) { echo $data; return strlen($data); } ]); try { // 发送请求并处理响应 $handle = curl_exec($ch); if (curl_errno($ch)) { throw new Exception(curl_error($ch)); } // 添加分隔符 echo "\n----------------------------------------\n"; $this->saveToFile("\n----------------------------------------\n"); } catch (Exception $e) { $error_msg = "请求错误: " . $e->getMessage() . "\n"; echo $error_msg; $this->saveToFile($error_msg); } finally { curl_close($ch); } } }}// 运行程序$chatbot = new DeepSeekChat();$chatbot->chat();
3. 代码详解
3.1 类结构
DeepSeekChat
: 主类,封装所有功能__construct
: 构造函数,初始化日志文件saveToFile
: 保存对话记录processStreamingResponse
: 处理流式响应chat
: 主对话循环3.2 关键功能
文件操作
private function saveToFile($content, $isQuestion = false) { $timestamp = date('Y-m-d H:i:s'); $text = $isQuestion ? "\n[$timestamp] Question:\n$content\n\n[$timestamp] Answer:\n" : $content; file_put_contents($this->logFile, $text, FILE_APPEND);}
cURL 配置
curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($data), CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Authorization: Bearer ' . $this->apiKey ]]);
3.3 参数说明
model
: 使用的模型名称stream
: 启用流式输出max_tokens
: 最大输出长度 (2048)temperature
: 控制随机性 (0.7)top_p
,top_k
: 采样参数frequency_penalty
: 重复惩罚系数4.错误处理
代码包含完整的错误处理机制:
cURL 错误检查JSON 解析错误处理文件操作错误处理异常捕获和日志记录5. 使用方法
5.1 修改配置
在代码中替换YOUR_API_KEY
为你的实际 API Key。
5.2 运行程序
php main.php
5.3 交互方式
输入问题进行对话输入 ‘q’ 退出程序查看 conversation.txt 获取对话记录6. 性能优化建议
内存管理
使用适当的缓冲区大小及时清理变量避免大量数据积累文件操作
使用文件锁防止并发写入定期清理日志文件考虑使用数据库存储网络请求
设置合理的超时时间使用持久连接处理网络异常总结
PHP 版本的 DeepSeek API 实现采用面向对象方式,代码结构清晰,易于维护和扩展。通过 cURL 实现流式处理,提供了良好的交互体验。