Php 是ini设置(“内存限制”、“512M”);太多

Php 是ini设置(“内存限制”、“512M”);太多,php,Php,我使用2个php库来提供文件-解压,以及 zip-zip.lib 它们可以在10MB以下的文件上正常工作,但是对于10MB以上的文件,我必须将mem限制设置为256。对于超过25MB的文件,我将其设置为512。看起来有点高。。。是吗 我在一个专用的服务器上-4个CPU和16GB RAM-但是我们也有很多流量和下载,所以我想知道这里 我的脚本所做的是在用户下载之前授权文件 通常,您应该避免使用任何消耗大量内存或CPU时间的web脚本。理想情况下,您应该通过分离的进程将任务转换为运行。设置一个高限

我使用2个php库来提供文件-
解压
,以及

zip-zip.lib

它们可以在10MB以下的文件上正常工作,但是对于10MB以上的文件,我必须将mem限制设置为256。对于超过25MB的文件,我将其设置为512。看起来有点高。。。是吗

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

我的脚本所做的是在用户下载之前授权文件

通常,您应该避免使用任何消耗大量内存或CPU时间的web脚本。理想情况下,您应该通过分离的进程将任务转换为运行。设置一个高限制本身并不坏,但它使检测写得不好的脚本变得更加困难,而且对复杂页面的高要求更容易损害即使是简单页面的性能

例如,使用可以轻松设置一些在CLI上运行的许可证工作程序脚本,并通过gearman API与它们通信

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


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

也许您正在使用php将整个文件加载到内存中,然后再将其提供给用户?我使用了(注释部分)中的一个函数,该函数将文件分成多个部分,以保持较低的内存。从该帖子复制(因为我的版本已更改):



那么,要上传一个
11MB
文件,你到底要做什么呢?不上传,下载,我们提供超过1K的文件,范围从1MB到30MB。设置一个上限并不意味着php每次都会占用那么多ram,只是意味着如果它开始使用额外内存,它不会超过这个上限。谢谢你,马克,现在我还应该设置ini_集(“max_execution_time”,“600”);较高的?我的脚本所做的是在用户下载之前授权文件。我认为,如果您将实际的zip文件存储在服务器中的某个位置,这意味着您不需要动态添加zip/unzip文件,那么您就可以在不消耗太多内存的情况下提供页面。在我的服务器上运行PECL:(@Benn,这只是我熟悉的一个建议。你可以通过数据库中的队列表轻松地自己做。这并不是说设置一个高限制是不好的(特别是如果你只为该页面做的话),但就个人而言,我更喜欢一个更健壮的解决方案。是的,我同意,它只是增加了(需要文件)一旦用户点击“下载”按钮,我就不得不把它设置得很高。在过去的4年中,我们没有遇到过问题,但是准备新的网站版本并想要清理代码。但是,队列表也不是一个坏主意,但是,我比我应该做的更努力了。我可以雇用你来做这份工作吗?
<?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; 
    } 
?>