devin进度监控需通过http长轮询或sse消费其外部api流,php须用curl或socket逐块接收、按\n\n分割事件、提取并清洗data字段后json解析,同时处理超时、重连、事件类型及前端协同。

Devin进度监控不是PHP原生能力,得靠HTTP长轮询或SSE模拟
PHP本身没有内置的“Devin进度监控”机制——Devin是AI编程代理(如Cognition Labs推出的工具),它执行任务时会通过HTTP接口暴露实时日志流。PHP端若想接入其进度,只能作为客户端去消费这些流,而不是在PHP里“实现”一个Devin。
常见错误是试图用 exec() 启动Devin CLI后直接读取stdout,结果卡死或漏掉早期日志,因为Devin输出是非阻塞、分块、带事件标记的JSON流(类似{"event":"step_start","data":{"step":"installing_deps"}})。
- 必须用
stream_socket_client()或curl_init()配合CURLOPT_WRITEFUNCTION逐块接收,不能依赖file_get_contents() - Devin的进度接口通常要求
Accept: text/event-stream,PHP cURL需显式设置,否则返回406 - 响应头含
Cache-Control: no-cache和Connection: keep-alive,PHP端要禁用cURL的自动重定向和缓存(CURLOPT_FOLLOWLOCATION = false,CURLOPT_CACHE_TIMEOUT = 0)
解析Devin的SSE响应时,别直接json_decode整行
Devin返回的SSE流格式是标准的 event: log\n data: {...}\n\n,但它的 data 字段值可能跨多行(比如堆栈跟踪),也可能包含未转义换行符。直接对每行做 json_decode(trim($line)) 会失败。
正确做法是按双换行(\n\n)切分事件块,再提取 data: 后的内容,最后用 json_decode(str_replace("\n", "", $raw_data), true) 清洗后再解析。
- 示例关键片段:
$buf = '';<br>curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) use (&$buf) {<br> $buf .= $data;<br> $parts = explode("\n\n", $buf);<br> $buf = array_pop($parts); // 保留不完整块<br> foreach ($parts as $part) {<br> if (preg_match('/^data:\s*(.+)$/m', $part, $m)) {<br> $json = json_decode(str_replace("\n", "", $m[1]), true);<br> if ($json && isset($json['event'])) {<br> echo "Step: {$json['event']}\n";<br> }<br> }<br> }<br> return strlen($data);<br>}); - 注意:Devin有时会在同一事件中发多个
data:行(比如拆分大日志),需合并所有匹配到的data:内容再解析
超时与重连必须自己管,Devin不会等PHP
Devin任务可能持续数分钟,而PHP默认的 max_execution_time 是30秒,default_socket_timeout 通常为60秒。一旦超时,连接断开,PHP进程终止,进度就永远丢失。
- 用
set_time_limit(0)解除脚本时间限制,但别忘了用户浏览器端也有超时(Nginx默认60秒,需调proxy_read_timeout) - Devin接口不保证永久可用,需在断连后按指数退避重试(如1s → 2s → 4s),并记录最后成功接收的
id(如果SSE带id:字段)用于断点续传 - 不要在CLI模式下长期运行PHP监听——它无法优雅处理SIGTERM;更适合用短生命周期请求+前端轮询状态API(如
/api/task/{id}/status)替代长连接
真实场景中,90%的“进度卡住”其实是Devin没发事件,不是PHP问题
Devin在某些步骤(例如等待用户确认、下载大依赖、触发外部CI)期间可能长达几十秒不推送任何SSE事件。这时候PHP端还在等,但实际是Devin那边静默了。
与其反复检查PHP代码,不如先验证Devin是否真在发数据:用 curl -N https://api.devin.ai/v0/tasks/xxx/stream 直接看原始流。如果终端也卡住,说明是Devin侧行为,不是PHP解析逻辑的问题。
容易被忽略的是Devin的 event 类型并不只有 step_start / step_end,还有 human_input_required、timeout、error —— 这些事件决定了你是否该停止等待、弹窗提示或切换回人工流程。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











