在网站中的文件下载一般会有2种方式,永久链接和程序动态输出。

  • 静态链接下载的好处是可以通过客户端软件进行断点续传,但是缺点是无法保护程序的安全性,无法控制客户端的权限问题。
  • 程 序动态输出则与静态链接下载刚好相反,可以控制权限的问题,但是无法保证客户端下载断点续传的问题,虽然大部分浏览器也支持动态程序输出文件的断点续传, 但是需要客户端一直保持在有权限的状态下。如果客户端的Session关闭时权限丢失,那么下载就会结束掉,需要重新验证权限并重新开始下载。

下载文件的问题与解决方案

当下载的文件过大,或者网络带宽不够高的情况下,只有静态链接下载才会让下载的用户满意。

但是你不想客户把这个下载的链接地址传播开来,如果你在短时间内把文件名或者目录名改了,又会直接影响到用户的下载。

所以最终我们需要在有限的时间内能满足正在下载的用户,又能修改文件的访问路径。

假设一个2G的文件,下载时间在几个小时到2天的范围内能完成下载。那么我们就应该让最开始下载的那个链接至少保持2天,在第3天的时候删除它,这样我们就想到了数据结构中的队列来解决这个问题,请看下图:

明白这个队列的原理,我们接下来就在不需要数据库的情况下建立一个txt文件来存放3个随机的URL加上一个第四个计算好的URL。然后让这个程序在cronjob的中运行,可以在每天的晚上00:00运行,让队列移动一格。

PHP实现队列

文 件1为存放的队列,queue.txt格式为8个随机字符串是从ABCDEFFGHHIJKLMNOPQRSTUVWXYZ0123456789中随机抽 取的,作为文件的存放目录。目录有一个下划线作为分隔,1代表文件夹存在并有用户在下载,0代表文件夹没有在使用中,将在队列移动时把替换到第一个文件 夹。因为文件夹改变了,文件下载的URL也随之改变了。

下面是这个queue.txt每天的变化情况。

第一天

第二天

第三天

第四天

AAAAAAAA_1

BBBBBBBB_1

CCCCCCCC_1

DDDDDDDD_1

BBBBBBBB_1

CCCCCCCC_1

DDDDDDDD_1

EEEEEEEE_1

CCCCCCCC_1

DDDDDDDD_1

EEEEEEEE_1

FFFFFFFF_1

DDDDDDDD_0

EEEEEEEE_0

FFFFFFFF_0

GGGGGGGG_0

每天自动运行的PHP程序auto_change_folder.php,它的作用是将第四个文件夹替换到第一个文件夹。


<?php$length = 8;$filename = ‘queue.txt’;$root = dirname(__FILE__);$handle = fopen($filename, "r");$folders = $codes = array();while (!feof($handle)) {$buffer = fgets($handle);if ($buffer) {$folder = explode(‘_’, trim($buffer));$folders[] = $folder;$codes[] = $folder[0];}}fclose($handle);$count = 0;$need_folder = $pre_folder = $code = ”;foreach($folders as $k=>$f) {if($f[1] && is_dir($f[0]) && file_exists($f[0].’/file.zip’)) {$count++;}elseif($f[1] && !(is_dir($f[0]) && file_exists($f[0].’/file.zip’))) {unset($folders[$k]);}elseif($f[1] == 0) {$need_folder = $f[0];$folders[$k][1] = 1;break;}}$pre_folder = $folders[$count-1][0];if($count == 3) {$remove_folder = array_shift($folders);echo $remove_folder[0], " ", $pre_folder." ".$need_folder." ";if(@rename($root.’/’.$remove_folder[0], $root.’/’.$need_folder)) {}else {die("Rename folder failed.");}}else {die("Folder not right.");}$alpha = ‘ABCDEFFGHHIJKLMNOPQRSTUVWXYZ0123456789′;$allowed_chars = str_split($alpha);do {for ($i = 0; $i < $length; $i++) {$code .= $allowed_chars[array_rand($allowed_chars)];}} while(in_array($code, $codes));array_push($folders, array($code, 0));$output = ”;foreach($folders as $k=>$f) {$output .= implode(‘_’, $f);if($f[1]) {$output .= "\n";}}file_put_contents($filename, $output);
?>

把这个auto_change_folder.php文件放入cronjob中运行。

0    0    *    *    *    wget -O /dev/null  http://blog.lixiphp.com/files/big/auto_change_folder.php

PHP文件获取最新的文件下载地址

当然静态地址不可能每天都手动去获取,当然要通过PHP自动获取,这样这个地址可以随便显示出来让用户下载。

我们把这个文件命名为auto_download_here.php,当然这个程序要去判断最终目标文件是否存在。


<?php$filename = ‘queue.txt’;$root = dirname(__FILE__);$handle = fopen($filename, "r");$folders = $codes = array();$count = 0;$need_folder = ”;while (!feof($handle)) {$buffer = fgets($handle);if ($buffer) {$folder = explode(‘_’, trim($buffer));if($folder[1] && is_dir($folder[0]) && file_exists($folder[0].’/file.zip’)) {$count++;}elseif($folder[1] && !(is_dir($folder[0]) && file_exists($folder[0].’/file.zip’))) {unset($folder);}elseif($folder[1] == 0) {$need_folder = $f[0];break;}$folders[] = $folder;}}fclose($handle);$pre_folder = $folders[$count-1][0];header("Location: $pre_folder/file.zip");?>

完了,我们进入演示环节吧!

自动下载地址切换下载演示

文件下载地址:http://demo.lixiphp.com/switch_download/auto_download_here.php

每天自动更新程序:http://demo.lixiphp.com/switch_download/auto_change_folder.php

队列查看地址:http://demo.lixiphp.com/switch_download/queue.txt

备注:

  • 如果想更新文件夹长度,可以修改auto_change_folder.php第二行,$length = 8; 默认长度是8;
  • 文件保留天数与队列长度有关;
  • 文件夹丢失后,队列将无法自动运行;
  • 文件夹的权限需要为0777;

转载于:https://www.cnblogs.com/gxldan/p/4066904.html

PHP每天自动更新静态文件下载地址,防盗链相关推荐

  1. linux网线插拔后ip地址丢失,网线拔掉检测,嵌入式网线直连开发板断电网线拔掉之后,上电仍能自动设置static静态ip地址...

    网线拔掉检测,嵌入式网线直连开发板断电网线拔掉之后,上电仍能自动设置静态ip地址 1.首先设置永久固定静态ip地址 luther@gliethttp:~$ sudo vim /etc/network/ ...

  2. GOM引擎登陆器自动更新教程(不会的新手看)

    GOM引擎登陆器自动更新教程(不会的新手看) 每个人的登陆器列表最下方都会有[Upgrade]列表更新段,如下:(没有[Upgrade]的,到配置器文件夹中找"列表例子.txt"里 ...

  3. 烟雨黑帽SEO程序:全自动采集更新静态泛目录程序-反向代理泛目录-权重二级目录

    烟雨黑帽SEO程序:全自动采集更新静态泛目录程序-反向代理泛目录-权重二级目录 烟雨黑帽SEO程序演示:全自动采集新闻自动更新静态泛目录程序-适合反向代理泛目录使用-也适合自己网站根目录下做权重二级目 ...

  4. java防盗链_javaWeb防止恶意登陆或防盗链的使用

    使用场景:明明引用了一个正确的图片地址,但显示出来的却是一个红叉或写有"此图片仅限于***网站用户交流沟通使用"之类的"假图片".用嗅探软件找到了多媒体资源的真 ...

  5. 织梦手机端静态页生成插件带自动更新

    织梦静态页面的好处多多,既有利于抓取收录而且打开速度也比较快,节省服务器CPU的时间,因此许多大型网站也进行静态化.由于dedecmsv5.7sp2版本没有提供手机端移动端网站静态生成的功能,今天分享 ...

  6. 如何屏蔽 iOS 16 软件自动更新,去除更新通知和标记

    如何禁用 iPhone.iPad 软件自动更新.适用于 iOS.iPadOS 和 watchOS,即 iPhone.iPad 和 Apple Watch 通用. 请访问原文链接:https://sys ...

  7. 新建网站提升曝光率设置集合(边使用边更新)(包括:SEO优化,Robots设置,CDN加速,防盗链)

    目前处于边学习边记录的状态,将自己建站中遇到的问题记录下来,以供大家参考,最终效果可以访问我的主页进行查看:alvincr.com Table of Contents 1.1 SEO优化目的(搜索引擎 ...

  8. C# WINFORM的自动更新程序

    自动更新程序AutoUpdate.exe https://git.oschina.net/victor596jm/AutoUpdate.git 1.获取源码 http://git.oschina.ne ...

  9. 客户端程序自动更新(升级)的方式

    from:https://blog.csdn.net/woaitingting1985/article/details/72954652 一.C/S自动更新原理 C/S程序自动升级是一个很重要的功能, ...

  10. 如何制作自动更新程序?

    原文出自:http://blog.csdn.net/metaphysis/article/details/18866631 如何制作自动更新程序? [版权所有 邱秋 2014 metaphysis@y ...

最新文章

  1. 从内部自用到对外服务,配置管理的演进和设计优化实践
  2. mybatis 使用in 查询时报错_使用mybatis的resultMap进行复杂查询 057
  3. [转]调试AngularJS应用
  4. Python入门100题 | 第049题
  5. linux samba安装失败,用aptitude安装samba失败
  6. 西华大学计算机专业怎么样呢,西华大学(专业学位)计算机技术考研难吗
  7. java类全路径简写_[JAVA] JAVA 类路径
  8. Leecode刷题热题HOT100(9)——回文数
  9. 深入了解帆软报表系统的启动过程三
  10. 一个前端博客(9)——浏览器检测和加载
  11. sqlserver备份还原丢失dbo_sqlserver数据库的备份与恢复sql实现
  12. 用Wineskin在Mac上运行exe文件
  13. 小米商城html+css+js全代码
  14. uniapp之安卓文件操作插件
  15. 30天自制操作系统第10天harib07d
  16. The Servers project is closed(Tomcate )
  17. C语言学习(四)字符串和格式化输入/输出
  18. 打车APP为何贴钱做生意?
  19. 访问 Linux 服务器上的文件(以图片为例)
  20. DEV-CPP的安装和使用

热门文章

  1. 解析服务器响应的xml数据包,解析XML/JSON数据
  2. nifi执行linux命令log,shell - 无法使用Nifi curl命令启动处理器 - SO中文参考 - www.soinside.com...
  3. STM32通过定时器捕获的方法驱动(HC-SR04)超声波测距模块
  4. 过程生产excel_通用Excel做销售订单动态展示板
  5. java list 模拟查询_java 模拟简单搜索
  6. 容器技术Docker K8s 40 Serverless Kubernetes(ASK)详解-阿里云弹性容器实例ECI产品概述
  7. 算法:投票Voting
  8. 数据集:各地区化妆品销量、人口数量和人均收入
  9. python Tk()、Frame()、TopLevel()用法
  10. archlinux mysql_在Arch Linux中安装MySQL