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

