php文件下载(可限制下载速度)实现代码

 更新时间:2016年11月25日 16:26  点击:2235
在php中文件下载会利用到header fopen fread三个主要函数,同时还有一些辅助函数如判断文件存在file_exists is_file等函数,下面我们来看一款文件下载可以限制下载速度实例

*/
$file = "test.mp3"; // file to be send to the client
$speed = 8.5; // 8,5 kb/s download rate limit
if(file_exists($file) && is_file($file)) {
   header("cache-control: private");
   header("content-type: application/octet-stream");
   header("content-length: ".filesize($file));
   header("content-disposition: filename=$file" . "%20");
   flush();
   $fd = fopen($file, "r");
    while(!feof($fd)) {
          echo fread($fd, round($speed*1024));
       flush();
       sleep(1);
    }
   fclose ($fd);
}

/*
flush
flush函数 刷新php程序的缓冲 实现echo动态输出
本函数实现的结果是页面不断地显示echo输出 的数据
for ($i=10; $i>0; $i--)
{
echo $i.'<br />';
ob_flush();
flush();
sleep(1);
}
ob_end_flush();

sleep
sleep() 函数延迟代码执行若干秒。
header
header() 函数向客户端发送原始的 http 报头。

认识到一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数(在 php 4 以及更高的版本中,您可以使用输出缓存来解决此问题):


filesize 获取文件大小
fread 读取由fopen打开的文件内容

下面是一个php缓存文件实现类,根据我的经验,缓存文件是根据用户设置的时间与文件生成的日间以及当前时间进行比较,然后再判断是否需要重新生成缓存文件。*/

class pagecache {

 /**
  * @var string $file 缓存文件地址
  * @access public
  */
 public $file;
 
 /**
  * @var int $cachetime 缓存时间
  * @access public
  */
 public $cachetime = 3600;
 
 /**
  * 构造函数
  * @param string $file 缓存文件地址
  * @param int $cachetime 缓存时间
     */
 function __construct($file, $cachetime = 3600) {
  $this->file = $file;
  $this->cachetime = $cachetime;
 }
 
 /**
  * 取缓存内容
  * @param bool 是否直接输出,true直接转到缓存页,false返回缓存内容
  * @return mixed
     */
 public function get($output = true) {
  if (is_file($this->file) && (time()-filemtime($this->file))<=$this->cachetime && !$_get['nocache']) {
   if ($output) {
    header('location:' . $this->file);
    exit;
   } else {
    return file_get_contents($this->file);
   }
  } else {
   return false;
  }
 }
 
 /**
  * 设置缓存内容
  * @param $content 内容html字符串
     */
 public function set($content) {
  $fp = fopen($this->file, 'w');
  fwrite($fp, $content);
  fclose($fp);
 }
}

serialize — 产生一个可存储的值的表示
unserialize — 从已存储的表示中创建 php教程 的值

想要将已序列化的字符串变回 php 的值,可使用 unserialize()。serialize() 可处理除了 resource 之外的任何类型。甚至可以 serialize() 那些包含了指向其自身引用的数组。你正 serialize() 的数组/对象中的引用也将被存储。

*/
serialize

//store data:
$array = explode('rn', $string);
$serialized = serialize($array);

//restore data:
$array = unserialize($serialized);
$text = implode('rn', $array);


unserialize
function restorepost() {
    if (isset($_post[savepost])) {
        $_post = unserialize(strips教程lashes(htmlspecialchars_decode($_post[savepost])));
    }
}

下面的代码就是我通过我的数据库教程读取出文件路径并最终实现批量修改rar文件注释的方法.因为数据库是access,我新建了一个odbc源.同时rar.exe及cmd.exe都在1.php教程同目录下

 

<?
$id=$_get[id];
if($id=="")
{
echo "参数错误";
exit;
}
if($id>=400)
{
echo "全部结束";
exit;
}
$db=odbc_connect("dw","","");
$sql="select * from 'download' where 'id'=$id";
$query=odbc_exec($db,$sql);
$filename=odbc_result($query,2);
if($filename=="")
{

}
$filename=str_replace("#1′,"",$filename);
$filename=str_replace("#2′,"",$filename);
$filename="soft/".$filename;
echo $filename."<br>";
if(!file_exists($filename))
{
echo "文件不存在,转到下一个id";
$id++;
echo "<meta http-equiv='refresh'

content='0;url=../test/1.php?id=$id'>";
exit;
}//读出文件名,并检查文件是否存在
else
{
'winrar a $filename 使用说明.txt';
echo "插入说明文件成功";
$id++;
echo "<meta http-equiv='refresh' content='0;url=../test/1.php?id=$id'>";
}
odbc_close($db);
?>

缓存技术是每次访问页面的时候,都会先检测相应的缓存是否存在,如果不存在,就连接数据库,得到数据,完成模板变量的赋值,显示页面,同时生成缓存文件,这样下次访问的时候缓存文件就发挥作用了

而不会再执行if块的数据查询语句了。当然,在实际使用中会有很多东西要考虑,比如,有效期的设置,缓存组的设置等等

<?php 
class cacheexception extends exception {} 
/**
 * 缓存抽象类
 */ 
abstract class cache_abstract { 
    /**
     * 读缓存变量
     *
     * @param string $key 缓存下标
     * @return mixed
     */ 
    abstract public function fetch($key); 
     
    /**
     * 缓存变量
     *
     * @param string $key 缓存变量下标
     * @param string $value 缓存变量的值
     * @return bool
     */ 
    abstract public function store($key, $value); 
     
    /**
     * 删除缓存变量
     *
     * @param string $key 缓存下标
     * @return cache_abstract
     */ 
    abstract public function delete($key); 
     
    /**
     * 清(删)除所有缓存
     *
     * @return cache_abstract
     */ 
    abstract public function clear(); 
     
    /**
     * 锁定缓存变量
     *
     * @param string $key 缓存下标
     * @return cache_abstract
     */ 
    abstract public function lock($key); 
 
    /**
     * 缓存变量解锁
     *
     * @param string $key 缓存下标
     * @return cache_abstract
     */ 
    abstract public function unlock($key); 
 
    /**
     * 取得缓存变量是否被锁定
     *
     * @param string $key 缓存下标
     * @return bool
     */ 
    abstract public function islocked($key); 
 
    /**
     * 确保不是锁定状态
     * 最多做$tries次睡眠等待解锁,超时则跳过并解锁
     *
     * @param string $key 缓存下标
     */ 
    public function checklock($key) { 
        if (!$this->islocked($key)) { 
            return $this; 
        } 
         
        $tries = 10; 
        $count = 0; 
        do { 
            usleep(200); 
            $count ++; 
        } while ($count <= $tries && $this->islocked($key));  // 最多做十次睡眠等待解锁,超时则跳过并解锁 
 
        $this->islocked($key) && $this->unlock($key); 
         
        return $this; 
    } 

 
 
/**
 * apc扩展缓存实现
 * 
 * 
 * @category   mjie
 * @package    cache
 * @author     流水孟春
 * @copyright  copyright (c) 2008- <cmpan(at)qq.com>
 * @license    new bsd license
 * @version    $id: cache/apc.php 版本号 2010-04-18 23:02 cmpan $
 */ 
class cache_apc extends cache_abstract { 
     
    protected $_prefix = 'cache.mjie.net'; 
     
    public function __construct() { 
        if (!function_exists('apc_cache_info')) { 
            throw new cacheexception('apc extension didn't installed'); 
        } 
    } 
     
    /**
     * 保存缓存变量
     *
     * @param string $key
     * @param mixed $value
     * @return bool
     */ 
    public function store($key, $value) { 
        return apc_store($this->_storagekey($key), $value); 
    } 
     
    /**
     * 读取缓存
     *
     * @param string $key
     * @return mixed
     */ 
    public function fetch($key) { 
        return apc_fetch($this->_storagekey($key)); 
    } 
     
    /**
     * 清除缓存
     *
     * @return cache_apc
     */ 
    public function clear() { 
        apc_clear_cache(); 
        return $this; 
    } 
     
    /**
     * 删除缓存单元
     *
     * @return cache_apc
     */ 
    public function delete($key) { 
        apc_delete($this->_storagekey($key)); 
        return $this; 
    } 
     
    /**
     * 缓存单元是否被锁定
     *
     * @param string $key
     * @return bool
     */ 
    public function islocked($key) { 
        if ((apc_fetch($this->_storagekey($key) . '.lock')) === false) { 
            return false; 
        } 
         
        return true; 
    } 
     
    /**
     * 锁定缓存单元
     *
     * @param string $key
     * @return cache_apc
     */ 
    public function lock($key) { 
        apc_store($this->_storagekey($key) . '.lock', '', 5); 
        return $this; 
    } 
     
    /**
     * 缓存单元解锁
     *
     * @param string $key
     * @return cache_apc
     */ 
    public function unlock($key) { 
        apc_delete($this->_storagekey($key) . '.lock'); 
        return $this; 
    } 
     
    /**
     * 完整缓存名
     *
     * @param string $key
     * @return string
     */ 
    private function _storagekey($key) { 
        return $this->_prefix . '_' . $key; 
    } 

 
/**
 * 文件缓存实现
 * 
 * 
 * @category   mjie
 * @package    cache
 * @author     流水孟春
 * @copyright  copyright (c) 2008- <cmpan(at)qq.com>
 * @license    new bsd license
 * @version    $id: cache/file.php 版本号 2010-04-18 16:46 cmpan $
 */ 
class cache_file extends cache_abstract { 
    public $usesubdir     = false; 
     
    protected $_cachesdir = 'cache'; 
     
    public function __construct() { 
        if (defined('data_dir')) { 
            $this->_setcachedir(data_dir . '/cache'); 
        } 
    } 
     
    /**
     * 获取缓存文件
     *
     * @param string $key
     * @return string
     */ 
    protected function _getcachefile($key) { 
        $subdir = $this->usesubdir ? substr($key, 0, 2) . '/' : ''; 
        return $this->_cachesdir . '/' . $subdir . $key . '.php'; 
    } 
 
    /**
     * 读取缓存变量
     * 为防止信息泄露,缓存文件格式为php文件,并以"<?php exit;?>"开头
     * 
     * @param string $key 缓存下标
     * @return mixed
     */ 
    public function fetch($key) { 
        $cachefile = self::_getcachefile($key); 
        if (file_exists($cachefile) && is_readable($cachefile)) { 
            // include 方式 
            //return include $cachefile; 
            // 系列化方式 
 
            return unserialize(@file_get_contents($cachefile, false, null, 13)); 
        } 
 
        return false; 
    } 
 
    /**
     * 缓存变量
     * 为防止信息泄露,缓存文件格式为php文件,并以"<?php exit;?>"开头
     *
     * @param string $key 缓存变量下标
     * @param string $value 缓存变量的值
     * @return bool
     */ 
    public function store($key, $value) { 
        $cachefile = self::_getcachefile($key); 
        $cachedir  = dirname($cachefile); 
 
        if(!is_dir($cachedir)) { 
            if(!@mkdir($cachedir, 0755, true)) { 
                throw new cacheexception("could not make cache directory"); 
            } 
        } 
    // 用include方式 
        //return @file_put_contents($cachefile, '<?php return ' . var_export($value, true). ';'); 
 
        return @file_put_contents($cachefile, '<?php exit;?>' . serialize($value)); 
    } 
 
    /**
     * 删除缓存变量
     *
     * @param string $key 缓存下标
     * @return cache_file
     */ 
    public function delete($key) { 
        if(emptyempty($key)) { 
            throw new cacheexception("missing argument 1 for cache_file::delete()"); 
        } 
         
        $cachefile = self::_getcachefile($key); 
        if(!@unlink($cachefile)) { 
            throw new cacheexception("cache file could not be deleted"); 
        } 
 
        return $this; 
    } 
 
    /**
     * 缓存单元是否已经锁定
     *
     * @param string $key
     * @return bool
     */ 
    public function islocked($key) { 
        $cachefile = self::_getcachefile($key); 
        clearstatcache(); 
        return file_exists($cachefile . '.lock'); 
    } 
 
    /**
     * 锁定
     *
     * @param string $key
     * @return cache_file
     */ 
    public function lock($key) { 
        $cachefile = self::_getcachefile($key); 
        $cachedir  = dirname($cachefile); 
        if(!is_dir($cachedir)) { 
            if(!@mkdir($cachedir, 0755, true)) { 
                if(!is_dir($cachedir)) { 
                    throw new cacheexception("could not make cache directory"); 
                } 
            } 
        } 
 
        // 设定缓存锁文件的访问和修改时间 
        @touch($cachefile . '.lock'); 
        return $this; 
    } 
   
    /**
     * 解锁
     *
     * @param string $key
     * @return cache_file
     */ 
    public function unlock($key) { 
        $cachefile = self::_getcachefile($key); 
        @unlink($cachefile . '.lock'); 
        return 

下面来看一款关于smarty缓存的文件实例代码

再来看看smarty提供的页面缓存功能:

 

 1<?php

  2require('smarty.class.php');

  3$smarty = new smarty;

  4$smarty->caching = true;

  5if(!$smarty->is_cached('index.tpl')) {

  6 // no cache available, do variable assignments here.

  7 $contents = get_database_contents();

  8 $smarty->assign($contents);

  9}

  10$smarty->display('index.tpl');

  11?>

php缓存技术工作时,当程序查询数据的时候,会把相应的结果序列化后保存到文件中,以后同样的查询语句就可以不用直接查询数据库,而是从缓存文件中获得。这一改进使得程序运行速度得以太幅度提升.

 

[!--infotagslink--]

相关文章

  • php实现文件下载实例分享

    举一个案例:复制代码 代码如下:<?phpclass Downfile { function downserver($file_name){$file_path = "./img/".$file_name;//转码,文件名转为gb2312解决中文乱码$file_name = iconv("utf-8","gb2312",$file_name...2014-06-07
  • 在PHP中使用X-SendFile头让文件下载更快

    一般来说, 我们可以通过直接让URL指向一个位于Document Root下面的文件, 来引导用户下载文件.但是, 这样做, 就没办法做一些统计, 权限检查, 等等的工作. 于是, 很多时候, 我们采用让PHP来做转发, 为用户提供文件下载...2014-06-07
  • php 超大文件下载程序[http 缓存协商,Etag标记,断点续传]

    <?php教程 002 $file_path = './download/download_cn.rar'; 003 004 //使用方法 005 downFile($file_path); 006 007 // 服务器文件路径,下载文件名字(默认...2016-11-25
  • php 文件下载实例代码

    function xiazai($file_dir,$file_name) //参数说明: //file_dir:文件所在目录 //file_name:文件名 { $file_dir = chop($file_dir);//去掉路径中多余的空格...2016-11-25
  • java 文件下载支持中文名称的实例

    下面小编就为大家分享一篇java 文件下载支持中文名称的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
  • php文件下载(可限制下载速度)实现代码

    在php中文件下载会利用到header fopen fread三个主要函数,同时还有一些辅助函数如判断文件存在file_exists is_file等函数,下面我们来看一款文件下载可以限制下载速度实...2016-11-25
  • php实现远程文件下载代码

    这里为各位提供一款远程文件下载代码,我们可以把远程的文件用php下载到本地指定的目录,希望文章对你有帮助。 代码如下 复制代码 class downl...2016-11-25
  • php 实现文件下载

    //author:heaven //文件下载 function download($file_dir,$file_name) //参数说明: //file_dir:文件所在目录 //file_name:文件名 { $file_dir = chop($fi...2016-11-25
  • php简单文件下载过滤判断函数

    php简单文件下载过滤判断函数 if(strpos($fileurl, ':/'))//远程文件 { header("Location: $fileurl"); } else//本地文件 { if($d == 0) { header(...2016-11-25
  • php文件下载代码(支持远程文件下载)

    本文章提供的三款文件下载代码有二款是支持本地服务器文件下载的,另一款支持下载远程服务器上的文件下载到本地哦。 代码如下 复制代码 func...2016-11-25
  • php下实现文件下载实现代码

    文章介绍了利用php来实现读取文件并且下载的代码,php要下载文件必须用到header函数,大家可参考一下。 代码如下 复制代码 <?php $file = 'm...2016-11-25
  • php使用curl实现ftp文件下载功能实例代码

    这篇文章主要为大家详细介绍了php使用curl实现ftp文件下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了php实现ftp文件下载功能,供...2017-07-06
  • php 实现文本文件下载

    header("Content-Type: $mime"); header("Content-Disposition: attachment; filename="$file""); header("Content-Length: ".filesize($filename)); if(strstr($m...2016-11-25
  • C#实现word文件下载的代码

    这篇文章主要介绍了C#实现word文件下载的代码,有需要的朋友可以参考一下...2020-06-25
  • PHP实现文件操作类及文件下载功能的教程

    这篇文章讲述了php中如何实现文件操作类及文件下载功能的教程,非常有用,感兴趣的同学可以参考一下 本文实例讲述了PHP实现的文件操作类及文件下载功能。分享给大家...2016-12-31
  • 利用php header函数实现文件下载保存到本地

    header() 函数向客户端发送原始的 http 报头。 认识到一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数(在 php教程 4 以及更高的版本中,您可以使用输出缓...2016-11-25
  • php 文件下载方法

    文章也很简单我们只要用利用head 发送头部信息就能实现把文件下载到本了,有直接发送header信息也有把文件保存在服务器上再用header来发送哦,有需要的朋友参考下。...2016-11-25
  • 几行代码轻松实现PHP文件打包下载zip

    这篇文章主要为大家详细介绍了使用PHP自带zlib函数 ,轻松实现PHP文件打包下载zip,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-03-12
  • PHP jQuery ajax无刷新文件下载次数统计

    本文章基于php + mysql +jquery的ajax来实现无刷新文件下载次数统计,有需要的朋友可参考,下面我一步步给大家详细介绍实现过程。 本实例需要读者具备PHP、Mysql、jQ...2016-11-25
  • php header()函数实现文件下载的例子

    虽然php 中的header()函数 下载文件不支持断点续传功能但有时我们还真需要此功能,如我们下载txt,图片文件时如果直接是个连接估计是直接打开了而不是下载了,那么我们可如...2016-11-25