文章目录

  因为下学期老师实验室项目的需要,这个暑假在家恶补了一下PHP,每天六七个小时的视频看的我头晕眼花。还好讲课的韩老师讲的很有趣,要不然估计早弃掉了。学到一半的时候突然觉得应该学以致用,找点东西练练手,然后很自然的想到了曾经大一时候弄过的乐享项目,也是PHP的,基于phpdisk修改而来。

  如果是奔着七牛云部分来的,可以直接跳到最后的第五点。

  其中有一些零零散散的升级,例如对mydisk.php的修改,原来是登录后跳转到学术E盘的上传界面(即每个人独立的私人空间),后来感觉每个人上传到自己单独的空间太麻烦了。于是我直接就把这块给砍掉了,现在登录后直接跳转到分好类的几十个公共上传界面,选择相应的上传目的父类即可,十分简洁明了。

  第二个较为直观的升级点是对主页随机band的动态化修改。当初进行乐享项目开发的时候还是一个啥都不懂的大一小朋友,只会一些基础的html、css,PHP什么的完全不懂,所以为了实现首页随机band条的效果只好用最笨的html+js控制的方法,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!-- saved from url=(0042)http://www.gdutlx.com/wb/index_random.html -->
<HTML><HEAD>
<META content="text/html; charset=utf-8" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 8.00.6001.18702"></HEAD>
<BODY topMargin=0 bgColor=#D0FFD0>
<CENTER>
<DIV id=adpic>
<IMG style="DISPLAY: none" src="index_random_files/10.gif">
<IMG style="DISPLAY: none" src="index_random_files/18.gif">
<IMG style="DISPLAY: none" src="index_random_files/23.gif">
<IMG style="DISPLAY: none" src="index_random_files/26.gif">
<IMG style="DISPLAY: none" src="index_random_files/27.gif"> </DIV>
<SCRIPT language=JavaScript type=text/javascript>
<!--
function runad()
{
var ads=document.getElementById("adpic").getElementsByTagName("img")
for(var i=0,adsc=ads.length;i<adsc;i++)
{
ads[i].style.display='none';
}
ads[parseInt(Math.random()*ads.length)].style.display='';
}
function run()
{
//广告执行函数
runad();
}
window.onload=run
//-->
</SCRIPT>
</CENTER>

<!-- <p><embed width="1" height="1" src="http://www.xiami.com/widget/61405_2121966,_1_1_FF8719_494949_1/multiPlayer.swf" type="application/x-shockwave-flash" wmode="transparent" allowscriptaccess="never" /></p>
//-->

</BODY></HTML>

  这样做有一个极为致命的缺点,即所有的随机图片都需要先下载到本地,再由js进行控制随机显示哪一个,这样就导致即使在随机库很小的情况下(如本例中只有5个图片)加载也会出现一到两秒的滞后,更别说如果想增加更多的图片了。结果这个困扰了我很久的问题在我学习PHP的第二天讲到数学函数的时候我就想到了完美的解决方法。各位大概已经猜到了,是的,random函数。先规则化的命名所有图片,例如从1到20,然后随机产生一个1到20之间的整数,最后拼接完成最终的图片路径再echo即可,so easy,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
</HEAD>
<BODY topMargin=0 bgColor=#D0FFD0>
<CENTER>
<DIV id=adpic>

<?php
$randId=rand(1,18);
$img = 'self_add/index_random_files/'.$randId.'.gif';
echo '<img src="'.$img.'" alt="hytcshare" />';
?>

</DIV>

</CENTER>
<!--注释部分是虾米音乐的代码-->
<!--<p><embed width="1" height="1" src="http://www.xiami.com/widget/61405_2121966,_1_1_FF8719_494949_1/multiPlayer.swf" type="application/x-shockwave-flash" wmode="transparent" allowscriptaccess="never" /></p>
-->
</BODY></HTML>

  由于每个图片单独都很小,至多100k,所以首页展现速度大大提升,基本做到了秒开的地步,堪称完美。

  第三个升级的小点是对登录后主界面的个人信息展示进行了修改,增加了个人积分显示这一项,同时直接计算出能下载的文件数目,并且用红色高亮来突出,具体效果如下:

  (当然这么多积分是拿来测试的啦),当然改起来也很简单,在首页的tpl模板文件中相对应的位置添加这样一段即可:

1
2
<li>邮箱地址: <?=$pd_email?></li>	
<li>剩余积分: <span class="txtred"><strong><?=$myinfo[credit]?></strong></span> (可下载<?echo round($myinfo[credit]/2)?>个文件)</li></br>

  第四个升级的点是修改了一下用户激活的业务逻辑,原来的乐享未激活只是无法上传文件,下载不受影响,本来也是出于好意。哪想到有人发现了这一点,所以注册的时候随便瞎填一个邮箱,也不激活,直接下载完注册送的10个积分便重新注册新的账号,严重违反了游戏规则。不得以只好修改了逻辑规则,现在新注册的用户必须完成邮箱激活后才能进行正常的下载与上传。如图所示:

 
  改动也不大,只需要在原来的显示下载文件详情页面的pd_viewfile.tpl.php页面中相应的位置增加如下的判断代码即可:

1
2
3
4
5
6
7
<?php if($settings['login_down_file'] && !$pd_uid && $file['userid']){ ?>
<span class="file_login"><?=$L['file_down_tips']?></span>
<?php }elseif(!$pd_is_activated){echo '未激活同学无法下载文件,要先进行激活操作哦。';
echo ' <a href="account.php?action=active"><span class="txtred">点我激活</span></a>';
}
elseif(!$file['is_checked'] && $pd_gid<>1){ ?>...
`

  此外还对下载界面的提示信息进行了更为友好的改动,如下所示:

  第五点即是本文的重点,利用七牛云的免费云存储实现资料的云端化。本来乐享的资料是上传到本地服务器的,这样一来随着网站运行时间的增加,越来越多的同学把资料上传到了网站上面,网站的非程序性空间占用越来越大,随之而来的是对主机空间的要求也越来越高。而站长我穷的要死,弄一个香港的独立IP已经是极限了,这样下去维持个一年半载的也不是个办法,因此能否利用七牛云认证账户免费的10GB存储空间和每月10GB流量来优化乐享现有的构架呢?答案是肯定的,而且实现起来也不难。首先我不打算开放普通用户将文件上传到我的七牛云空间的权限,所以改版计划和最终完成的都是由我进行审核与上传,普通的用户还是走原来的通道。

  为了实现与原来的操作模式相分离,一定会需要对数据库的pdfile表进行操作,我对该表增加了一个is_cloud字段,默认为0表示非云文件,值为1则表示是云化的文件。由于没有改动原上传文件的逻辑,因此普通用户上传的时候写入数据库数据时is_cloud字段由于没有赋值所以默认为0即对原来的逻辑没有任何影响。由我筛选整理后将文件上传到七牛云,然后将对应的记录设为1,为了简化操作,我在后台单独写了一个管理页面,操作也很简单,即对选中的文件记录进行更新pdfile表is_cloud字段置为1的操作。完成数据库的操作后,再对download.php进行少许的改动即可,首先是从数据库中取出is_cloud字段的值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$is_cloud = $rs['is_cloud'];
if(!$is_cloud){
//...原来的普通构建header方式的常规下载方式
}else{
//七牛云部分
$url="http://xxxxxx.xxx.xx.xxx.xxxxx.com/";//hytcshare七牛云对应的路径前缀(每个人都不同的,可以到自己的七牛云平台上查看)(这里不方便透漏)
$abbr="XXXXX-";//文件前缀(如果有的话)(这里不方便透露)
//获取文件真实的文件名
$qiniu_url=urlencode(iconv('GBK', 'UTF-8', $file_name));//数据库传过来的是gbk字符集,这里需要的是utf-8,所以要把gbk转为utf-8
//由于七牛云支持http直接请求,所以只需要拼接完地址后直接跳转即可完成下载
header("Location: ".$url.$abbr.$qiniu_url);
exit;
}
`

  大功告成!附上前后空间占用的对比图:

  原来:

  现在:

  妈妈再也不用担心我买不起大空间主机啦,♪(^∇^*)!


如果觉得文章很有趣或对你带来了帮助,欢迎请我喝杯咖啡哦~

文章目录