PHP 8.3 不具备原生 AI 函数调用能力,需通过 HTTP/Sdk 调用外部 AI 服务,解析模型返回的 tool_calls,按白名单安全执行本地 PHP 工具函数,并回传结果完成协同。

PHP 8.3 本身不提供原生的“AI函数调用”或“工具调度”能力——它没有内置 AI 模型、推理引擎,也不定义 ai_call() 或 dispatch_tool() 这类函数。所谓“在 PHP 中实现 AI 函数调用与工具调度”,实际是指:使用 PHP 作为服务端胶水语言,通过 HTTP(如 REST/gRPC)或 SDK 调用外部 AI 服务(如 OpenAI、Ollama、Llama.cpp API、自建 vLLM 服务等),并根据大模型返回的结构化工具调用请求(例如 OpenAI 的 tool_calls 数组),解析后动态执行本地 PHP 函数(即“工具”),再将结果回传给模型完成多步协同。
理解 AI 工具调用的核心流程
主流大模型(如 GPT-4o、Claude、Qwen、DeepSeek)支持“function calling”或“tool use”模式:模型输出不是纯文本,而是 JSON 格式的工具调用指令,例如:
{
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\": \"Beijing\"}"
}
}
]
}
PHP 的任务是:接收该响应 → 解析 tool_calls → 映射到对应 PHP 函数 → 安全执行 → 组织结果 → 发送回模型(或返回给前端)。
手动实现工具注册与安全调度
不依赖框架时,可自行构建轻量调度器。关键点是避免直接 call_user_func 执行任意函数,需白名单 + 参数校验:
立即学习“PHP免费学习笔记(深入)”;
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 定义工具数组,明确函数名、参数规则、是否允许调用
- 使用
json_decode($args, true)解析参数,并用filter_var或validateInput()做类型/范围检查 - 用
in_array($name, $allowed_tools, true)强制白名单控制 - 捕获异常,不暴露内部错误信息给模型或用户
示例工具注册:
$tools = [
'get_weather' => [
'handler' => fn(array $params) => [
'temperature' => rand(15, 30),
'unit' => 'C',
'city' => $params['city'] ?? 'Unknown'
],
'parameters' => ['city' => 'string']
],
'search_news' => [
'handler' => fn(array $params) => array_slice(
file('/path/to/news.json'), 0, 3
),
'parameters' => ['query' => 'string', 'limit' => 'int']
]
];
对接 OpenAI / Anthropic 等标准 API
发送请求时需在 messages 中包含 tools 描述(OpenAPI 格式),并设置 tool_choice 为 "auto" 或指定工具名。PHP 使用 curl 或 guzzlehttp/guzzle 发起调用:
-
注意 Content-Type:必须为
application/json,且 body 是 UTF-8 编码 JSON -
处理流式响应:PHP 8.3 支持
stream_context_create配合fopen处理 SSE 流,但多数工具调用走非流式,先取完整响应再解析更稳妥 - 验证 tool_call.id 唯一性:同一轮可能有多个调用,需按 id 匹配结果回填
收到含 tool_calls 的响应后,遍历执行并构造 tool_result 消息数组,再发第二轮请求(带上原始消息 + 工具调用结果)。
推荐实践:用现有库降低复杂度
避免从零造轮子。可选用:
-
laravel-ai(兼容 PHP 8.3):提供
Tool抽象类、自动注册、参数绑定,适合 Laravel 项目 - php-llm(开源轻量库):专注工具调用协议解析与分发,无框架依赖,支持 OpenAI/Claude/Mistral 格式
- 自建 API 网关层:用 PHP 写 FastCGI 或 Swoole HTTP 服务,把工具逻辑封装为内网 HTTP 接口,PHP 主程序只做路由和鉴权,提升安全性与可维护性
无论哪种方式,核心原则不变:模型负责“决策调什么”,PHP 负责“安全、可控、可审计地执行”。


















