PHP 调用 DeepSeek API 完整指南

devtools/2025/2/5 21:47:25/

简介

本文将介绍如何使用 PHP 调用 DeepSeek API,实现流式对话并保存对话记录。PHP 版本使用面向对象的方式实现,代码结构清晰,易于维护。

1. 环境准备

1.1 系统要求

  • PHP 7.0 或更高版本
  • PHP cURL 扩展
  • 文件写入权限

1.2 项目结构

deepseek-project/
├── main.php          # 主程序
└── conversation.txt  # 对话记录文件

2. 完整代码实现

php"><?phpclass DeepSeekChat {private $url = 'https://api.siliconflow.cn/v1/chat/completions';private $apiKey = 'YOUR_API_KEY';  // 替换为你的 API Keyprivate $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 关键功能

文件操作
php">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 配置
php">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 交互方式

  1. 输入问题进行对话
  2. 输入 ‘q’ 退出程序
  3. 查看 conversation.txt 获取对话记录

6. 性能优化建议

  1. 内存管理

    • 使用适当的缓冲区大小
    • 及时清理变量
    • 避免大量数据积累
  2. 文件操作

    • 使用文件锁防止并发写入
    • 定期清理日志文件
    • 考虑使用数据库存储
  3. 网络请求

    • 设置合理的超时时间
    • 使用持久连接
    • 处理网络异常

总结

PHP 版本的 DeepSeek API 实现采用面向对象方式,代码结构清晰,易于维护和扩展。通过 cURL 实现流式处理,提供了良好的交互体验。

立即体验

想要体验 DeepSeek 的强大功能?现在就开始吧!

快来体验 DeepSeek:https://cloud.siliconflow.cn/i/vnCCfVaQ

快来体验 DeepSeek:https://cloud.siliconflow.cn/i/vnCCfVaQ

快来体验 DeepSeek:https://cloud.siliconflow.cn/i/vnCCfVaQ

更多资源

更多详细信息和最新更新,请访问我们的技术博客:
https://blog.csdn.net/hzether/article/details/145438717?sharetype=blogdetail&sharerId=145438717&sharerefer=PC&sharesource=hzether&spm=1011.2480.3001.8118


http://www.ppmy.cn/devtools/156380.html

相关文章

ONE NET MQTT+HTTP多端控制

使用移动的ONENET实现数据上传与远程控制&#xff0c;数据上传使用MQTT协议&#xff08;ESP8266&#xff09;&#xff0c;而数据查看和远程控制使用的HTTP&#xff08;安卓端/QT&#xff09;&#xff0c;效果&#xff1a; ONENET简单MQTT和HTTP使用 ESP8266通过MQTT上传和订阅数…

Vue整合Axios

目标 将 axios 请求方法&#xff0c;封装到 request 模块 我们会使用 axios 来请求后端接口, 一般都会对 axios 进行一些配置 (比如: 配置基础地址,请求响应拦截器等等) 一般项目开发中, 都会对 axios 进行基本的二次封装, 单独封装到一个模块中, 便于使用 安装 Axios npm …

智能汽车网络安全威胁报告

近年来随着智能汽车技术的快速发展&#xff0c;针对智能汽车的攻击也逐渐从传统的针对单一车辆控制器的攻击转变为针对整车智能化服务的攻击&#xff0c;包括但不限于对远程控制应用程序的操控、云服务的渗透、智能座舱系统的破解以及对第三方应用和智能服务的攻击。随着WP.29 …

【C++】线程池实现

目录 一、线程池简介线程池的核心组件实现步骤 二、C11实现线程池源码 三、线程池源码解析1. 成员变量2. 构造函数2.1 线程初始化2.2 工作线程逻辑 3. 任务提交(enqueue方法)3.1 方法签名3.2 任务封装3.3 任务入队 4. 析构函数4.1 停机控制 5. 关键技术点解析5.1 完美转发实现5…

TensorFlow 示例摄氏度到华氏度的转换(二)

这是一个完整的神经网络实现&#xff0c;用于将摄氏度转换为华氏度。下面&#xff0c;我会逐步描述各个步骤&#xff0c;并提供完整代码。 1. 数据准备与预处理 在这部分&#xff0c;我们准备了摄氏度&#xff08;features&#xff09;与对应的华氏度&#xff08;labels&…

LabVIEW无人机航线控制系统

介绍了一种无人机航线控制系统&#xff0c;该系统利用LabVIEW软件与MPU6050九轴传感器相结合&#xff0c;实现无人机飞行高度、速度、俯仰角和滚动角的实时监控。系统通过虚拟仪器技术&#xff0c;有效实现了数据的采集、处理及回放&#xff0c;极大提高了无人机航线的控制精度…

Machine Learning Engineering Open Book 机器学习工程开放书

文章目录 一、关于 Machine Learning Engineering Open Book二、书籍目录三、关键对照表四、快捷方式 一、关于 Machine Learning Engineering Open Book 这是一个开放的方法、工具和分步说明集合&#xff0c;有助于成功训练和微调大型语言模型和多模态模型及其推理。 这是一…

Linux实操篇-文件目录类>/>>/echo/head/tail/ln/history

目录 传送门前言一、>、 >>概念二、>、 >>实战1. **>&#xff08;输出重定向&#xff09;**2. **>>&#xff08;追加输出&#xff09;****区别总结&#xff1a;** 三、echo、head、tail概念四、echo、head、tail实战1. **echo****用法**&#xff1a…