对带宽是有影响,所以对单个用户单次下载我做了限制,不是一次输出整个文件,而是分字节输出$buffer_size = 1024;
带宽可以通过Apache或者Nginx做限制的,现在主要是数据读取缓存问题,如何减少文件重复打开读取问题。

解决方案 »

  1.   


    有没有更好的idea啊?求php高手指点
      

  2.   

    不知道你的极其耗内存资源的结论是如何得来的,你不就是每次 $buffer_size 字节吗?
      

  3.   


    从apache进程看,每增加一个用户就会多一个httpd进程,而且消耗同样多内存资源。每次$buffer_size字节只是能控制单个用户的IO不会一次性把文件load到服务器内存buffer里。
    但我不知道能不能实现这样的功能,就是第一个用户下载时我就把数据全部load到服务器内存里,后面用户进来不是去读文件,而是读取内存buffer里的数据。另外,memcache没有仔细研究,不知道可以不可以,好像这个处理数据库方面比较好,把数据库数据放到内存,减少频繁访问数据库开销,但不知道文件是不是也能通过memcache存到内存里?
      

  4.   

    当然可以把文件保存到 memcache 中去,不过你应该计算一下开销吧
    假定你有 100 个可供下载的文件,那么你就把这 100 个文件都保存到 memcache 中去吗?
    如果在某个时刻只用一个人在下载呢?
    再说 memcache 中的文件内容也还是需要读回到 php 残能输出吧?
    那和 $buffer = fread($fp, $buffer_size); 有什么区别呢?
      

  5.   


    谢谢你的回复!
    目前主要是做服务端,同一个数据包提供给很多终端下载升级,所以,一般情况下只有一个文件需要保存到memcache中去,不会有很多文件保存到memcache。
    但我不知道针对我这种case用memcache能不能提升读写性能?
      

  6.   


    从apache进程看,每增加一个用户就会多一个httpd进程,而且消耗同样多内存资源。每次$buffer_size字节只是能控制单个用户的IO不会一次性把文件load到服务器内存buffer里。
    但我不知道能不能实现这样的功能,就是第一个用户下载时我就把数据全部load到服务器内存里,后面用户进来不是去读文件,而是读取内存buffer里的数据。另外,memcache没有仔细研究,不知道可以不可以,好像这个处理数据库方面比较好,把数据库数据放到内存,减少频繁访问数据库开销,但不知道文件是不是也能通过memcache存到内存里?我看了下大概觉得你的意思是不想每次下载都执行一次文件的打开读取操作,不知道是不是这么个需求?
    另外就是,具体怎么做我也不知道。但是我有个问题,就是如果你可以把文件中的数据用一种方式存储起来之后,那下次别人来下载的时候你是想读取存储起来的数据吧?那这些存储起来的数据你存到哪里呢?文件中吗?那存到文件中跟不存有什么区别?所以我觉得他们说的用memcache是可行的,但是前提是你把一个文件的数据存到memcache中之后下次读出来之后文件依然是正确的。
    至于怎么存到memcache,这就很简单了,只要你成功的搭建好了memcached服务器,那存和读很简单的,真的。
      

  7.   


    从apache进程看,每增加一个用户就会多一个httpd进程,而且消耗同样多内存资源。每次$buffer_size字节只是能控制单个用户的IO不会一次性把文件load到服务器内存buffer里。
    但我不知道能不能实现这样的功能,就是第一个用户下载时我就把数据全部load到服务器内存里,后面用户进来不是去读文件,而是读取内存buffer里的数据。另外,memcache没有仔细研究,不知道可以不可以,好像这个处理数据库方面比较好,把数据库数据放到内存,减少频繁访问数据库开销,但不知道文件是不是也能通过memcache存到内存里?我看了下大概觉得你的意思是不想每次下载都执行一次文件的打开读取操作,不知道是不是这么个需求?
    另外就是,具体怎么做我也不知道。但是我有个问题,就是如果你可以把文件中的数据用一种方式存储起来之后,那下次别人来下载的时候你是想读取存储起来的数据吧?那这些存储起来的数据你存到哪里呢?文件中吗?那存到文件中跟不存有什么区别?所以我觉得他们说的用memcache是可行的,但是前提是你把一个文件的数据存到memcache中之后下次读出来之后文件依然是正确的。
    至于怎么存到memcache,这就很简单了,只要你成功的搭建好了memcached服务器,那存和读很简单的,真的。谢谢你的回复,你说的正确,我是不想每次下载都执行一次文件的打开读取操作。
    我的思路是当第一用户请求下载时,把数据存储到内存,后面别的用户再请求下载时就不用再打开原文件,而是直接读取保存在内存里面的数据流。如果通过memcache可以实现的话,我后面去试验一下。
      

  8.   


    从apache进程看,每增加一个用户就会多一个httpd进程,而且消耗同样多内存资源。每次$buffer_size字节只是能控制单个用户的IO不会一次性把文件load到服务器内存buffer里。
    但我不知道能不能实现这样的功能,就是第一个用户下载时我就把数据全部load到服务器内存里,后面用户进来不是去读文件,而是读取内存buffer里的数据。另外,memcache没有仔细研究,不知道可以不可以,好像这个处理数据库方面比较好,把数据库数据放到内存,减少频繁访问数据库开销,但不知道文件是不是也能通过memcache存到内存里?我看了下大概觉得你的意思是不想每次下载都执行一次文件的打开读取操作,不知道是不是这么个需求?
    另外就是,具体怎么做我也不知道。但是我有个问题,就是如果你可以把文件中的数据用一种方式存储起来之后,那下次别人来下载的时候你是想读取存储起来的数据吧?那这些存储起来的数据你存到哪里呢?文件中吗?那存到文件中跟不存有什么区别?所以我觉得他们说的用memcache是可行的,但是前提是你把一个文件的数据存到memcache中之后下次读出来之后文件依然是正确的。
    至于怎么存到memcache,这就很简单了,只要你成功的搭建好了memcached服务器,那存和读很简单的,真的。谢谢你的回复,你说的正确,我是不想每次下载都执行一次文件的打开读取操作。
    我的思路是当第一用户请求下载时,把数据存储到内存,后面别的用户再请求下载时就不用再打开原文件,而是直接读取保存在内存里面的数据流。如果通过memcache可以实现的话,我后面去试验一下。恩,这个样子的话,如果可以保证读取出来的数据下载到用户那边是正确的话通过放到内存中或者是数据库中是很好的选择了,但是可能放的数据大小会是个问题,如果你准备用memcache的话那我觉得最好用redis或者mongodb吧,redis我熟悉但是mongodb我不熟。
    为什么要用redis呢,其实是因为你不可能把每一个被下载的文件都存到内存中,只能挑一些蛮重要的存,所以需要有一个标记,那用memcache我想了下是不好实现的,但是用redis就很简单了。好吧,我也没想通是怎么实现判断重要不重要,但是我就是觉得用redis应该是比memcahe是个更好的方案,希望能帮到你吧。