一枪打爆你的狗头 發表於 2026-5-3 17:21:27

PHP调用DeepSeek API的完整指南

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">简介</a></li><li><a href="#_label1">1. 环境准备</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">1.1 系统要求</a></li><li><a href="#_lab2_1_1">1.2 项目结构</a></li></ul><li><a href="#_label2">2. 完整代码实现</a></li><ul class="second_class_ul"></ul><li><a href="#_label3">3. 代码详解</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_2">3.1 类结构</a></li><li><a href="#_lab2_3_3">3.2 关键功能</a></li><ul class="third_class_ul"><li><a href="#_label3_3_3_0">文件操作</a></li><li><a href="#_label3_3_3_1">cURL 配置</a></li></ul><li><a href="#_lab2_3_4">3.3 参数说明</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label4">4.&nbsp;错误处理</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">5. 使用方法</a></li><ul class="second_class_ul"><li><a href="#_lab2_5_5">5.1 修改配置</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_5_6">5.2 运行程序</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_5_7">5.3 交互方式</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label6">6. 性能优化建议</a></li><ul class="second_class_ul"></ul><li><a href="#_label7">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>简介</h2>
<p>本文将介绍如何使用 PHP 调用 DeepSeek API,实现流式对话并保存对话记录。PHP 版本使用面向对象的方式实现,代码结构清晰,易于维护。</p>
<p class="maodian"><a name="_label1"></a></p><h2>1. 环境准备</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>1.1 系统要求</h3>
<ul><li>PHP 7.0 或更高版本</li><li>PHP cURL 扩展</li><li>文件写入权限</li></ul>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>1.2 项目结构</h3>
<div class="jb51code"><pre class="brush:plain;">deepseek-project/
├── main.php          # 主程序
└── conversation.txt# 对话记录文件
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>2. 完整代码实现</h2>
<div class="jb51code"><pre class="brush:php;">&lt;?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-&gt;logFile)) {
            touch($this-&gt;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-&gt;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)) &gt; 0) {
                  if (strpos($line, 'data: ') === 0) {
                        $data = substr($line, 6); // 移除 "data: " 前缀
                        if ($data === '') {
                            continue;
                        }

                        $json = json_decode($data, true);
                        if ($json &amp;&amp; isset($json['choices']['delta']['content'])) {
                            $content = $json['choices']['delta']['content'];
                            echo $content;
                            flush();
                            $this-&gt;saveToFile($content);
                        }
                  }
                }
            }
      }
    }

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

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

            // 保存问题
            $this-&gt;saveToFile($question, true);

            // 准备请求数据
            $data = [
                'model' =&gt; 'deepseek-ai/DeepSeek-V3',
                'messages' =&gt; [
                  [
                        'role' =&gt; 'user',
                        'content' =&gt; $question
                  ]
                ],
                'stream' =&gt; true,
                'max_tokens' =&gt; 2048,
                'temperature' =&gt; 0.7,
                'top_p' =&gt; 0.7,
                'top_k' =&gt; 50,
                'frequency_penalty' =&gt; 0.5,
                'n' =&gt; 1,
                'response_format' =&gt; [
                  'type' =&gt; 'text'
                ]
            ];

            // 准备 cURL 请求
            $ch = curl_init($this-&gt;url);
            curl_setopt_array($ch, [
                CURLOPT_POST =&gt; true,
                CURLOPT_POSTFIELDS =&gt; json_encode($data),
                CURLOPT_RETURNTRANSFER =&gt; true,
                CURLOPT_HTTPHEADER =&gt; [
                  'Content-Type: application/json',
                  'Authorization: Bearer ' . $this-&gt;apiKey
                ],
                CURLOPT_WRITEFUNCTION =&gt; 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-&gt;saveToFile("\n----------------------------------------\n");

            } catch (Exception $e) {
                $error_msg = "请求错误: " . $e-&gt;getMessage() . "\n";
                echo $error_msg;
                $this-&gt;saveToFile($error_msg);
            } finally {
                curl_close($ch);
            }
      }
    }
}

// 运行程序
$chatbot = new DeepSeekChat();
$chatbot-&gt;chat();
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>3. 代码详解</h2>
<p class="maodian"><a name="_lab2_3_2"></a></p><h3>3.1 类结构</h3>
<ul><li><code>DeepSeekChat</code>: 主类,封装所有功能</li><li><code>__construct</code>: 构造函数,初始化日志文件</li><li><code>saveToFile</code>: 保存对话记录</li><li><code>processStreamingResponse</code>: 处理流式响应</li><li><code>chat</code>: 主对话循环</li></ul>
<p class="maodian"><a name="_lab2_3_3"></a></p><h3>3.2 关键功能</h3>
<p class="maodian"><a name="_label3_3_3_0"></a></p><h4>文件操作</h4>
<div class="jb51code"><pre class="brush: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-&gt;logFile, $text, FILE_APPEND);
}
</pre></div>
<p class="maodian"><a name="_label3_3_3_1"></a></p><h4>cURL 配置</h4>
<div class="jb51code"><pre class="brush:php;">curl_setopt_array($ch, [
    CURLOPT_POST =&gt; true,
    CURLOPT_POSTFIELDS =&gt; json_encode($data),
    CURLOPT_RETURNTRANSFER =&gt; true,
    CURLOPT_HTTPHEADER =&gt; [
      'Content-Type: application/json',
      'Authorization: Bearer ' . $this-&gt;apiKey
    ]
]);
</pre></div>
<p class="maodian"><a name="_lab2_3_4"></a></p><h3>3.3 参数说明</h3>
<ul><li><code>model</code>: 使用的模型名称</li><li><code>stream</code>: 启用流式输出</li><li><code>max_tokens</code>: 最大输出长度 (2048)</li><li><code>temperature</code>: 控制随机性 (0.7)</li><li><code>top_p</code>,&nbsp;<code>top_k</code>: 采样参数</li><li><code>frequency_penalty</code>: 重复惩罚系数</li></ul>
<p class="maodian"><a name="_label4"></a></p><h2>4.&nbsp;错误处理</h2>
<p>代码包含完整的错误处理机制:</p>
<ul><li>cURL 错误检查</li><li>JSON 解析错误处理</li><li>文件操作错误处理</li><li>异常捕获和日志记录</li></ul>
<p class="maodian"><a name="_label5"></a></p><h2>5. 使用方法</h2>
<p class="maodian"><a name="_lab2_5_5"></a></p><h3>5.1 修改配置</h3>
<p>在代码中替换&nbsp;<code>YOUR_API_KEY</code>&nbsp;为你的实际 API Key。</p>
<p class="maodian"><a name="_lab2_5_6"></a></p><h3>5.2 运行程序</h3>
<div class="jb51code"><pre class="brush:bash;">php main.php
</pre></div>
<p class="maodian"><a name="_lab2_5_7"></a></p><h3>5.3 交互方式</h3>
<ul><li>输入问题进行对话</li><li>输入 &lsquo;q&rsquo; 退出程序</li><li>查看 conversation.txt 获取对话记录</li></ul>
<p class="maodian"><a name="_label6"></a></p><h2>6. 性能优化建议</h2>
<ol><li><p>内存管理</p>
<ul><li>使用适当的缓冲区大小</li><li>及时清理变量</li><li>避免大量数据积累</li></ul></li><li><p>文件操作</p>
<ul><li>使用文件锁防止并发写入</li><li>定期清理日志文件</li><li>考虑使用数据库存储</li></ul></li><li><p>网络请求</p>
<ul><li>设置合理的超时时间</li><li>使用持久连接</li><li>处理网络异常</li></ul></li></ol>
<p class="maodian"><a name="_label7"></a></p><h2>总结</h2>
<p>PHP 版本的 DeepSeek API 实现采用面向对象方式,代码结构清晰,易于维护和扩展。通过 cURL 实现流式处理,提供了良好的交互体验。</p>
頁: [1]
查看完整版本: PHP调用DeepSeek API的完整指南