V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
peesefoo
V2EX  ›  PHP

PHP 或 js 能否在后台实现自动 CTRL+F5 刷新

  •  
  •   peesefoo · 2017-02-27 16:05:20 +08:00 via Android · 4522 次点击
    这是一个创建于 2832 天前的主题,其中的信息可能已经有所发展或是发生改变。
    网站用了 cdn 服务,要刷新指定链接的缓存,有两种方式,一个是登录他们的后台,输入链接提交刷新;一个是在浏览器中打开页面,然后按 CTRL + F5 来刷新缓存。
    这两种方式不管怎么说都要手动,想知道是否可以通过 php 或什么方式自动执行 js 来自动刷新缓存,在发布文章等操作后自动刷新页面缓存。
    由于cdn网站登录框使用了验证码,php直接登录后台提交链接的方式不可行。
    第 1 条附言  ·  2017-02-27 19:08:34 +08:00
    是 html 页面的刷新缓存哦,不是 js , css ,图片等静态内容。目前准备尝试发送一个 no-cache 的 http 请求试试。
    第 2 条附言  ·  2017-02-27 19:13:00 +08:00
    缓存机制是,只要不过期,页面内容缓存到 cdn 服务器后就不会再读取源站。如果源站页面内容更改后,要么等 cdn 缓存过期后从源站抓取,要么使用上面说的那两种方式刷新缓存,通知 cdn 服务器从源站抓取新内容,替换 cdn 服务器上缓存的旧内容。
    31 条回复    2017-02-27 23:34:50 +08:00
    jarlyyn
        1
    jarlyyn  
       2017-02-27 16:07:36 +08:00
    一般不都是链接后面加个时间戳吗?
    jarlyyn
        2
    jarlyyn  
       2017-02-27 16:08:04 +08:00
    如果是要通知 cdn 清缓存。
    应该是调用 api
    peesefoo
        3
    peesefoo  
    OP
       2017-02-27 16:08:59 +08:00 via Android
    @jarlyyn 加时间戳就直接回源了
    peesefoo
        4
    peesefoo  
    OP
       2017-02-27 16:09:29 +08:00 via Android
    并不提供 api
    jarlyyn
        5
    jarlyyn  
       2017-02-27 16:11:32 +08:00
    @peesefoo

    我的意思是加更新的时间戳啊,不是说当前的。

    我的理解你不就是要能够控制回源吗?
    batnss
        6
    batnss  
       2017-02-27 16:13:25 +08:00 via Android
    模拟登入 输入链接 刷 手工版 api
    oott123
        7
    oott123  
       2017-02-27 16:14:52 +08:00
    浏览器按 Ctrl+F5 本质上就是发 HTTP 请求
    所以你把那个 HTTP 请求抓出来自己用 php 发就好了
    jarlyyn
        8
    jarlyyn  
       2017-02-27 16:19:12 +08:00
    @peesefoo

    如果觉得加时间戳太 low 或者不方便,那加个 md5 hash?
    peesefoo
        9
    peesefoo  
    OP
       2017-02-27 16:30:40 +08:00 via Android
    @jarlyyn 目的是通知 cdn ,源站内容已更新,请速来抓取最新内容,替换 cdn 服务器上旧的内容。访客访问到的是缓存在 cdn 上的内容。加时间戳的是不缓存的,失去 cdn 的作用。
    humxman
        10
    humxman  
       2017-02-27 16:34:53 +08:00 via Android
    Ctrl+F5 这个是无缓存重新请求, Curl 按标准 http 请求带上有效登录 cookie 就行。
    peesefoo
        11
    peesefoo  
    OP
       2017-02-27 16:38:33 +08:00 via Android
    @humxman 这个可以,试试
    zi
        12
    zi  
       2017-02-27 16:59:56 +08:00
    @peesefoo #9 加修改那一刻的时间戳,而不是实时时间戳,这样 CDN 也就回源一次,实现你想要的效果
    yangweijie
        13
    yangweijie  
       2017-02-27 17:00:54 +08:00
    location.reload(true)
    anyforever
        14
    anyforever  
       2017-02-27 17:11:53 +08:00
    你要更新的是整个页面,还是单个图片或者 JS 文件?
    整个页面最好走 CDN 的接口通知更新缓存
    单个图片或者 JS ,直接在文件名后变换尾巴就好了。
    binux
        15
    binux  
       2017-02-27 17:15:08 +08:00 via Android
    CTRL-F5 怎么可能能刷新 CDN 缓存?难道每个新用户访问都会导致 CDN 重新缓存吗,那要他何用?
    langmoe
        16
    langmoe  
       2017-02-27 17:16:05 +08:00
    等等, ctrl+F5 能把 cdn 的缓存也刷了?那要是有个用户按着 ctrl+F5 不撒手你家 cdn 的缓存功能不直接失效了
    jianzhiyao020
        17
    jianzhiyao020  
       2017-02-27 17:31:57 +08:00
    可以用 console ?直接执行脚本
    Zzzzzzzzz
        18
    Zzzzzzzzz  
       2017-02-27 17:35:28 +08:00
    ctrl+F5
    wenzichel
        19
    wenzichel  
       2017-02-27 17:35:46 +08:00
    1. 在你修改完上传到 cdn 后,修改页面中引用该静态资源后面的时间戳,只在你修改文件时才改时间戳
    2. 将上传的每个静态资源都进行 hash 命名,然后替换页面中的静态资源路径
    Zzzzzzzzz
        20
    Zzzzzzzzz  
       2017-02-27 17:36:13 +08:00
    (自动回了, 接上)清的是本地浏览器缓存, 正规点的 CDN 服务应该有 purge 的 API 吧
    xialdj
        21
    xialdj  
       2017-02-27 17:36:49 +08:00 via iPhone
    输入链接提交的时候 把请求抓下来 然后自己模拟这个请求
    GoBeyond
        22
    GoBeyond  
       2017-02-27 18:16:51 +08:00 via Android
    我觉得你的解决思路有问题
    你的意思是,前面的 CDN 缓存了后端渲染的 html ?
    这样的话我感觉真的思路有问题
    页面 html 缓存的实现,按照我的理解,应该在后端进行而不是交给前面的 cdn ,不然肯定一堆麻烦
    当页面发生更新之后,通知在后端的缓存逻辑清除缓存,当有新的请求时载入页面至缓存,这样或许比较好吧

    我也是新萌,如果哪里说的有问题希望其他大牛不吝赐教
    smallpath
        23
    smallpath  
       2017-02-27 18:21:45 +08:00
    缓存资源名中包含 hash (不能是链接后缀形式,必须是文件名中),改了 hash 自己就刷新了。
    lhbc
        24
    lhbc  
       2017-02-27 18:27:17 +08:00 via iPhone
    CDN 一般会忽略请求头的 no-cache
    正确方法是改变 arg
    zhoushiya
        25
    zhoushiya  
       2017-02-27 18:57:54 +08:00 via Android
    我觉得楼主的意思是他把静态页存到了 cdn ,然后更新内容了。需要刷新 cdn 的缓存…
    zhidian
        26
    zhidian  
       2017-02-27 19:20:32 +08:00
    "一个是登录他们的后台,输入链接提交刷新;一个是在浏览器中打开页面,然后按 CTRL + F5 来刷新缓存" 这两个不一样啊……前面那个确实刷新了(延后生效),后面那个……就啥也没干。
    peesefoo
        27
    peesefoo  
    OP
       2017-02-27 19:26:07 +08:00 via Android
    @zhidian 实际上这个 cdn 支持 ctrl +f5 来刷新 cdn 服务器上的缓存
    xieranmaya
        28
    xieranmaya  
       2017-02-27 23:03:24 +08:00
    dangyuluo
        29
    dangyuluo  
       2017-02-27 23:11:18 +08:00
    我以前的解决办法是,加截取后三位的时间戳, math.round(timestamp/1000)*1000
    dangyuluo
        30
    dangyuluo  
       2017-02-27 23:14:18 +08:00
    你也可以这么做(丧心病狂一点),以野狗为例,每个文章页面都发起一个 websocket 到野狗惟一对应的文档。你在后台更新文档后,用 php sdk 向野狗的该文档发送一个时间戳。然后所有前台浏览中的页面会收到这个 ws 消息,然后用 HTML5 API 刷新带时间戳的页面就可以。因为你有新的时间戳了, CDN 也默认回源。
    当其他用户打开这个页面的时候,发现时间戳和最新版本是匹配的,就不用再刷新了。
    lecher
        31
    lecher  
       2017-02-27 23:34:50 +08:00 via Android   ❤️ 1
    这个问题更像是管理缓存机制的策略。
    最优策略肯定是利用 CDN 自带的刷新缓存服务去通知各地 CDN 缓存服务器刷新,这才是百分百有效的刷新缓存页面机制。
    联系 CDN 服务商,要求开有鉴权主动刷新缓存的 API ,避免验证码这种诡异的请求数量限制。
    如果 CDN 节点不支持主动刷新缓存,最好是改缓存策略,只用 CDN 缓存带 hash 标注的静态文件和几乎不会再修改的 HTML 页面。需要更新的 HTML 界面的请求带宽由服务器来抗。只传输 HTML 界面的代码带宽消耗已经很小了,可以通过多开服务器分摊流量负载。至于页面数据解析和请求数据库的负载,可以考虑用 Redis 按 URL 整体打包缓存。

    在后台模拟强制刷新网页的请求属于歪门邪道,那样顶天了只能刷新服务器所在地区的缓存。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2533 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 01:23 · PVG 09:23 · LAX 17:23 · JFK 20:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.