在一天内构建了一个可自行托管的 Plausible + Sentry 替代方案

发布: (2026年2月28日 GMT+8 05:29)
3 分钟阅读
原文: Dev.to

Source: Dev.to

它的功能

在你的网站上放置一个 script 标签:

从此你即可获得:

  • 页面浏览量、会话、唯一访客、跳出率
  • 国家 / 地区 / 城市分布(使用本地 MaxMind GeoLite2 —— 无运行时 API 调用)
  • 设备、操作系统、浏览器分布
  • 引荐来源分类 —— 自然搜索、社交、邮件、推荐、直接访问
  • UTM 活动追踪
  • JavaScript 错误自动捕获(window.onerrorunhandledrejection),按指纹分组
  • 通过单个 HTTP 调用从任意后端手动上报错误
  • 审计日志
  • 带点击分析的短链追踪

所有数据均写入 你自己的数据库。没有任何信息会离开你的服务器。

形成一切的约束

共享主机意味着 没有 Redis、没有后台工作进程、没有守护进程、没有 WebSocket。你只能使用 PHP 和 MySQL。这迫使我们做出了一些有趣的决策。

在没有 Redis 的情况下实现限流

大多数限流器使用 Redis 或带时间戳的数据库表。我采用了基于文件的方式——为每个请求创建一个仅追加的 .req 文件,存放在按 IP 划分的目录中。统计最近的请求数 = 统计窗口内更新的文件数量。

// Count recent attempts — each file is one request
foreach (glob($userDir . "/*.req") as $file) {
    if ($now - filemtime($file)   

(code snippet as provided)

如果你使用共享主机、想运行一个注重隐私的产品,或只是厌倦了为可以自行拥有的工具付费——不妨试一试。欢迎提交 Issue 和 Pull Request。

路线图(v2)

  • 错误告警的 Webhook
  • Redis 缓存(可选)
  • 异步队列

如果你对哪些功能最重要有想法,请打开 Issue 进行讨论。

0 浏览
Back to Blog

相关文章

阅读更多 »

精通SQL连接和窗口函数

介绍:SQL 连接用于基于相关列合并两个或多个表中的行,而窗口函数在一组行上执行计算,……