2012-02-24 16 views
8

Tengo nginx 1.0.5 + php-cgi (PHP 5.3.6) ejecutándose. Necesito cargar ~ 1GB de archivos (1 a 5 cargas paralelas deben ser). Estoy tratando de crear la carga de archivos grandes a través de la carga de jajax. Todo funciona, pero PHP consume mucha memoria para cada carga. He establecido memory_limit = 200M, pero está trabajando hasta ~ 150MB de tamaño de archivo cargado. Si el archivo es más grande, la carga falla. Puedo establecer memory_limit cada vez más grande, pero creo que está mal, porque PHP puede consumir toda la memoria. utilizo este código PHP (se simplifica) para manejar cargas en el lado del servidor:Reduce el consumo de memoria en PHP mientras se manejan las cargas por entrada 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"; 
    } 
} 

Alguien sabe la manera de reducir el consumo de memoria de PHP? Gracias.

+0

No entiendo lo que su script realmente está haciendo ... ¿ha intentado simplemente usar 'copy'? ¿Por qué necesitas usar php para esto en lugar de simplemente usar el archivo? –

+0

> No entiendo lo que realmente hace su script Guardando el archivo cargado. > ¿ha intentado solo con copiar? ¿Y cómo puede ayudar? > ¿Por qué necesita usar php para esto en lugar de simplemente usar el archivo? Porque necesito cargar en la web. No necesito FTP. – andser

+1

¿Tal vez podría omitir PHP por completo y usar el módulo de carga de Nginx? (http://www.grid.net.ru/nginx/upload.en.html) – mobius

Respuesta

1

He estado en el mismo zapato antes y esto es lo que hice dividir los archivos en diferentes partes durante el proceso de carga.

I buen ejemplo está utilizando [1]: http://www.plupload.com/index.php "pulpload" o tratando de utilizar un applet de Java http://jupload.sourceforge.net que también tiene la capacidad de reanudar cuando hay problemas de red, etc

Lo más importante es que usted quiere que sus archivos cargados a través de un navegador web, no hay nada que lo detenga en trozos

0

¿Por qué no intentas usar el flash para cargar archivos de gran tamaño? Por ejemplo, puedes probar swfupload, que tiene un buen soporte para PHP.