[discuz建站技术]
Discuz! X 上传头像到UCenter时自动刷新CDN服务器上的头像缓存
[复制链接]
|
应用场景:为减少源站流量,我们可以永久缓存用户的头像,只在用户上传新头像时,才刷新CDN服务器上的缓存。& m3 a( }' e1 r
4 ` V8 l, h7 r' E" R本文案例中的CDN服务器环境如下,仅供参考:8 Q) M% y) N( j ^6 Y
Nginx,已安装 cache-purge 扩展,通过请求 $host/purge/$uri 的方式清除缓存。所使用的域名与源站一致。. }6 Q! R0 ]5 V$ _$ r- g
: G% c9 X6 B& ~( E: Y0 M$ ~
1、首先在CDN服务器中配置清除规则,将源站服务器IP设置为允许;
9 R2 t2 x4 d" ^0 d5 X/ }% ?* d F* M) T6 K9 _7 A
2、打开 uc_server/data/config.inc.php ,在末尾加入CDN服务器的IP地址,便于统一调用和修改。0 d) a5 J6 P3 X' J2 Q/ s. l' Q
- define('UC_CDNIP', '123.123.123.123');
复制代码 3、打开 uc_server/control/user.php ,添加上传头像后自动清除CDN缓存的功能。1 [: ~5 b y! G/ p/ i7 Q
/ S+ E5 e, m& e I查找:- <p>
- </p><p><span class="Apple-tab-span" style="white-space:pre"> </span>$bigavatarfile = UC_DATADIR.'./avatar/'.$this->get_avatar($uid, 'big', $avatartype);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>$middleavatarfile = UC_DATADIR.'./avatar/'.$this->get_avatar($uid, 'middle', $avatartype);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>$smallavatarfile = UC_DATADIR.'./avatar/'.$this->get_avatar($uid, 'small', $avatartype);</p>
复制代码 替换为:- <p>
- </p><p><span class="Apple-tab-span" style="white-space:pre"> </span>$getavatar_big = $this->get_avatar($uid, 'big', $avatartype);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>$getavatar_middle = $this->get_avatar($uid, 'middle', $avatartype);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>$getavatar_small = $this->get_avatar($uid, 'small', $avatartype);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>$bigavatarfile = UC_DATADIR.'./avatar/'.$getavatar_big;</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>$middleavatarfile = UC_DATADIR.'./avatar/'.$getavatar_middle;</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>$smallavatarfile = UC_DATADIR.'./avatar/'.$getavatar_small;</p>
复制代码 这一步是取得头像路径。接下来查找:
9 Z0 N& n3 _& Z3 p! }6 C) v8 _. O$ u! y8 o' q
- <span class="Apple-tab-span" style="white-space:pre"> </span>return '<?xml version="1.0" ?><root><face success="1"/></root>';
复制代码 在前方加入:- r; O9 _4 ~8 @+ ]* u" k
- <p><span class="Apple-tab-span" style="white-space:pre"> </span>$uccdnip = UC_CDNIP; //在 data/config.inc.php 中设置UC的CDN服务器IP,用于通知刷新头像</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>$avatarurl = 'https://'.$uccdnip.'/purge/data/avatar/';</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>$uchostname = stream_context_create(array('http' => array('header' => 'Host: '.$_SERVER['SERVER_NAME'])));</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_get_contents($avatarurl.$getavatar_big, NULL, $uchostname);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_get_contents($avatarurl.$getavatar_middle, NULL, $uchostname);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_get_contents($avatarurl.$getavatar_small, NULL, $uchostname);</p>
复制代码 上传覆盖即可。# J7 `, k* d5 ]8 p+ t
0 r1 a" |9 k. ^) g) J0 {$ p2 H附:若你要在用户上传头像后点击“完成”时自动刷新头像上传页面,按照以下教程操作:* Z$ l/ r* q# `8 x
在 home/spacecp_avatar.htm 模板中查找:- <p><span class="Apple-tab-span" style="white-space:pre"> </span>if(redirecturl) {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>$('retpre').innerHTML = '<a href="' + redirecturl + '">{lang previous_page}</a>';</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}</p>
复制代码 在其下方新增:- <p><span class="Apple-tab-span" style="white-space:pre"> </span>function updateavatar() { </p><p><span class="Apple-tab-span" style="white-space:pre"> </span>window.location.reload(); </p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}</p>
复制代码 上传并更新缓存即可。* W8 D2 _7 c* N5 Y6 S8 Y
8 F3 N" i9 b, S( ~
: q+ l; y$ I' Q% F# s# U4、管理员清除头像时,同步清除CDN服务器上的头像缓存。' C F+ }) W0 ^0 @: E
, q. B/ X* Q# |7 S/ [打开 uc_server/model/user.php ,查找:# G" u, K. n8 [% U5 w4 [4 N
- <p><span class="Apple-tab-span" style="white-space:pre"> </span>foreach((array)$uidsarr as $uid) {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_exists($avatar_file = UC_DATADIR.'./avatar/'.$this->base->get_avatar($uid, 'big', 'real')) && unlink($avatar_file);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_exists($avatar_file = UC_DATADIR.'./avatar/'.$this->base->get_avatar($uid, 'middle', 'real')) && unlink($avatar_file);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_exists($avatar_file = UC_DATADIR.'./avatar/'.$this->base->get_avatar($uid, 'small', 'real')) && unlink($avatar_file);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_exists($avatar_file = UC_DATADIR.'./avatar/'.$this->base->get_avatar($uid, 'big')) && unlink($avatar_file);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_exists($avatar_file = UC_DATADIR.'./avatar/'.$this->base->get_avatar($uid, 'middle')) && unlink($avatar_file);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_exists($avatar_file = UC_DATADIR.'./avatar/'.$this->base->get_avatar($uid, 'small')) && unlink($avatar_file);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}</p>
复制代码 替换为:' @: v) Z8 f( C: N( ]4 T3 p
5 Y; u; z# @+ w& l5 x3 R
$uccdnip = UC_CDNIP; //在 data/config.inc.php 中设置UC的CDN服务器IP,用于通知刷新头像- <p><span class="Apple-tab-span" style="white-space:pre"> </span>$uchostname = stream_context_create(array('http' => array('header' => 'Host: '.$_SERVER['SERVER_NAME'])));</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>foreach((array)$uidsarr as $uid) {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_exists($avatar_file = UC_DATADIR.'./avatar/'.$this->base->get_avatar($uid, 'big', 'real')) && unlink($avatar_file) && file_get_contents(str_replace(UC_DATADIR.'./','https://'.$uccdnip.'/purge/data/',$avatar_file), NULL, $uchostname);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_exists($avatar_file = UC_DATADIR.'./avatar/'.$this->base->get_avatar($uid, 'middle', 'real')) && unlink($avatar_file) && file_get_contents(str_replace(UC_DATADIR.'./','https://'.$uccdnip.'/purge/data/',$avatar_file), NULL, $uchostname);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_exists($avatar_file = UC_DATADIR.'./avatar/'.$this->base->get_avatar($uid, 'small', 'real')) && unlink($avatar_file) && file_get_contents(str_replace(UC_DATADIR.'./','https://'.$uccdnip.'/purge/data/',$avatar_file), NULL, $uchostname);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_exists($avatar_file = UC_DATADIR.'./avatar/'.$this->base->get_avatar($uid, 'big')) && unlink($avatar_file) && file_get_contents(str_replace(UC_DATADIR.'./','https://'.$uccdnip.'/purge/data/',$avatar_file), NULL, $uchostname);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_exists($avatar_file = UC_DATADIR.'./avatar/'.$this->base->get_avatar($uid, 'middle')) && unlink($avatar_file) && file_get_contents(str_replace(UC_DATADIR.'./','https://'.$uccdnip.'/purge/data/',$avatar_file), NULL, $uchostname);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>file_exists($avatar_file = UC_DATADIR.'./avatar/'.$this->base->get_avatar($uid, 'small')) && unlink($avatar_file) && file_get_contents(str_replace(UC_DATADIR.'./','https://'.$uccdnip.'/purge/data/',$avatar_file), NULL, $uchostname);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}</p>
复制代码 上传覆盖即可。' s( T3 z" p/ G
- E% {& E ?, r |
|