当PHP遇见AI:为什么这行得通
\n\n想象一下:您正在用PHP编写代码,突然出现了一位同事,他从不睡觉,不要求薪水,并且可以在几秒钟内为上千种商品生成描述、撰写客户邮件,甚至帮助调试复杂的SQL查询。听起来像科幻小说?其实不然。这就是将ChatGPT集成到PHP项目中的现实。
\n\nPHP长期以来一直是Web领域的“工作马”,但随着AI的到来,它获得了新的生命力。不再需要手动编写大量模板代码——神经网络接管了日常琐事,而您可以专注于架构。在本文中,我们将探讨如何将ChatGPT连接到您的PHP应用程序,并以最实用的方式实现。
\n\n开始前需要准备什么?
\n\n在深入代码之前,请确保您具备以下条件:
\n\n- \n
- PHP 8.0+ — 用于使用现代特性(类型化、属性)。 \n
- cURL — 用于向OpenAI API发送请求。 \n
- OpenAI API密钥 — 在platform.openai.com注册并创建密钥。 \n
- Composer — 用于方便管理依赖项(也可以不使用)。 \n
准备好了吗?开始吧。
\n\n基本连接:向ChatGPT发送第一个请求
\n\n我们从最简单的开始——向ChatGPT发送消息并获取响应。OpenAI使用REST API,因此我们需要一个普通的HTTP请求。以下是一个最小的工作类:
\n\n<?php\n\nclass ChatGPTClient {\n private string $apiKey;\n private string $apiUrl = 'https://api.openai.com/v1/chat/completions';\n\n public function __construct(string $apiKey) {\n $this->apiKey = $apiKey;\n }\n\n public function ask(string $message): string {\n $data = [\n 'model' => 'gpt-3.5-turbo',\n 'messages' => [\n ['role' => 'user', 'content' => $message]\n ],\n 'temperature' => 0.7\n ];\n\n $ch = curl_init($this->apiUrl);\n curl_setopt_array($ch, [\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_POST => true,\n CURLOPT_HTTPHEADER => [\n 'Content-Type: application/json',\n 'Authorization: Bearer ' . $this->apiKey\n ],\n CURLOPT_POSTFIELDS => json_encode($data)\n ]);\n\n $response = curl_exec($ch);\n $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n curl_close($ch);\n\n if ($httpCode !== 200) {\n throw new \\RuntimeException("API error: $httpCode - $response");\n }\n\n $result = json_decode($response, true);\n return $result['choices'][0]['message']['content'] ?? '';\n }\n}\n\n// 使用示例\n$client = new ChatGPTClient('your-api-key-here');\necho $client->ask('为PHP网站写一个简短的问候语');\n\n这段代码是基础。请注意:我们使用gpt-3.5-turbo——它便宜且快速。对于复杂任务,可以切换到gpt-4,但成本更高。
错误处理和限制
\n\n实际项目需要更可靠的处理。在遇到429错误(请求过多)时添加重试和日志记录:
\n\npublic function askWithRetry(string $message, int $maxRetries = 3): string {\n for ($attempt = 1; $attempt <= $maxRetries; $attempt++) {\n try {\n return $this->ask($message);\n } catch (\\RuntimeException $e) {\n if (str_contains($e->getMessage(), '429') && $attempt < $maxRetries) {\n sleep(pow(2, $attempt)); // 指数延迟\n continue;\n }\n throw $e;\n }\n }\n}\n\n高级场景:从内容生成到数据分析
\n\n现在基础已经就绪,让我们看看Cha