thinkphp中需用多agent并行处理复杂任务,配置websocket通信、声明参与者白名单、按trait/基类/运行时三法隔离职责,构建dag依赖图并启用结果汇聚,由runner自动调度并行worker实现容错执行。

在ThinkPHP项目中处理需多角色协同的复杂任务(如自动生成报告+同步数据库+发送通知+生成PDF),必须避免单Agent串行执行导致的超时、内存溢出与错误不可追溯问题。
配置多Agent通信通道
进入app/agent/config.php,添加WebSocket协议支持配置:
将'protocol' => 'http'改为'protocol' => 'websocket',并补全'participants'数组,列出所有将参与协作的Agent类名,例如['PlannerAgent', 'DataAgent', 'NotifyAgent', 'PdfAgent']。
【必须显式声明参与者白名单】否则系统默认只允许本地调用,跨Agent消息会被静默丢弃,且无日志提示。
定义Agent角色与职责边界
方法一:基于Trait分离能力
在app/agent/trait/下创建DataFetching.php和NotificationDispatch.php两个Trait,分别封装数据库查询逻辑与邮件/短信发送逻辑,禁止在同一个Agent类中同时引入这两个Trait。
方法二:继承专用基类
新建app/agent/base/ExecutionAgent.php(专注调用工具)与app/agent/base/ReviewAgent.php(专注校验输出),所有具体Agent必须且只能继承其一。
方法三:运行时强制隔离
在app/agent/common.php中注册全局钩子:think\Hook::add('agent.before_invoke', function($params) { if (class_basename($params['agent']) === 'PlannerAgent') { throw_if(app()->isWorker(), 'PlannerAgent禁止在Worker进程内执行'); });
构建任务依赖图(DAG)
第一步:在app/agent/task/ReportGenerationTask.php中定义节点
使用think\agent\DagBuilder实例化图结构,依次调用addNode('fetch_data', DataAgent::class)→addNode('generate_report', ReportAgent::class)→addNode('send_notify', NotifyAgent::class)→addNode('export_pdf', PdfAgent::class)。
第二步:声明执行约束
调用addEdge('fetch_data', 'generate_report')和addEdge('generate_report', 'send_notify');对export_pdf节点,调用addEdge('generate_report', 'export_pdf')并设置setParallel(true)——该节点将与send_notify并行启动,但二者都依赖generate_report完成。
第三步:启用结果汇聚
在DagBuilder实例上调用enableMerge(['send_notify' => 'notify_status', 'export_pdf' => 'pdf_path']),确保最终返回的数组包含这两个键,不加此行则并行分支结果会被丢弃。
启动并行执行引擎
在控制器中调用:$result = (new \think\agent\Runner())->run(new ReportGenerationTask());
这一步会自动检测DAG中可并行节点,启动独立Worker进程执行send_notify与export_pdf,主进程等待二者全部返回后合并结果。
若某分支执行超时(默认30秒),Runner将终止该Worker并标记status: 'failed',但不影响其他分支继续运行——这是串行调用无法实现的容错能力。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











