2012-02-24 9 views
8

द्वारा अपलोड को संभालने के दौरान PHP में स्मृति खपत को कम करें मेरे पास nginx 1.0.5 + php-cgi (PHP 5.3.6) चल रहा है। मुझे ~ 1 जीबी फाइलें अपलोड करने की आवश्यकता है (1-5 समांतर अपलोड होना चाहिए)। मैं AJAX अपलोड के माध्यम से बड़ी फ़ाइलों को अपलोड करने की कोशिश कर रहा हूं। सब कुछ काम कर रहा है लेकिन PHP प्रत्येक अपलोड के लिए बहुत मेमोरी खा रहा है। मैंने memory_limit = 200M सेट किया है, लेकिन यह अपलोड की गई फ़ाइल के ~ 150 एमबी आकार तक काम कर रहा है। अगर फ़ाइल बड़ी है - अपलोडिंग विफल हो जाती है। मैं memory_limit को बड़ा और बड़ा सेट कर सकता हूं, लेकिन मुझे लगता है कि यह गलत तरीका है, क्योंकि 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 मैं सर्वर साइड पर अपलोड संभाल करने के लिए इस PHP कोड का उपयोग करें (यह सरल बनाया गया है) .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

मुझे समझ में नहीं आता कि आपकी स्क्रिप्ट वास्तव में क्या कर रही है .. क्या आपने केवल 'प्रतिलिपि' का उपयोग करने की कोशिश की है? फाइल को फट करने के विरोध में आपको इसके लिए PHP का उपयोग करने की आवश्यकता क्यों है? –

+0

> मुझे समझ में नहीं आता कि आपकी स्क्रिप्ट वास्तव में क्या कर रही है अपलोड की गई फ़ाइल सहेजना। > क्या आपने प्रतिलिपि का उपयोग करने की कोशिश की है? और यह कैसे मदद कर सकता है? > फ़ाइल को बस फट करने के विरोध में आपको इसके लिए PHP का उपयोग करने की आवश्यकता क्यों है? क्योंकि मुझे वेब अपलोड की आवश्यकता है। मुझे एफ़टीपी की आवश्यकता नहीं है। – andser

+1

शायद आप PHP को पूरी तरह से छोड़ सकते हैं और Nginx अपलोड मॉड्यूल का उपयोग कर सकते हैं? (http://www.grid.net.ru/nginx/upload.en.html) – mobius

उत्तर

1

पहले एक ही जूता में रहा है और अपलोड प्रक्रिया के दौरान मैंने फ़ाइलों को अलग-अलग हिस्सों में विभाजित किया है।

मैं अच्छा उदाहरण [1] उपयोग कर रहा है: http://www.plupload.com/index.php "pulpload" या एक जावा एप्लेट 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

बड़ी फ़ाइलों को अपलोड करने के लिए आप फ़्लैश का उपयोग क्यों नहीं करते हैं। उदाहरण के लिए, आप swfupload आज़मा सकते हैं, जिसका PHP के लिए अच्छा समर्थन है।

संबंधित मुद्दे