简介:本文详细解析PHP调用DeepSeek API的全流程,涵盖环境配置、API认证、请求封装、错误处理及实战案例,助力开发者快速实现AI能力集成。
DeepSeek API调用需PHP 7.2+版本支持,推荐使用PHP 8.0+以获得更好的HTTP/2支持。开发环境建议配置:
验证环境配置的PHP代码示例:
<?phpecho 'PHP版本: ' . PHP_VERSION . "\n";echo 'cURL支持: ' . (extension_loaded('curl') ? '✓' : '✗') . "\n";echo 'JSON支持: ' . (extension_loaded('json') ? '✓' : '✗') . "\n";?>
访问DeepSeek开放平台完成注册流程,需注意:
获取API Key的步骤:
API_KEY和SECRET_KEY(建议存储在环境变量中)DeepSeek采用Bearer Token认证,需通过API_KEY和SECRET_KEY生成访问令牌:
function generateAccessToken($apiKey, $secretKey) {$timestamp = time();$signature = hash_hmac('sha256', $apiKey . $timestamp, $secretKey);return base64_encode(json_encode(['api_key' => $apiKey,'timestamp' => $timestamp,'signature' => $signature]));}
推荐使用Guzzle HTTP客户端进行API调用:
require 'vendor/autoload.php';use GuzzleHttp\Client;class DeepSeekClient {private $client;private $apiKey;public function __construct($apiKey) {$this->client = new Client(['base_uri' => 'https://api.deepseek.com/v1/','headers' => ['Authorization' => 'Bearer ' . $this->generateToken($apiKey),'Content-Type' => 'application/json']]);$this->apiKey = $apiKey;}private function generateToken($apiKey) {// 实现前述的token生成逻辑}public function textCompletion($prompt, $model = 'deepseek-chat') {$response = $this->client->post('completions', ['json' => ['model' => $model,'prompt' => $prompt,'max_tokens' => 2048,'temperature' => 0.7]]);return json_decode($response->getBody(), true);}}
$deepseek = new DeepSeekClient('your_api_key');$result = $deepseek->textCompletion("用PHP写一个排序算法");echo $result['choices'][0]['text'];
关键参数说明:
model: 模型版本(deepseek-v1/deepseek-chat)temperature: 创造力参数(0.1-1.0)max_tokens: 生成长度限制stop: 停止生成序列
public function imageGeneration($prompt, $size = '1024x1024') {$response = $this->client->post('images/generate', ['json' => ['prompt' => $prompt,'n' => 1,'size' => $size]]);return json_decode($response->getBody(), true)['data'][0]['url'];}
实现类似ChatGPT的逐字输出效果:
public function streamCompletion($prompt) {$response = $this->client->post('completions/stream', ['json' => ['prompt' => $prompt],'stream' => true]);$body = $response->getBody();while (!$body->eof()) {$line = $body->readLine();if (strpos($line, 'data:') === 0) {$data = json_decode(trim(substr($line, 5)), true);echo $data['choices'][0]['text'];ob_flush();flush();}}}
使用Promise实现并发请求:
use GuzzleHttp\Promise;public function batchRequest($prompts) {$promises = [];foreach ($prompts as $prompt) {$promises[] = $this->client->postAsync('completions', ['json' => ['prompt' => $prompt]]);}$results = Promise\Utils::unwrap($promises);return array_map('json_decode', array_map([$this, 'getBody'], $results));}
| 错误码 | 含义 | 解决方案 |
|---|---|---|
| 401 | 认证失败 | 检查API Key有效性 |
| 429 | 速率限制 | 实现指数退避算法 |
| 500 | 服务异常 | 添加重试机制 |
启用HTTP持久连接:
$client = new Client(['base_uri' => 'https://api.deepseek.com','headers' => [...],'http_errors' => false,'connect_timeout' => 10,'timeout' => 30,'keep_alive' => true]);
实现请求缓存:
function cachedRequest($endpoint, $params, $cacheTime = 300) {$cacheKey = md5($endpoint . json_encode($params));$cacheFile = __DIR__ . '/cache/' . $cacheKey;if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < $cacheTime)) {return json_decode(file_get_contents($cacheFile), true);}$result = $this->client->get($endpoint, ['query' => $params]);file_put_contents($cacheFile, $result->getBody());return json_decode($result->getBody(), true);}
class ChatController extends Controller {public function sendMessage(Request $request) {$userMessage = $request->input('message');$sessionId = $request->input('session_id') ?? uniqid();// 获取上下文$context = $this->getContext($sessionId);$fullPrompt = $this->buildPrompt($context, $userMessage);// 调用DeepSeek$deepseek = new DeepSeekClient(config('services.deepseek.key'));$response = $deepseek->textCompletion($fullPrompt);// 更新上下文$this->updateContext($sessionId, $userMessage, $response['choices'][0]['text']);return response()->json(['reply' => $response['choices'][0]['text'],'session_id' => $sessionId]);}private function buildPrompt($context, $message) {$history = implode("\n", array_map(function($item) {return "用户: {$item['user']}\nAI: {$item['ai']}";}, $context));return "以下是用户与AI的对话历史:\n{$history}\n\n用户新消息:{$message}\nAI应答:";}}
访问控制:
// 中间件示例public function handle($request, Closure $next) {$apiKey = $request->header('X-API-KEY');if (!$apiKey || !in_array($apiKey, config('allowed_keys'))) {abort(403, 'Unauthorized access');}return $next($request);}
日志审计:
$client = new DeepSeekClient(‘test_key’);
try {
$result = $client->textCompletion(“PHP中如何实现快速排序?”);
echo “生成结果:\n” . $result[‘choices’][0][‘text’];
} catch (Exception $e) {
echo “错误:{$e->getMessage()}”;
}
2. 单元测试示例(PHPUnit):```phppublic function testTextCompletion() {$mockClient = $this->createMock(Client::class);$mockClient->method('post')->willReturn(new Response(200, [], json_encode(['choices' => [['text' => '测试响应']]])));$deepseek = new DeepSeekClient('test_key', $mockClient);$result = $deepseek->textCompletion("测试");$this->assertEquals('测试响应', $result['choices'][0]['text']);}
本文完整覆盖了PHP调用DeepSeek API的全流程,从基础环境搭建到高级功能实现,提供了可落地的代码示例和最佳实践建议。开发者可根据实际需求调整参数配置,建议先在测试环境验证后再部署到生产环境。