乐于分享
好东西不私藏

让 AI 先认路,再干活

让 AI 先认路,再干活

让 AI 先认路,再干活

⚡ 核心观点

大项目里,Agent 不是不努力,而是缺少项目地图、跨会话记忆和时序知识图谱这三类上下文基础设施。

你有没有过这种让人抓狂的瞬间?

好不容易接手了一个有点年头或者有点规模的项目,你满怀期待地用文件管理器把根目录一打开,好家伙,里面密密麻麻塞了几百个文件。这里面有存放源代码的 src 文件夹,有写说明文档的 docs 文件夹,有各种自动化运行的 scripts 脚本,有乱七八糟的 SQL 数据库文件,有看着就头大的各种配置文件。在角落里,可能还躺着几份不知谁写的 PDF 需求文档、几张模糊的界面截图,外加一堆散落的 Markdown 笔记。

面对这么个大杂烩,你深吸一口气,打开了 Hermes(一种 AI 编程助理工具),把这个项目丢给它,满怀希望地指令它:帮我理一理这个项目的整体结构和逻辑脉络。

接下来,你盯着屏幕,看着 Hermes 确实非常卖力地在干活。它老老实实地去读了其中的几个代码文件,搜了你给的几个关键词,还在终端里跑了几条查看目录的命令。表面上看,它忙得不亦乐乎,似乎很努力。

但当你看到它最终输出的结论时,那股无名火可能直接就窜上了脑门。

问题到底出在哪呢?

它确实知道某个具体文件的存在,但你要问它这个文件到底管哪块业务,它就哑火了。它就像个在迷宫里乱撞的无头苍蝇,明明手里捏着关键的代码文件,却两眼一抹黑,完全不知道这个文件在整个项目的业务版图里到底占着什么坑位,跟哪个模块有关联。

它看着倒是能看懂某一个具体函数里面的内部逻辑,比如这段代码是怎么把数据倒腾过来的。可你一旦问它,这个函数跟数据库里的某张表、跟配置文件里的某个参数项、跟对外的接口到底是怎么串在一起的?它立马就断片了。它缺乏把不同层级、不同类型文件缝合起来的能力。

更气人的是,它光顾着读根目录下那份粗制滥造的 README 文件,却完全漏掉了 docs 文件夹里那份写得清清楚楚、更详细的系统架构描述文档。因为它压根就没建立起“粗略介绍”和“详细文档”之间的从属关联。

这还不是最让人绝望的。最让人崩溃的是那种“跨会话失忆症”。

你昨天下午在这个会话里,费了九牛二虎之力,连哄带骗地跟 Hermes 解释清楚了为什么要用一种极其冷门的设计决策,把历史包袱和业务考量掰开了揉碎了对它讲。你们俩还一起花了两个小时死磕一个隐蔽的报错,终于摸出了一条能跑通的复杂命令序列,确认了一个库的特定版本选择。

今天早上你元气满满地打开 Hermes,新建了一个会话,准备接着昨天的进度大干一场。结果你一开口,它就像个昨天刚入职、今天完全失忆的新人一样,把昨天问过的问题原封不动地再抛给你。昨天调通的命令、深思熟虑的选型原因、走过的排查路径,在新会话里全清零了。你感觉自己的血压瞬间飙升。

说句公道话,这真不能全怪 Hermes。你现在用的所有 Agent 工具,只要你在干活前没给它把“项目结构认知”和“跨会话记忆”这两件事安排明白,它注定会陷入这种“每天上班第一件事就是重新带新人”的死循环。

好在 GitHub 上早就有人看不下去了,专门搞了几个开源项目来治这些痛点。它们不帮你写哪怕一行具体的业务代码,它们只干一件事:在 AI 写代码之前,先帮它认路,帮它记事。

咱们今天就掰开揉碎了讲清楚这三个项目:graphify(专门画项目地图的)、agentmemory(专门管跨会话记忆的)、graphiti(专门搞时序知识图谱的)。咱们不看那些虚头巴脑的原理,直接上干货:它们到底能解决啥麻烦、在 Hermes 里怎么接、第一次上手该按什么顺序点鼠标敲键盘,以及那些前人踩过的坑,你怎么才能避开。


一、graphify:别让 AI 瞎找,先给它塞张地图

graphify 这个工具,名字听起来挺玄乎,但干的事儿极其直白。你只要在有 AI 编程助理的终端里敲一行指令,它就能把你当前文件夹里的代码、文档、PDF、图片,甚至视频文件,像过筛子一样全部扫一遍,最后给你吐出一个可以随时查询的知识图谱。

你在你的项目目录下吭哧吭哧跑完 graphify 之后,它会老老实实在你的目录里生成一个叫 graphify-out 的文件夹。点开一看,里面躺着三个宝贝:

第一个,是个叫 graph.html 的文件。别犹豫,直接用浏览器打开它。你会看到一张铺天盖地的网状图,黑色的背景上分布着大量蓝色的光点,呈散布状,整体是那种充满科技感的点阵式信息图。这可不是死图,它是可以交互的。你能拿鼠标去点那些节点看详情,也能直接在上面搜关键词。那些原本藏在层层叠叠文件夹底下的复杂关联,瞬间就变成了你眼前这张看得见摸得着的网。

第二个,是个叫 GRAPH_REPORT.md 的文件。如果你嫌看图太晕,这份纯文本报告就是为你准备的。graphify 已经替你把图里的重点全扒出来了:这个项目里最核心的几个节点是啥、它分析出哪些八竿子打不着的模块居然有暗道相连、基于这张图它建议你先搞清楚哪五个问题。你要是想快速摸清项目底细,直接啃这份报告,效率最高。

第三个,是个叫 graph.json 的文件。这是整张图谱的底层数据,全是 JSON 格式。这东西不是给人看的,是留给 Agent 工具以后反复去查询、去跑数据的口子。

为了让你有点直观感受,说个真事儿。有人在自己工作区里跑了一回 graphify,这人胆子也大,把所有工作区的文档全扔进去扫了,结果差点被坑死(后面会细说这个坑)。那次扫描的盘子有多大呢?14,247 个文件,粗略算下来有 1.6 亿个词。

面对这么个庞然大物,graphify 最后硬是生成了 90,688 个节点、100,210 条边,还顺手划出了 14,775 个“社区”。

稍微解释一下这几个数字。节点就是图上的点,代表一个文件或者一个关键概念;边就是连着点的线,代表它们俩有关系,比如 A 调用了 B;社区就是一大团关系铁得不行的节点抱团,在项目里通常就意味着这是一个独立的功能模块。

在这 100,210 条关系里,有 99% 被打上了“提取到的关系”(EXTRACTED)的标签。这说明啥?说明这些关系是 graphify 直接从代码语法或者文档字面中明确读取出来的铁证。只有 1% 被标成了“推断的”(INFERRED),这是工具根据上下文猜测出来的潜在关联。另外,报告里还明明白白列出了整个项目里连接最密集的几个“上帝节点”,也就是被最多文件依赖的核心骨干,还有那些让人直呼意外的跨模块连接。

跑完这一趟,你再看那个项目文件夹,感觉完全变了。它不再是一堆让你头皮发麻的目录树,而是一张清清楚楚的卫星地图。哪块是核心枢纽,哪两块之间有暗道,哪里可能断了链路,一目了然。

为什么说它跟 Hermes 是绝配?

你得知道 Hermes 这类工具的脾气。它最擅长的就是“执行动作”:读个文件、搜个词、跑个命令、写两行代码。但在大项目面前,它最缺的就是“先抬头看路”的意识。

你一上来就指着代码让 Hermes 改,它只能像个无头苍蝇一样,搜到 A 改两行,发现不对又去搜 B,绕一大圈不说,还极容易改出新的 bug 来。

老手是怎么玩的?先用 graphify 闷头把 GRAPH_REPORT.md 这份报告生成出来。然后,把这份报告直接扔给 Hermes,当成它的项目上下文。等 Hermes 把这份报告读透了,对项目的骨架心里有数了,你再向它开炮。

你可以直接这样给 Hermes 下指令:

“请先阅读 graphify-out/GRAPH_REPORT.md 文件。在读完之前,不准动项目里的任何文件。读完之后,告诉我这个项目里最核心的模块是哪几个、最关键的连接关系是什么,还有你建议我优先搞明白的 5 个问题。”

等 Hermes 啃完这份报告,你接下来的提问就可以非常刁钻了。比如你问:“这个系统的登录流程到底串了哪几个文件?”“我要是改了权限校验的逻辑,会炸掉哪些周边模块?”“数据库里的这个配置项,到底被上层的哪些代码引用了?”

有了 graphify 给的地图打底,Hermes 回答这些问题的时候,就能做到指哪打哪,直接顺着图谱的线把文件路径和逻辑链条给你拽出来,再也不用去海里捞针了。

到底怎么装?手把手教你

安装这步,有个能让人栽跟头的坑。这个项目挂在 Python 的包管理平台 PyPI 上,它的安装包名字叫 graphifyy,注意看,结尾是两个字母 y。但是,等它装完,你在命令行里要敲的工具名,却叫 graphify,结尾只有一个 y。人家 README 里都专门红字提醒了:其他名字带 graphify 前缀的包,全都不属于这个项目,别装错。

最省心、最不容易扯皮的安装方式是用 uv 这个工具。打开终端,敲进去这行:

class="language-text">uv tool install graphifyy && graphify install

这行命令的意思是,先用 uv 把那个双 y 的包装上,装完立马顺势执行单 y 的初始化命令。你电脑上得有 Python 3.10 或者更高版本才行。虽然你非要用传统的 pipx 或者 pip 也能装,但处理依赖的时候容易搞出一堆幺蛾子,听我的,用 uv 最省心。

基础工具装妥了,你还得给它把 Hermes 平台的特定支持装上,敲的还是这行:

class="language-text">uv tool install graphifyy && graphify install

这些前置动作都搞定了,真正的硬菜就来了。在终端里,用 cd 命令溜达进你的项目目录。然后在 Hermes 给你的终端交互界面里,敲下这行带斜杠的指令:

class="language-text">/graphify .

那个 / 是 Hermes 用来识别插件指令的暗号,graphify 是工具名,后面跟着一个空格和一个英文句号 .,意思就是告诉工具:“把当前目录以及它底下的所有子目录,全给我扫一遍。”

一个极其特殊的系统坑

这里要插一句,如果你用的电脑是 Windows 系统,并且你用的是 PowerShell 终端,那你千万要注意了。在 PowerShell 的逻辑里,开头的那个 / 会被它强行当成路径的分隔符去理解,这就会导致指令报错。遇到这种情况,别慌,直接把开头的斜杠去掉,老老实实敲 graphify . 就行,Hermes 照样能认出来。

前人踩过的坑,你别再踩

第一,管住手,别一上来就扫全盘。大项目第一次跑,花个几分钟甚至几十分钟都很正常,这取决于你项目里文件的多少和类型。千万、千万别像前面提到的那位老兄一样,脑子一热把所有工作区都塞进去扫。1.6 亿词跑出来的那个图谱,大得吓人。你自己用浏览器打开那个 html 文件,鼠标拖一下卡半天的那种卡。更要命的是,你让 Hermes 去读那个巨大的 json 文件,它能把你留给它的模型额度瞬间榨干,甚至直接超时死掉。正确的做法是,它需要看哪个项目,你就只针对那个项目文件夹跑指令,按需分配。

第二,跑之前,先写个“黑名单”。在项目根目录下,老老实实建一个名叫 .graphifyignore 的文本文件。逻辑跟 .gitignore 一模一样。你得把那些对理解架构毫无帮助、或者碰了会出事的目录全拦在门外。比如前端的 node_modules/(这里面动辄几万个文件,全是别人的代码)、编译输出的 dist/build/、缓存目录 .cache/、乱七八糟的 *.log 日志、还有存着数据库密码的 .env 文件。做好这一步,既省钱又省时间。

第三,摸清它的隐私底线。这事儿很重要。graphify 在处理不同文件的时候,是两套截然不同的规矩。碰到代码文件,它是用 tree-sitter 这种本地语法解析器,直接在你自己电脑上咔咔切,代码绝对不会漏到外网去。但是,碰到文档、PDF、图片或者视频,因为它得懂里面的意思,这些内容提取出来后,是会被打包发给大模型 API 去处理的。虽然 graphify 自己拍着胸脯说没有遥测、没有追踪,但如果你扫的文件夹里夹杂着客户的隐私数据、公司的财务报表、或者还没公布的商业机密,你在敲回车键之前,千万确保这些东西已经写进 .graphifyignore 里被干掉了。


二、agentmemory:给 AI 配个随身带笔记本的跟班

graphify 把“项目长啥样”这个问题给结了,但还有一个让人每天上班都想撞墙的问题没解决,那就是时间线上的记忆断裂。

你想象一下这个画面:今天下午,你跟 Hermes 配合得天衣无缝。你手把手教了它你们团队那套独一无二的代码规范;你们俩在一个恶心的 bug 面前死磕了两小时,终于摸出了一条能跑通的复杂命令序列;你们还反复对比,最终拍板在当前环境下必须死守某个第三方库的旧版本。

第二天早上,你新建了一个会话,刚提了个相关的需求,Hermes 立马露出了清澈而愚蠢的眼神。昨天教的规范?忘了。昨天踩的坑?不知道,准备再踩一次。昨天拍板的版本?想不起来了,问你行不行。

agentmemory 就是来终结这种悲剧的。

你可以把它想象成一个安安静静坐在 Hermes 身后的记录员。Hermes 在前面冲锋陷阵,它在后面眼疾手快地把 Agent 做了哪些关键操作全给逮住,然后把这些乱七八糟的过程压缩、提炼成有条理的结构化记忆片段,死死存在你电脑本地的索引文件里。

这还不算完。等你明天开新会话,提出新任务的时候,agentmemory 不会干坐着。它会用一种叫“混合搜索”的技术,去本地的记忆库里扒拉,琢磨“眼下这个活儿,得把过去的哪些老底翻出来才够用”。一旦找对了,它就神不知鬼不觉地把这些历史经验塞进 Hermes 的当前会话里。

别觉得这是个玩具,它的工程底子相当硬。1,067 个测试用例,全绿通过。最近更新的 v0.9.21 版本里,一口气修了 9 个烦人的 bug。更关键的是,它的代码库里已经写好了专门对接 Hermes 的插件钩子(编号 PR #486),而且在 Hermes 官方的 GitHub 仓库里,也挂着一个正经的集成提案(编号 Issue #6715)。这说明啥?说明这俩工具走到一起,是正儿八经的官方级别的牵手,不是野路子。

实际怎么装?怎么用?

它是个 Node.js 环境下的工具,装起来不费劲。终端里敲一行:

class="language-text">npm install -g agentmemory

全局装好之后,你别急着用,得去翻 agentmemory 官方文档里关于 Hermes 插件的那一页。照着上面的说明,把本地端口的对接参数填好,让 Hermes 知道上哪儿去存记忆、上哪儿去取记忆。

配好之后,你该怎么用 Hermes 还是怎么用。它会自己在后台把你们达成的关键决策、踩过的坑、跑通的命令记在小本本上。等你下次再让它干类似的活,它直接掏出昨天的笔记接着干,你连嘴都不用动。

这就等于把“每天重新带新人”的苦差事,硬生生拔高到了“老员工每天打卡上班,先翻翻昨天的工作日志”的境界。

用之前,这两个坑得看清

第一,隐私这块你把心放肚子里。所有的记忆都是在你自己电脑硬盘上,谁也拿不走。但有个坑你得留神:它找记忆找得准不准,全看你给它配的“嵌入模型”行不行。如果你贪图省事配了个能力很弱的轻量级模型,它在茫茫记忆海里捞东西的时候就会经常捞偏,搜索精度会大打折扣。你要是发现它新会话里调出来的经验总是驴唇不对马嘴,别怀疑,八成是嵌入模型拉了胯,换个猛点的试试。

第二,别让它干超出能力范围的事。它只记“Agent 过去干了啥”,它不管“项目架构是啥”。你想让它代替 graphify 去梳理项目结构,那是白日做梦。

所以,真正懂行的人都是把它俩凑一对用:graphify 负责把项目的静态骨架摸清楚(管地图),agentmemory 负责把你们俩的动态协作过程记下来(管日记)。一静一动,才是完美的闭环。

事实上,graphify 那边的人也早就盯上这块了,在他们的仓库里有个讨论帖(编号 Issue #152),就在琢磨怎么把这俩玩意儿焊死在一块。以后要是实现了,agentmemory 就能直接啃 graphify 吐出来的 graph.json,把“项目长啥样”和“这几天干了啥”彻底打通。


三、graphiti:当你的项目需要一本“编年史”

前面那两位,一个管空间的静态结构,一个管时间的操作记忆。graphify 管“现在长啥样”,agentmemory 管“过去干了啥”。

但有些较真的场景下,这两位也抓瞎。假如你的 Agent 需要搞清楚“某个事实到底是哪天变的、当初是谁定的、现在还靠不靠谱”——比如你让 Agent 死盯着一个产品的定价逻辑,这定价三天两头改;或者你要维护一份随着政策天天变的知识库。这时候,知识不是死的水,是活的流。

对付这种活,就得请 graphiti 这种“时序知识图谱”出山了。

这是 Zep 公司开源的一个上下文图谱引擎。它最狠的地方在于,它搞的图谱是“带时间轴”的。普通的图谱只说 A 认识 B。graphiti 不光说 A 认识 B,它还要在这条关系上刻上时间戳,记录这俩人是哪年哪月认识的有关系,哪年哪月又闹掰了关系变了,这消息到底是从哪个渠道听来的。

它底下撑着两张台子:FalkorDB 和 Neo4j,这两个都是专门的图数据库后端。前阵子它刚把 MCP Server 1.0 给放出来了,号称已经有“数十万周活用户”在用。有了这个版本,它能顺滑地插到 Claude Desktop、Cursor 或者任何支持 MCP 协议的 Agent 工具上。

这玩意儿怎么接到 Hermes 上?

它走的是 MCP 协议这条路。你得先在自己机器上把 graphiti 的 MCP server 搭起来,还得把 FalkorDB 或者 Neo4j 这类图数据库给部署好。这俩搞定了,把参数填进 Hermes 的 MCP 配置文件里。配通之后,Hermes 就能直接去你的时序图谱里读写数据了。

这东西适合啥场景?团队好几个人要共享一套不断更新的业务知识库;维护一个要搞很多年的大项目,得记清楚架构是怎么一步步演变过来的;或者你们公司合规要求严,上面要查“AI 得出这个结论的来龙去脉是什么”,你得能拿出带时间戳的证据。

新手听一句劝:这玩意儿很重,别乱碰

graphiti 比前面那两位重太多了。重在哪?重在部署成本。它死活离不开图数据库后端。对于很多平时只写写业务代码、连数据库都没怎么碰过的人来说,从零开始装一个 Neo4j,那简直是噩梦级别的体验,对新手来说部署成本不低。

你如果只是想解决“让 Hermes 记住我昨天敲的命令”这种简单需求,agentmemory 随便装装就能跑,又轻又快。你非要去折腾 graphiti,那就是杀鸡用牛刀,把自己累个半死不说,还容易半途而废。

只有你真真切切地感觉到,你需要“记录某项知识随着时间演进的完整链条”时——比如你要做一个长期跟踪研究的 Agent,或者维护一个会随时变化的庞大知识库——你才值得去花时间啃 graphiti。


四、别瞎选,按这个顺序来

这三个工具都摆在面前了,作为 Hermes 的用户,到底该怎么安排引进的顺序?这里给一个极其务实的阶梯策略:

如果你刚用 Agent 不久,或者平时就搞搞个人项目,别犹豫,死磕 graphify 就对了。光把项目地图建起来,让 Hermes 干活前先看图,这第一步带来的爽感是最强烈的,也是最能立刻见到回头钱的。

如果你已经是个重度依赖 Agent 的老油条,每天都离不开它了,那就在 graphify 的基础上,把 agentmemory 加上。项目地图加上会话记忆,这套组合拳打出来,日常开发中那些恶心的重复沟通成本基本就绝迹了。

只有当你的段位到了团队共享知识、维护长线大项目,或者确实需要去审计知识来源的时候,你才去考虑 graphiti。它难伺候,但对于特定的高阶场景,它确实稳如老狗。

如果你在脑子里把这三个工具画个图,大概是这样的:graphify 旁边配着一张项目地图,它的任务是帮你全局认路;agentmemory 旁边配着一个笔记本,它的任务是帮你做短期记忆、减少重复劳动;graphiti 旁边则配着一个透明的圆柱体(像是一个庞大的长期知识库容器),它的任务是处理时序演进。

它们之间没有高低之分,只有层次和时机的区别。核心的使用原则和流程永远是:先认路,再记事,最后如果真有需要,再做时序图谱。

配置好之后的日常,应该是这样的

第一步,你接手或者打开一个项目,别急着下需求。先在终端里敲 /graphify .,去倒杯水,等它把 GRAPH_REPORT.md 吐出来。

第二步,打开 Hermes,给它下死命令,先去读报告。在这个阶段,不管你多急,都忍住别提改代码的事。等它把对项目核心模块和关键连接的理解给你摆到台面上。

第三步,开始正常干活,让它改代码、跑命令。这时候 agentmemory 在后台默默记下你们踩过的坑和拍板的决策。

第四步,第二天开新会话,直接提新需求。Hermes 会自动翻出昨天的笔记,你们无缝衔接,不用再费唾沫星子讲背景。


💡 最小上手路线

先用 graphify 建项目地图;重度使用 Agent 后再接 agentmemory;只有需要追踪知识演进和来源时,才上 graphiti。

五、别光看,现在就动手试一把

这三个项目在 GitHub 上全都是开源的,看看那 Star 数——50.5k、11.9k、20k+,这可不是什么没人要的试验品,是成千上万开发者在真实项目里摸爬滚打验证过的。

别被前面的话吓到,真要上手体验,门槛其实极低。照着下面这套最小路线走:

class="language-text">"color:#6a9955"># 1. 安装 graphify,给项目画地图(死死记住,装的是双y的包)
uv tool install graphifyy && graphify install
"color:#6a9955"># 装上 Hermes 平台支持
graphify install --platform hermes

"color:#6a9955"># 2. 进到你的项目目录,开扫
cd your-project
/graphify .

等它跑完,你就进 Hermes,把这段话丢给它:

“请先阅读 graphify-out/GRAPH_REPORT.md 文件。不要修改文件。先告诉我这个项目里最核心的模块、最关键的连接关系、以及你建议我优先了解的 5 个问题。”

等它答完,你顺着图谱问它几个文件关联的问题,感受一下那种指哪打哪的顺畅感。

如果你觉得地图好使,想进一步加上记忆,接着敲:

class="language-text">"color:#6a9955"># 3. 装 agentmemory,给 Hermes 配个记忆层
npm install -g agentmemory
"color:#6a9955"># 然后去翻官方文档里的 Hermes 插件页,按说明把本地对接配好

别光收藏这篇文章。现在就挑一个你手头上正在搞的、文件稍微多点、结构稍微乱点的文件夹,照着上面的步骤跑一遍。你自己去看那份生成的报告,然后让 Hermes 沿着图谱的结构回答你几个关系型的问题。

你大概只需要花十分钟的时间,就能彻底明白:让 Agent 先认路、再干活,这件事一点都不难,但它能把你从无休止的重复解释里彻底解脱出来。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-27 19:04:21 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/667797.html
  2. 运行时间 : 0.103497s [ 吞吐率:9.66req/s ] 内存消耗:4,760.89kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=fe6173819283e9ef239e13152df33761
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000631s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000898s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000367s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000260s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000480s ]
  6. SELECT * FROM `set` [ RunTime:0.000196s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000581s ]
  8. SELECT * FROM `article` WHERE `id` = 667797 LIMIT 1 [ RunTime:0.000649s ]
  9. UPDATE `article` SET `lasttime` = 1779879861 WHERE `id` = 667797 [ RunTime:0.001202s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000233s ]
  11. SELECT * FROM `article` WHERE `id` < 667797 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000425s ]
  12. SELECT * FROM `article` WHERE `id` > 667797 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000378s ]
  13. SELECT * FROM `article` WHERE `id` < 667797 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000731s ]
  14. SELECT * FROM `article` WHERE `id` < 667797 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000777s ]
  15. SELECT * FROM `article` WHERE `id` < 667797 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000667s ]
0.107441s