2012-02-24 14 views
8

Ho nginx 1.0.5 + php-cgi (PHP 5.3.6) in esecuzione. Ho bisogno di caricare file da 1 GB (1-5 caricamenti paralleli devono essere). Sto cercando di creare il caricamento di file di grandi dimensioni tramite caricamento Ajax. Tutto funziona, ma PHP consuma molta memoria per ogni caricamento. Ho impostato memory_limit = 200M, ma sta lavorando fino a ~ 150 MB di dimensione del file caricato. Se il file è più grande, il caricamento non riesce. Posso impostare memory_limit sempre più grande, ma penso che sia sbagliato, perché PHP può consumare tutta la memoria. Io uso questo codice PHP (è semplificato) per gestire il caricamento sul lato server:Riduci il consumo di memoria in PHP mentre gestisci i caricamenti tramite input 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/sites-enabled/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"; 
    } 
} 

Qualcuno conosce il modo per ridurre il consumo di memoria da parte di PHP? Grazie.

+0

Non capisco cosa stia facendo veramente lo script .. hai provato a usare solo 'copia'? Perché hai bisogno di usare php per questo invece di solo ftping del file? –

+0

> Non capisco cosa stia facendo realmente lo script Salvataggio del file caricato. > hai provato a usare solo la copia? E come può essere d'aiuto? > Perché è necessario utilizzare php per questo invece di limare il file? Perché ho bisogno di caricare il web. Non ho bisogno di FTP. – andser

+1

Forse potresti saltare completamente PHP e utilizzare il modulo Nginx Upload? (http://www.grid.net.ru/nginx/upload.en.html) – mobius

risposta

1

Sono stati nella stessa scarpa prima e questo è quello che ho fatto dividere i file in diversi blocchi durante il processo di caricamento.

ho buon esempio sta usando [1]: http://www.plupload.com/index.php "pulpload" o cercando utilizzando un applet Java http://jupload.sourceforge.net che ha anche riprendere la capacità quando ci sono problemi di rete, ecc

La cosa più importante è che si desidera i file caricato tramite un browser web c'è notando ti impedisce di farlo a pezzi

4

c'è un hack, che è di circa falsificazione intestazione del tipo di contenuto, trasformandolo application/octet-stream-multipart/form-data. Questo impedirà a PHP di compilare $ HTTP_RAW_POST_DATA. Maggiori dettagli https://github.com/valums/file-uploader/issues/61.

0

Perché non provare a utilizzare il flash per caricare file enormi. Ad esempio, puoi provare swfupload, che ha un buon supporto per PHP.