大家好,我是老王。一个在PHP圈子里摸爬滚打了快十年的个人开发者。最近这AI的风是越刮越猛,不管是写代码还是做产品,不跟AI沾点边好像都跟不上时代了。我平时主要用PHP做后端,前端也玩Vue和Vite,所以一直琢磨着怎么把我熟悉的技术栈和这波AI浪潮结合起来。
先说下我为啥选Deepseek。一是它兼容OpenAI的API格式,这意味着咱们可以少写很多适配代码;二是价格相对亲民,对于个人开发者来说负担不大;三是中文支持好,毕竟咱们平时开发打交道的中文场景多。当然,最重要的还是文档得看得懂,不用绕来绕去。
所以,我最近就花时间研究了一下怎么用PHP去调用Deepseek的API,并且搭了一个简单的前后端对话应用。这篇文章就是把我的整个探索过程,从了解到使用,再到最后的代码实现,原原本本地记录下来,希望能给同样想用PHP玩AI的朋友们一点参考。
一、准备工作不能省
干啥事都得先看文档,这是基本功。Deepseek的API文档写得还算清晰,走的是现在主流的大模型API路线,跟OpenAI的格式很像,所以上手难度不大。
首先,你得去Deepseek的官网注册账号,然后在后台找到API Key的管理页面,生成一个自己的Key。这个Key就是你调用API的钥匙,千万不能泄露出去,谁拿到谁就能用你的账户调用API,到时候账单就不好看了。
PHP环境的话,我用的是PHP 8.5,其实7.4以上应该都行。需要开启curl扩展,这个一般默认都装了。如果你想用官方推荐的OpenAI SDK,那就得用Composer安装一下。不过在这里我就直接用cURL,更轻量,控制力也更强,方便大家看得懂,所以后面的例子我主要用cURL来写,也会提一下SDK的用法。
Deepseek的API地址是https://api.deepseek.com,端点路径是/chat/completions。请求方式是POST,头部需要带上API Key和内容类型。
二、基础调用,先跑通最简单的
我先写个最简单的例子,模拟一个对话请求:
<?php// 这是一个最基础的调用示例$apiKey = getenv('DEEPSEEK_API_KEY');$apiUrl = 'https://api.deepseek.com/chat/completions';// 构造请求数据$data = [ 'model' => 'deepseek-chat', // 用非思考模式,响应快 'messages' => [ [ 'role' => 'system', 'content' => '你是一个友好的助手,回答要简洁明了。' ], [ 'role' => 'user', 'content' => 'PHP怎么处理数组去重?' ] ], 'stream' => false // 非流式输出];// 设置cURL选项$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $apiUrl);curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Authorization: Bearer ' . $apiKey]);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_TIMEOUT, 60); // 设置超时,避免卡死// 执行请求并处理响应$response = curl_exec($ch);$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);if (curl_errno($ch)) { echo 'cURL错误: ' . curl_error($ch); exit;}curl_close($ch);if ($httpCode === 200) { $result = json_decode($response, true); echo "回答内容: " . $result['choices'][0]['message']['content'] . "\n"; // 输出token使用情况,方便控制成本 if (isset($result['usage'])) { echo "本次消耗: 输入{$result['usage']['prompt_tokens']} token, 输出{$result['usage']['completion_tokens']} token\n"; }} else { echo "请求失败,HTTP状态码: $httpCode\n"; echo "响应内容: $response\n";}?>
这个例子虽然简单,但包含了核心要素:认证、请求体构造、错误处理。我第一次跑通的时候还挺兴奋,毕竟从PHP代码里直接调用大模型,感觉挺神奇的。
如果你习惯用SDK,用Composer装好openai/openai-php后,代码会更简洁点:
<?phprequire 'vendor/autoload.php';$client = OpenAI::client(getenv('DEEPSEEK_API_KEY'), 'https://api.deepseek.com');$response = $client->chat()->create([ 'model' => 'deepseek-chat', 'messages' => [ ['role' => 'system', 'content' => '你是一个PHP专家。'], ['role' => 'user', 'content' => '解释一下PHP的依赖注入'] ], 'stream' => false]);echo $response->choices[0]->message->content;?>
三、参数调优,根据场景灵活配置
Deepseek提供了几个关键参数,用好了能大幅提升效果。我整理了一下常用的几个:
1. model:目前主要是deepseek-chat和deepseek-reasoner。chat是通用对话模式,响应快;reasoner是思考模式,适合复杂推理,但输出会长很多,成本也高。日常开发我用chat就够了,遇到数学计算或逻辑推理才切reasoner。
2. temperature:温度值,控制回答的随机性。默认是1.0。根据官方建议:代码生成、数学解题:设为0.0,保证准确性;数据分析:1.0,平衡稳定性和创造性;通用对话:1.3,让对话更自然;创意写作:1.5,增加多样性。
3. max_tokens:限制输出长度。默认4K,最大8K(chat模式)。reasoner模式默认32K,最大64K。建议根据需求设置,避免不必要的token消耗。比如简单问答设1000就够,复杂分析可以设5000。
4. stream:是否流式输出。对于长文本生成,建议设为true,可以实时获取内容,用户体验更好。实现上需要逐行解析响应。
四、Token计算和成本控制
Token是计费单位,理解它很重要。Deepseek的计费规则是:
输入(缓存命中):0.2元/百万token
输入(缓存未命中):2元/百万token
输出:3元/百万token
换算成中文,大约1个中文字符=0.6 token,1个英文字符=0.3 token。比如我写的一篇2000字文章,大约需要1.2万token,成本大概在几分钱到几毛钱之间,个人使用完全能接受。
但要注意,如果频繁调用,或者上下文很长,费用会累积。我建议:在代码里记录每次调用的token用量,定期汇总;对于高频调用,考虑缓存常见问题的答案;使用stream模式可以提前终止响应,节省输出token。
Deepseek提供了离线计算token的工具,你可以下载下来先估算一下,避免上线后费用失控。
五、错误处理,必须考虑的边界情况
调用API不可能一帆风顺,老王整理了常见的错误码和应对策略:
400格式错误:一般是请求体JSON格式不对,检查一下数据结构和编码。
401认证失败:API Key错误或过期,重新申请一个。
402余额不足:账号没钱了,赶紧充值。
422参数错误:比如model写错了,或者必填字段漏了。
429请求太频繁:虽然官方说不限并发,但高流量下还是会限速,建议加个重试机制。
500/503服务端问题:等待后重试,如果持续出错,可能是服务临时不可用。
我在代码里通常会加个简单的重试逻辑:
functioncallDeepSeekWithRetry($data, $maxRetries = 3) { for ($i = 0; $i < $maxRetries; $i++) { $response = callDeepSeek($data); // 上面的基础调用函数 $httpCode = $response['http_code']; if ($httpCode === 200) { return $response; } if ($httpCode === 429 || $httpCode >= 500) { sleep(1); // 等待一秒再试 continue; } // 其他错误直接跳出 break; } return null;}
六、前后端集成实战
前面讲了PHP后端调用,现在简单说下前后端集成。前端我用Vue,后端用PHP,通过AJAX通信,这里由于时间关系,所以老王只贴出核心代码。
前端Vue组件简单示例:
<template> <div> <inputv-model="question"placeholder="输入问题" /> <button @click="ask">提问</button> <divv-if="loading">思考中...</div> <divv-if="answer">{{ answer }}</div> </div></template><script>export default { data() { return { question: '', answer: '', loading: false } }, methods: { async ask() { this.loading = true; this.answer = ''; try { const response = await fetch('/api/deepseek.php', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ question: this.question }) }); const data = await response.json(); this.answer = data.answer; } catch (e) { this.answer = '出错了: ' + e.message; } finally { this.loading = false; } } }}</script>
后端PHP(deepseek.php):
<?phpheader('Content-Type: application/json');header('Access-Control-Allow-Origin: *');$input = json_decode(file_get_contents('php://input'), true);$question = $input['question'] ?? '';if (empty($question)) { echo json_encode(['error' => '问题不能为空']); exit;}// 调用Deepseek API$apiKey = getenv('DEEPSEEK_API_KEY');$apiUrl = 'https://api.deepseek.com/chat/completions';$data = [ 'model' => 'deepseek-chat', 'messages' => [ ['role' => 'system', 'content' => '你是一个乐于助人的助手,回答要简洁清晰。'], ['role' => 'user', 'content' => $question] ], 'max_tokens' => 1500, 'temperature' => 0.7];$ch = curl_init();curl_setopt_array($ch, [ CURLOPT_URL => $apiUrl, CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($data), CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Authorization: Bearer ' . $apiKey ], CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 60]);$response = curl_exec($ch);$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);curl_close($ch);if ($httpCode === 200) { $result = json_decode($response, true); $answer = $result['choices'][0]['message']['content'] ?? '未获取到回答'; echo json_encode(['answer' => $answer]);} else { echo json_encode(['error' => 'API调用失败', 'code' => $httpCode]);}?>
这个例子展示了基本流程:前端发送问题,后端调用Deepseek,返回结果。实际项目中,你需要加上错误处理、日志记录和安全验证。
实际上PHP对接Deepseek其实不复杂,核心就是HTTP请求和JSON处理,这些都是PHP的强项。关键是理解API的工作方式和成本模型,做好错误处理和性能优化。
那么老王从了解到使用,整个过程大概需要半天时间就能跑通demo,然后根据实际需求扩展。如果你像我一样是个人开发者,可以先从简单的对话功能开始,逐步尝试更复杂的应用,比如代码生成、文档编写、数据分析等。
最后提醒一句,虽然AI很强大,但别过度依赖。它更适合做辅助工具,比如生成初稿、提供思路,最终的决策和核心逻辑还得自己把关。毕竟咱们是开发者,不是调包侠。如果大家在实践中遇到问题,欢迎交流讨论。技术这东西,就是得不断折腾才有意思。

(欢迎三连,关注这个公众号,一起来探索编程的意义吧)