
我用PHP写代码已经超过20年了。我看过它被宣布“已死”至少十几次。而每一次它都继续支撑着越来越多的互联网。所以当AI开始进入项目需求时我没有转向Python。我没有购买某个工作流构建器的席位也没有去上什么课程。我只是打开现有的代码库写了一个服务然后发起一个API调用。就这样。这就是全部的解锁。你不需要花哨的GUI或复杂的系统。没有人质疑的假设Python主宰了AI领域。每个人都知道这一点。如果你正在训练模型、构建研究管道或从事任何数据科学相关的工作Python就是正确的工具。这点无需争辩。但大多数团队没有问的是你真的在训练模型吗还是只是在调用API这两者是完全不同的问题。而如今大多数企业构建“AI功能”时做的都是后者。他们向Claude、GPT或Gemini发送提示然后用响应做些有用的事。这就是一个REST调用。REST调用是语言无关的。而PHP早在大多数AI初创公司出现之前就已经在做REST调用了。最适合工作的工具通常就是已经在生产环境中运行的那个。你已经拥有了整个技术栈根据W3Techs的数据PHP驱动了超过71%已知服务器端编程语言的网站。仅WordPress就占据了整个互联网的42%。再加上Laravel、Symfony、Magento、Craft CMS以及数千个自定义代码库你就知道生产环境的Web软件实际在哪里了。注我还记得PHP刚出来的时候那时我正淹没在Perl里从那以后我就一直坚持用PHP对于CMS网站我多年前从WordPress开始后来有所迁移。但像AI Engine超过80,000个活跃安装完整MCP服务器支持内置Claude和GPT集成这样的插件以及Automattic的AI Building Blocks计划推出的官方WordPress MCP Adapter正在把WordPress变成一个真正的Agentic平台。很难忽视。而生产环境的Web软件正是AI Agent需要运行的地方。AI行业不会告诉你的是大多数“Agent”其实就是老派的服务。真的。去掉营销包装一个典型的AI Agent就是一个接受输入、调用外部API、应用一些逻辑并返回输出的类。我们从2000年代早期就开始写这类东西了。Agentic包装器在上面添加了规划、记忆和工具调用。这是真实的也很重要。但底层模式对于任何在MVC框架中工作过的人来说并不陌生。想想Agent在应用层实际做什么它从数据库读取数据调用外部API处理表单提交触发Webhook队列任务写回存储并返回响应。PHP已经做了这些30年。你的认证系统已经在那里你的数据库连接已经在那里你的业务逻辑已经在那里。那么为什么要为你的PHP应用旁边启动一个Python微服务在进程边界复制数据上下文并引入一个全新的运行时来维护就只是为了向LLM发一个HTTP请求呢其实我知道原因。因为所有教程都展示Python。因为LangChain是Python的。因为AI讨论主要发生在被机器学习工程师主导的平台上而他们很少接触日常的内容管理系统。过度设计的的问题我见过团队用AWS Bedrock来总结一个支持工单。我见过n8n工作流用了14个节点来完成本质上就是一个带条件逻辑的API调用。Make.com是连接SaaS应用的无代码神器但它不是在你已经掌控的生产PHP应用中嵌入AI功能的正确答案。这些平台存在是有理由的。但它们解决的是不同的问题。当你没有后端团队、只想粘合第三方服务时或者你在Node/React栈上、JS是主要语言时不是我的世界但它在那儿工作得很好它们很有意义。但当你是一个PHP开发者能写出下面代码时它们就不合适了代码语言javascriptAI代码解释$client new \GuzzleHttp\Client(); $response $client-post(https://api.anthropic.com/v1/messages, [ headers [ x-api-key $_ENV[ANTHROPIC_API_KEY], anthropic-version 2023-06-01, // 必需的header告诉API使用哪个响应模式 content-type application/json, ], json [ model claude-haiku-4-5-20251001, max_tokens 1024, messages [ [role user, content Your prompt here!] ], ], ]); $data json_decode($response-getBody(), true); $reply $data[content][0][text];当然这只是一个API调用不是Agent。但它也是一个可工作的Claude集成。没有平台。没有月费席位。没有新基础设施。用Composer、Guzzle、一个API密钥你就上线了。生产环境中还需要加上错误处理、速率限制感知和重试逻辑但这在任何语言中都一样而且都不需要新技术栈。复杂度是需要赚取的。大多数基于Web的Agent用例并不值得引入那么多复杂度。那么API调用和真正的Agent有什么区别API调用等待响应并返回它。Agent会决定下一步做什么、调用工具、检查自己的输出并循环直到任务完成。上面的Guzzle片段是一个坚实的基础。真正改变的是什么PHP为此做好准备不仅仅是因为REST调用。语言本身已经显著进化了。PHP 8.x引入了Fiber、类型化属性、命名参数、match表达式和枚举。Fiber支持单进程内的协作式调度这很有用但不是真正并发的替代方案。对于并行的Agent任务通过Supervisor或Redis支持的队列Worker是实际的答案而这个模式在PHP中已经非常成熟。最重要的是这一切都不需要改变你的技术栈。一个标准的LEMP设置就能轻松处理LLM API调用、队列Agent任务和Webhook驱动的工作流。这就是目前运行大多数生产PHP Web的同一栈对于大多数Agentic用例来说已经绰绰有余。如果你想更进一步FrankenPHP和RoadRunner都提供了长生命周期Worker模式能消除每个请求的启动开销这对持久的Agent循环很重要。但这是一个优化而不是前提。先构建Agent。如果工作负载需要再优化运行时很少需要。还有MCP。Anthropic的Model Context Protocol现在已被捐赠给Linux基金会在Agentic AI Foundation下由PHP Foundation维护的官方PHP SDK。它通过SSE或HTTP工作能将你的PHP应用的工具原生暴露给任何支持MCP的AI客户端。这意味着PHP应用可以原生地向AI系统暴露工具而不需要Python包装器或中间层。PHP的Agent生态系统那么目前实际的PHP AI工具生态是什么样的Neuron AI是PHP领域最成熟的专用Agent框架。由Inspector.dev团队构建它提供了Agent基类、工具调用、RAG支持、多Agent编排和内置监控。它能在Laravel、Symfony、WordPress和轻量PHP框架上工作而不会强制框架绑定。以下是模式一个带工具的Agent类。工具正是让它区别于普通API调用的地方——由Agent决定何时调用而不是你的代码代码语言javascriptAI代码解释namespace App\Neuron; use NeuronAI\Agent\Agent; use NeuronAI\Agent\SystemPrompt; use NeuronAI\Chat\Messages\UserMessage; use NeuronAI\Providers\AIProviderInterface; use NeuronAI\Providers\Anthropic\Anthropic; use NeuronAI\Tools\PropertyType; use NeuronAI\Tools\Tool; use NeuronAI\Tools\ToolProperty; class FitnessAgent extends Agent { protectedfunction provider(): AIProviderInterface { returnnew Anthropic( key: $_ENV[ANTHROPIC_API_KEY], model: claude-haiku-4-5-20251001, ); } protectedfunction instructions(): string { return (string) new SystemPrompt( background: [You are a knowledgeable fitness assistant.], steps: [Use available tools to look up workout plans before answering questions about them.], output: [Give clear, practical guidance based on the workout data returned.] ); } protectedfunction tools(): array { return [ Tool::make(get_workout, Look up a workout plan by name or muscle group.) -addProperty( new ToolProperty( name: workout_name, type: PropertyType::STRING, description: The name or muscle group of the workout to retrieve., required: true ) ) -setCallable(function (string $workout_name) { // Your existing workout DB or API call here $pdo new \PDO($_ENV[DB_DSN], $_ENV[DB_USER], $_ENV[DB_PASS]); $stmt $pdo-prepare(SELECT exercises, sets, reps FROM workouts WHERE name ?); $stmt-execute([$workout_name]); $row $stmt-fetch(\PDO::FETCH_ASSOC); return $row ? json_encode($row) : Workout not found.; }), ]; } } $reply FitnessAgent::make() -chat(new UserMessage(How many sets should I do for a beginner chest workout?)) -getMessage() -getContent(); echo $reply;Agent接收问题判断需要get_workout工具用提取出的肌肉群或计划名称调用它然后将结果融入响应中。完全不需要你手动连接逻辑。这就是从API包装器到Agent的转变。除了Neuron生态系统发展迅速。LLPhant提供了LangChain风格的方法。Prism作为Laravel项目的干净、提供者无关的接口正在获得关注。Symfony AI为Symfony生态带来了原生集成。值得注意的是这些都不需要重量级框架。Slim、Flight、F3、Phalcon和CodeIgniter等轻量PHP框架也能以最小开销干净地接入Agent服务。如果你的栈本来就很轻量添加Agent层也不会改变这一点。PHP中的RAG比你想象的简单检索增强生成RAG听起来很吓人。其实不然。其核心就是四个步骤切分内容、生成嵌入、检索最相关的块并注入到提示中。Qdrant、Pinecone和Weaviate等向量数据库都暴露HTTP API。PHP能调用HTTP API。所以这样就行代码语言javascriptAI代码解释$openAiClient OpenAI::client($_ENV[OPENAI_API_KEY]); $guzzle new \GuzzleHttp\Client(); $userQuery $_POST[question] ?? ; // 1. 通过OpenAI生成嵌入 $embedding $openAiClient-embeddings()-create([ model text-embedding-3-small, input $userQuery, ])-embeddings[0]-embedding; // 2. 查询Qdrant获取最近邻 $results $guzzle-post(http://qdrant:6333/collections/docs/points/search, [ json [ vector $embedding, limit 5, with_payload true, ], ]); // 3. 将检索到的上下文注入提示 $hits json_decode($results-getBody(), true)[result]; $chunks array_map(fn($hit) $hit[payload][text], $hits); $context implode(\n\n, $chunks); $prompt Answer using this context:\n\n{$context}\n\nQuestion: {$userQuery};不需要Python。不需要编排层。只需HTTP和一点管道代码。Python的王国PHP的领地我想明确一点这篇文章不是在争论PHP应该取代Python在AI中的位置。这不是重点。Python在模型训练、ML研究、数据科学管道、以及任何涉及笔记本和数值计算的领域完胜。无可争议。该用Python就用Python。但PHP的领地是生产Web层。而生产Web层正是大多数AI Agent实际会花费时间的地方CRM、仪表盘、电商平台、CMS系统、管理面板和业务工作流工具中。这一层已经是PHP的了。Agent也应该如此。无脑选择的情况我为医疗、法律、制造和电商等领域的客户构建过生产系统。添加AI功能时反复出现的挑战不是能力而是上下文。你的Agent需要访问已认证的用户会话、数据库模式、业务规则和缓存层。把这一切转移到外部Python服务不仅仅是开销还是技术债务隐患。PHP让Agent留在应用内部它该在的地方。上下文已经在那里。认证已经在那里。你维护多年的部署管道已经在那里。而且坦白说大部分互联网也都在那里。