2012-02-24 13 views
8

nginx 1.0.5 + php-cgi(PHP 5.3.6)を実行しています。 〜1GBのファイルをアップロードする必要があります(1〜5パラレルアップロードが必要です)。 ajaxアップロードを使用して大きなファイルのアップロードを作成しようとしています。すべてが動作していますが、PHPはアップロードごとにたくさんのメモリを使います。私はmemory_limit = 200Mを設定しましたが、アップロードされるファイルのサイズは150MBまでです。ファイルが大きければ、アップロードは失敗します。私はmemory_limitを大きくすることができますが、私はそれが間違った方法だと思うので、PHPがすべてのメモリを食べることができます。 私は、サーバー側でのアップロードを処理するために(それが簡略化されています)、このPHPコードを使用:PHP入力によるアップロード処理中にPHPでのメモリ消費を減らす

$input = fopen('php://input', 'rb'); 
$file = fopen('/tmp/' . $_GET['file'] . microtime(), 'wb'); 
while (!feof($input)) { 
    fwrite($file, fread($input, 102400)); 
} 
fclose($input); 
fclose($file); 

/etc/nginx/nginx.conf:

user www-data; 
worker_processes 100; 
pid /var/run/nginx.pid; 

events { 
     worker_connections 768; 
     # multi_accept on; 
} 

http { 

     ## 
     # Basic Settings 
     ## 

     sendfile on; 
     tcp_nopush on; 
     tcp_nodelay on; 
     keepalive_timeout 65; 
     types_hash_max_size 2048; 
     client_max_body_size 2g; 
     # server_tokens off; 
     server_names_hash_max_size 2048; 
     server_names_hash_bucket_size 128; 

     # server_names_hash_bucket_size 64; 
     # server_name_in_redirect off; 

     include /etc/nginx/mime.types; 
     default_type application/octet-stream; 

     ## 
     # Logging Settings 
     ## 

     access_log /var/log/nginx/access.log; 
     error_log /var/log/nginx/error.log; 

     ## 
     # Gzip Settings 
     ## 

     gzip on; 
     gzip_disable "msie6"; 

     include /etc/nginx/conf.d/*.conf; 
     include /etc/nginx/sites-enabled/*; 
} 

の/ etc/nginxの/サイト対応/ SRV .conf:

server { 
    listen 80; 
    server_name srv.project.loc; 

    # Define root 
    set $fs_webroot "/home/andser/public_html/project/srv"; 
    root $fs_webroot; 
    index index.php; 

    # robots.txt 
    location = /robots.txt { 
     alias $fs_webroot/deny.robots.txt; 
    } 

    # Domain root 
    location/{ 
     if ($request_method = OPTIONS) { 
      add_header Access-Control-Allow-Origin "http://project.loc"; 
      add_header Access-Control-Allow-Methods "GET, OPTIONS, POST"; 
      add_header Access-Control-Allow-Headers "Authorization,X-Requested-With,X-File-Name,Content-Type"; 
      #add_header Access-Control-Allow-Headers "*"; 
      add_header Access-Control-Allow-Credentials "true"; 
      add_header Access-Control-Max-Age "10000"; 
      add_header Content-Length 0; 
      add_header Content-Type text/plain; 
      return 200; 
     } 
     try_files $uri $uri/ /index.php?$query_string; 
    } 

    #error_page 404 /404.htm 

    location ~ index.php { 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $fs_webroot/$fastcgi_script_name; 
     include fastcgi_params; 
     fastcgi_param REQUEST_METHOD $request_method; 
     fastcgi_param PATH_INFO $fastcgi_script_name; 

     add_header Pragma no-cache; 
     add_header Cache-Control no-cache,must-revalidate; 
     add_header Access-Control-Allow-Origin *; 
     #add_header Access-Control-Allow-Headers "Content-Type, X-Requested-With, X-File-Name"; 
    } 
} 

誰でもPHPによるメモリ消費を減らす方法を知っていますか?おかげさまで

+0

あなたのスクリプトが実際に何をしているのか分かりません。あなたは 'copy'を使ってみましたか?ファイルをftpするだけで、なぜこのためにphpを使う必要がありますか? –

+0

>あなたのスクリプトが実際に何をしているのか分かりません アップロードしたファイルを保存しています。 >コピーを使用してみましたか? それはどのように役立つでしょうか? >なぜファイルをftpするのではなく、このためにphpを使用する必要がありますか? ウェブアップロードが必要なためです。 FTPは必要ありません。 – andser

+1

PHPを完全にスキップし、Nginxアップロードモジュールを使用することはできますか? (http://www.grid.net.ru/nginx/upload.en.html) – mobius

答えて

1

前回と同じ靴を履いていましたが、これはアップロードプロセス中にファイルを別の塊に分割したものです。

私は良い例では、[1]使用している:http://www.plupload.com/index.php「pulploadを」か等もネットワークに問題があるときに、この機能を再開しているJavaアプレットhttp://jupload.sourceforge.netを使用しようとして

最も重要なことは、あなたがあなたのファイルをしたいということですウェブブラウザ経由でアップロードされました。チャンクであなたを止めることに気づいています。

4

コンテンツタイプヘッダーを偽装して、application/octet-streamからmultipart/form-dataに変えてしまうハックがあります。 PHPが$ HTTP_RAW_POST_DATAに値を設定するのを止めます。詳細はhttps://github.com/valums/file-uploader/issues/61です。

0

巨大なファイルをアップロードするのにFlashを使用してみませんか?たとえば、PHPをよくサポートしているswfuploadを試すことができます。

関連する問題