0

私はファイルを提供するために2つのphpライブラリを使用しています- unzip、そしてdUnzip2

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

10MB未満のファイルでは正常に動作しますが、10MBを超えるファイルでは、mem制限を256に設定する必要があります。25MBを超えるファイルでは、512に設定します。

私は専用サーバー(4つのCPUと16GBのRAM)を使用していますが、トラフィックとダウンロードも多いので、ここで不思議に思っています。

4

2 に答える 2

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; 
    } 
?>
于 2012-08-06T04:56:22.530 に答える
0

私のスクリプトは、ユーザーがダウンロードする前にファイルのライセンスを取得します

一般に、それだけのメモリまたはCPU時間を消費するWebスクリプトは避ける必要があります。理想的には、分離されたプロセスを介してタスクを実行に変換します。上限を設定すること自体は悪いことではありませんが、記述が不十分なスクリプトを検出するのが難しくなり、複雑なページの需要が高く、単純なページでもパフォーマンスが低下しやすくなります。

たとえば、gearmanを使用すると、CLIで実行され、gearmanAPIを介してそれらと通信するライセンスワーカースクリプトを簡単に設定できます。

このようにして、WebサーバーはCPUとメモリの少ないタスクを自由に実行でき、一度にX個を超えるライセンスタスクを実行しないことを簡単に保証できます(Xは実行させたワーカースクリプトの数に基づいています)。

フロントエンドスクリプトは、サーバーをポーリングしてタスクが完了したかどうかを確認するAJAXウィジェットである可能性があります。

于 2012-08-06T03:55:03.593 に答える