peesefoo
V2EX  ›  PHP

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

  •  
  •   peesefoo · Feb 27, 2017 via Android · 5212 views
    This topic created in 3387 days ago, the information mentioned may be changed or developed.
    网站用了 cdn 服务,要刷新指定链接的缓存,有两种方式,一个是登录他们的后台,输入链接提交刷新;一个是在浏览器中打开页面,然后按 CTRL + F5 来刷新缓存。
    这两种方式不管怎么说都要手动,想知道是否可以通过 php 或什么方式自动执行 js 来自动刷新缓存,在发布文章等操作后自动刷新页面缓存。
    由于cdn网站登录框使用了验证码,php直接登录后台提交链接的方式不可行。
    Supplement 1  ·  Feb 27, 2017
    是 html 页面的刷新缓存哦,不是 js , css ,图片等静态内容。目前准备尝试发送一个 no-cache 的 http 请求试试。
    Supplement 2  ·  Feb 27, 2017
    缓存机制是,只要不过期,页面内容缓存到 cdn 服务器后就不会再读取源站。如果源站页面内容更改后,要么等 cdn 缓存过期后从源站抓取,要么使用上面说的那两种方式刷新缓存,通知 cdn 服务器从源站抓取新内容,替换 cdn 服务器上缓存的旧内容。
    31 replies    2017-02-27 23:34:50 +08:00
    jarlyyn
        1
    jarlyyn  
       Feb 27, 2017
    一般不都是链接后面加个时间戳吗?
    jarlyyn
        2
    jarlyyn  
       Feb 27, 2017
    如果是要通知 cdn 清缓存。
    应该是调用 api
    peesefoo
        3
    peesefoo  
    OP
       Feb 27, 2017 via Android
    @jarlyyn 加时间戳就直接回源了
    peesefoo
        4
    peesefoo  
    OP
       Feb 27, 2017 via Android
    并不提供 api
    jarlyyn
        5
    jarlyyn  
       Feb 27, 2017
    @peesefoo

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

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

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

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

    在后台模拟强制刷新网页的请求属于歪门邪道,那样顶天了只能刷新服务器所在地区的缓存。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2678 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 93ms · UTC 10:34 · PVG 18:34 · LAX 03:34 · JFK 06:34
    ♥ Do have faith in what you're doing.