• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    PHP调用DeepSeek API的完整指南

    发布者: 山止川行 | 发布时间: 2025-6-14 13:16| 查看数: 127| 评论数: 0|帖子模式

    简介

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

    1. 环境准备


    1.1 系统要求


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

    1.2 项目结构
    1. deepseek-project/
    2. ├── main.php          # 主程序
    3. └── conversation.txt  # 对话记录文件
    复制代码
    2. 完整代码实现
    1. <?php

    2. class DeepSeekChat {
    3.     private $url = 'https://api.siliconflow.cn/v1/chat/completions';
    4.     private $apiKey = 'YOUR_API_KEY';  // 替换为你的 API Key
    5.     private $logFile = 'conversation.txt';

    6.     public function __construct() {
    7.         // 确保日志文件存在且可写
    8.         if (!file_exists($this->logFile)) {
    9.             touch($this->logFile);
    10.         }
    11.     }

    12.     private function saveToFile($content, $isQuestion = false) {
    13.         $timestamp = date('Y-m-d H:i:s');
    14.         $text = $isQuestion
    15.             ? "\n[$timestamp] Question:\n$content\n\n[$timestamp] Answer:\n"
    16.             : $content;
    17.         
    18.         file_put_contents($this->logFile, $text, FILE_APPEND);
    19.     }

    20.     private function processStreamingResponse($handle) {
    21.         $buffer = '';
    22.         while (!feof($handle)) {
    23.             $chunk = fread($handle, 1024);
    24.             $buffer .= $chunk;

    25.             // 处理缓冲区中的每一行
    26.             while (($pos = strpos($buffer, "\n")) !== false) {
    27.                 $line = substr($buffer, 0, $pos);
    28.                 $buffer = substr($buffer, $pos + 1);

    29.                 if (strlen(trim($line)) > 0) {
    30.                     if (strpos($line, 'data: ') === 0) {
    31.                         $data = substr($line, 6); // 移除 "data: " 前缀
    32.                         if ($data === '[DONE]') {
    33.                             continue;
    34.                         }

    35.                         $json = json_decode($data, true);
    36.                         if ($json && isset($json['choices'][0]['delta']['content'])) {
    37.                             $content = $json['choices'][0]['delta']['content'];
    38.                             echo $content;
    39.                             flush();
    40.                             $this->saveToFile($content);
    41.                         }
    42.                     }
    43.                 }
    44.             }
    45.         }
    46.     }

    47.     public function chat() {
    48.         while (true) {
    49.             echo "\n请输入您的问题 (输入 q 退出): ";
    50.             $question = trim(fgets(STDIN));

    51.             if ($question === 'q') {
    52.                 echo "程序已退出\n";
    53.                 break;
    54.             }

    55.             // 保存问题
    56.             $this->saveToFile($question, true);

    57.             // 准备请求数据
    58.             $data = [
    59.                 'model' => 'deepseek-ai/DeepSeek-V3',
    60.                 'messages' => [
    61.                     [
    62.                         'role' => 'user',
    63.                         'content' => $question
    64.                     ]
    65.                 ],
    66.                 'stream' => true,
    67.                 'max_tokens' => 2048,
    68.                 'temperature' => 0.7,
    69.                 'top_p' => 0.7,
    70.                 'top_k' => 50,
    71.                 'frequency_penalty' => 0.5,
    72.                 'n' => 1,
    73.                 'response_format' => [
    74.                     'type' => 'text'
    75.                 ]
    76.             ];

    77.             // 准备 cURL 请求
    78.             $ch = curl_init($this->url);
    79.             curl_setopt_array($ch, [
    80.                 CURLOPT_POST => true,
    81.                 CURLOPT_POSTFIELDS => json_encode($data),
    82.                 CURLOPT_RETURNTRANSFER => true,
    83.                 CURLOPT_HTTPHEADER => [
    84.                     'Content-Type: application/json',
    85.                     'Authorization: Bearer ' . $this->apiKey
    86.                 ],
    87.                 CURLOPT_WRITEFUNCTION => function($ch, $data) {
    88.                     echo $data;
    89.                     return strlen($data);
    90.                 }
    91.             ]);

    92.             try {
    93.                 // 发送请求并处理响应
    94.                 $handle = curl_exec($ch);
    95.                
    96.                 if (curl_errno($ch)) {
    97.                     throw new Exception(curl_error($ch));
    98.                 }

    99.                 // 添加分隔符
    100.                 echo "\n----------------------------------------\n";
    101.                 $this->saveToFile("\n----------------------------------------\n");

    102.             } catch (Exception $e) {
    103.                 $error_msg = "请求错误: " . $e->getMessage() . "\n";
    104.                 echo $error_msg;
    105.                 $this->saveToFile($error_msg);
    106.             } finally {
    107.                 curl_close($ch);
    108.             }
    109.         }
    110.     }
    111. }

    112. // 运行程序
    113. $chatbot = new DeepSeekChat();
    114. $chatbot->chat();
    复制代码
    3. 代码详解


    3.1 类结构


      1. DeepSeekChat
      复制代码
      : 主类,封装所有功能
      1. __construct
      复制代码
      : 构造函数,初始化日志文件
      1. saveToFile
      复制代码
      : 保存对话记录
      1. processStreamingResponse
      复制代码
      : 处理流式响应
      1. chat
      复制代码
      : 主对话循环

    3.2 关键功能


    文件操作
    1. private function saveToFile($content, $isQuestion = false) {
    2.     $timestamp = date('Y-m-d H:i:s');
    3.     $text = $isQuestion
    4.         ? "\n[$timestamp] Question:\n$content\n\n[$timestamp] Answer:\n"
    5.         : $content;
    6.    
    7.     file_put_contents($this->logFile, $text, FILE_APPEND);
    8. }
    复制代码
    cURL 配置
    1. curl_setopt_array($ch, [
    2.     CURLOPT_POST => true,
    3.     CURLOPT_POSTFIELDS => json_encode($data),
    4.     CURLOPT_RETURNTRANSFER => true,
    5.     CURLOPT_HTTPHEADER => [
    6.         'Content-Type: application/json',
    7.         'Authorization: Bearer ' . $this->apiKey
    8.     ]
    9. ]);
    复制代码
    3.3 参数说明


      1. model
      复制代码
      : 使用的模型名称
      1. stream
      复制代码
      : 启用流式输出
      1. max_tokens
      复制代码
      : 最大输出长度 (2048)
      1. temperature
      复制代码
      : 控制随机性 (0.7)
      1. top_p
      复制代码
      ,
      1. top_k
      复制代码
      : 采样参数
      1. frequency_penalty
      复制代码
      : 重复惩罚系数

    4. 错误处理

    代码包含完整的错误处理机制:

    • cURL 错误检查
    • JSON 解析错误处理
    • 文件操作错误处理
    • 异常捕获和日志记录

    5. 使用方法


    5.1 修改配置

    在代码中替换
    1. YOUR_API_KEY
    复制代码
    为你的实际 API Key。

    5.2 运行程序
    1. php main.php
    复制代码
    5.3 交互方式


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

    6. 性能优化建议


    • 内存管理

      • 使用适当的缓冲区大小
      • 及时清理变量
      • 避免大量数据积累

    • 文件操作

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

    • 网络请求

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


    总结

    PHP 版本的 DeepSeek API 实现采用面向对象方式,代码结构清晰,易于维护和扩展。通过 cURL 实现流式处理,提供了良好的交互体验。
    到此这篇关于PHP调用DeepSeek API的完整指南的文章就介绍到这了,更多相关PHP调用DeepSeek API内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/program/335255m3w.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表