PHP 或 js 能否在后台实现自动 CTRL+F5 刷新 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
peesefoo
V2EX    PHP

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

  •  
  •   peesefoo 2017-02-27 16:05:20 +08:00 via Android 4870 次点击
    这是一个创建于 3148 天前的主题,其中的信息可能已经有所发展或是发生改变。
    网站用了 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     Solana     927 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 19:14 PVG 03:14 LAX 12:14 JFK 15:14
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86