2012-08-06 95 views
0

我使用2个PHP库服务文件 - unzip,并dUnzip2是ini_set(“memory_limit”,“512M”);太多了?

拉链zip.lib
http://www.zend.com/codex.php?id=470&single=1

它们工作得很好的下10MB的文件,但有超过10MB的文件,我必须设置mem限制为256.对于超过25MB的文件,我将它设置为512.它看起来很高......是吗?

我在一个专用的服务器上--4个CPU和16GB RAM - 但我们也有很多的流量和下载,所以我有点想知道这里。

+0

那你究竟需要做什么才能上传一个'11MB'文件? – Jon 2012-08-06 03:39:19

+0

没有上传,下载,我们提供1K以上的文件,范围从1MB到30MB – Benn 2012-08-06 03:40:15

+2

设置上限并不意味着php每次都会占用那么多的内存,这只是意味着它不会超过这个限制,如果它开始使用额外的内存。 – 2012-08-06 03:47:42

回答

1

也许你正在使用PHP将全部文件加载到内存中,然后再将它们提供给用户?我使用了http://www.php.net/manual/en/function.readfile.php(注释部分)中的一个函数,该函数在部分文件中提供文件,使内存保持较低。从那篇文章复制(因为我的版本发生了变化):

<?php 
    function readfile_chunked ($filename,$type='array') { 
     $chunk_array=array(); 
     $chunksize = 1*(1024*1024); // how many bytes per chunk 
     $buffer = ''; 
     $handle = fopen($filename, 'rb'); 
     if ($handle === false) { 
     return false; 
     } 
     while (!feof($handle)) { 
      switch($type) 
      { 
       case'array': 
       // Returns Lines Array like file() 
       $lines[] = fgets($handle, $chunksize); 
       break; 
       case'string': 
       // Returns Lines String like file_get_contents() 
       $lines = fread($handle, $chunksize); 
       break; 
      } 
     } 
     fclose($handle); 
     return $lines; 
    } 
?> 
+0

伟大的解决方案! – Benn 2012-08-06 17:10:17

0

什么我的剧本确实是用户下载

之前授权文件一般应避免任何web脚本消耗那么多的内存或CPU时间。理想情况下,您可以通过分离的流程将任务转换为运行。设置一个高限本身并不坏,但它使得难以发现写得不好的脚本,并且更容易满足复杂页面的高要求,甚至在简单页面上也会损害性能。

例如,通过gearman,您可以轻松设置一些CLI上运行的许可证工作者脚本,并通过gearman API与他们进行通信。

通过这种方式,您的Web服务器可以保持自由执行低CPU和内存任务,并且您可以轻松保证您一次不会运行超过X个授权任务(其中X基于您允许的工作人员脚本数量跑)。

您的前端脚本可能只是一个轮询服务器的AJAX小部件,检查是否已完成任务。

+0

无法在我的服务器上运行PECL :( – Benn 2012-08-06 03:56:55

+0

@Benn,这只是我熟悉的一个建议,您可以通过数据库中的队列表轻松完成,而且这些都不是说设置高限制是不好的(特别是如果你只是为那个页面而做),但是我个人更喜欢在这种情况下使用更强大的解决方案。 – Matthew 2012-08-06 03:59:18

+0

好吧,我来说,一旦用户点击下载按钮,它只会增加(需要文件)但是我不得不把它设置的很高我们在过去的4年没有问题但是准备好了新的网站版本并且想要清理代码 – Benn 2012-08-06 04:01:02