PHP調(diào)用DeepSeek API的完整指南
簡(jiǎn)介
本文將介紹如何使用 PHP 調(diào)用 DeepSeek API,實(shí)現(xiàn)流式對(duì)話并保存對(duì)話記錄。PHP 版本使用面向?qū)ο蟮姆绞綄?shí)現(xiàn),代碼結(jié)構(gòu)清晰,易于維護(hù)。
1. 環(huán)境準(zhǔn)備
1.1 系統(tǒng)要求
- PHP 7.0 或更高版本
- PHP cURL 擴(kuò)展
- 文件寫(xiě)入權(quán)限
1.2 項(xiàng)目結(jié)構(gòu)
deepseek-project/ ├── main.php # 主程序 └── conversation.txt # 對(duì)話記錄文件
2. 完整代碼實(shí)現(xiàn)
<?php class DeepSeekChat { private $url = 'https://api.siliconflow.cn/v1/chat/completions'; private $apiKey = 'YOUR_API_KEY'; // 替換為你的 API Key private $logFile = 'conversation.txt'; public function __construct() { // 確保日志文件存在且可寫(xiě) 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; // 處理緩沖區(qū)中的每一行 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ǐng)輸入您的問(wèn)題 (輸入 q 退出): "; $question = trim(fgets(STDIN)); if ($question === 'q') { echo "程序已退出\n"; break; } // 保存問(wèn)題 $this->saveToFile($question, true); // 準(zhǔn)備請(qǐng)求數(shù)據(jù) $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' ] ]; // 準(zhǔn)備 cURL 請(qǐng)求 $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 { // 發(fā)送請(qǐng)求并處理響應(yīng) $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 = "請(qǐng)求錯(cuò)誤: " . $e->getMessage() . "\n"; echo $error_msg; $this->saveToFile($error_msg); } finally { curl_close($ch); } } } } // 運(yùn)行程序 $chatbot = new DeepSeekChat(); $chatbot->chat();
3. 代碼詳解
3.1 類結(jié)構(gòu)
DeepSeekChat
: 主類,封裝所有功能__construct
: 構(gòu)造函數(shù),初始化日志文件saveToFile
: 保存對(duì)話記錄processStreamingResponse
: 處理流式響應(yīng)chat
: 主對(duì)話循環(huán)
3.2 關(guān)鍵功能
文件操作
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 參數(shù)說(shuō)明
model
: 使用的模型名稱stream
: 啟用流式輸出max_tokens
: 最大輸出長(zhǎng)度 (2048)temperature
: 控制隨機(jī)性 (0.7)top_p
,top_k
: 采樣參數(shù)frequency_penalty
: 重復(fù)懲罰系數(shù)
4. 錯(cuò)誤處理
代碼包含完整的錯(cuò)誤處理機(jī)制:
- cURL 錯(cuò)誤檢查
- JSON 解析錯(cuò)誤處理
- 文件操作錯(cuò)誤處理
- 異常捕獲和日志記錄
5. 使用方法
5.1 修改配置
在代碼中替換 YOUR_API_KEY
為你的實(shí)際 API Key。
5.2 運(yùn)行程序
php main.php
5.3 交互方式
- 輸入問(wèn)題進(jìn)行對(duì)話
- 輸入 ‘q’ 退出程序
- 查看 conversation.txt 獲取對(duì)話記錄
6. 性能優(yōu)化建議
內(nèi)存管理
- 使用適當(dāng)?shù)木彌_區(qū)大小
- 及時(shí)清理變量
- 避免大量數(shù)據(jù)積累
文件操作
- 使用文件鎖防止并發(fā)寫(xiě)入
- 定期清理日志文件
- 考慮使用數(shù)據(jù)庫(kù)存儲(chǔ)
網(wǎng)絡(luò)請(qǐng)求
- 設(shè)置合理的超時(shí)時(shí)間
- 使用持久連接
- 處理網(wǎng)絡(luò)異常
總結(jié)
PHP 版本的 DeepSeek API 實(shí)現(xiàn)采用面向?qū)ο蠓绞?,代碼結(jié)構(gòu)清晰,易于維護(hù)和擴(kuò)展。通過(guò) cURL 實(shí)現(xiàn)流式處理,提供了良好的交互體驗(yàn)。
到此這篇關(guān)于PHP調(diào)用DeepSeek API的完整指南的文章就介紹到這了,更多相關(guān)PHP調(diào)用DeepSeek API內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php打開(kāi)遠(yuǎn)程文件的方法和風(fēng)險(xiǎn)及解決方法
本文講的是php打開(kāi)遠(yuǎn)程文件的使用方法,還有使用風(fēng)險(xiǎn)和解決方法2013-11-11PHP 日期時(shí)間函數(shù)的高級(jí)應(yīng)用技巧
PHP 日期時(shí)間函數(shù)常用函數(shù)高級(jí)使用技巧,大家在以后的開(kāi)發(fā)中能用的到。2009-10-10phpword插件導(dǎo)出word文件時(shí)中文亂碼問(wèn)題處理方案
PHPWord是一個(gè)可以把相關(guān)文件生成word文檔的插件了,但由于是老外開(kāi)發(fā)的對(duì)于gbk支持不好,所以我們?cè)趯?dǎo)出帶有中文的word時(shí)會(huì)出現(xiàn)亂碼問(wèn)題,下面本文就PHPWord中文亂碼問(wèn)題介紹一些解決方法。2014-08-08php實(shí)現(xiàn)根據(jù)身份證獲取精準(zhǔn)年齡
這篇文章主要為大家詳細(xì)介紹了php實(shí)現(xiàn)根據(jù)身份證獲取精準(zhǔn)年齡,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02PHP完全二叉樹(shù)定義與實(shí)現(xiàn)方法示例
這篇文章主要介紹了PHP完全二叉樹(shù)定義與實(shí)現(xiàn)方法,簡(jiǎn)單描述了完全二叉樹(shù)的概念并結(jié)合實(shí)例形式給出了完全二叉樹(shù)的定義、節(jié)點(diǎn)查找、添加、設(shè)置、打印等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10PHP使用finfo_file()函數(shù)檢測(cè)上傳圖片類型的實(shí)現(xiàn)方法
這篇文章主要介紹了PHP使用finfo_file()函數(shù)檢測(cè)上傳圖片類型的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了finfo_file()函數(shù)的功能、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04