द्वारा अपलोड को संभालने के दौरान 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 द्वारा स्मृति खपत को कम करने का तरीका जानता है? धन्यवाद।
मुझे समझ में नहीं आता कि आपकी स्क्रिप्ट वास्तव में क्या कर रही है .. क्या आपने केवल 'प्रतिलिपि' का उपयोग करने की कोशिश की है? फाइल को फट करने के विरोध में आपको इसके लिए PHP का उपयोग करने की आवश्यकता क्यों है? –
> मुझे समझ में नहीं आता कि आपकी स्क्रिप्ट वास्तव में क्या कर रही है अपलोड की गई फ़ाइल सहेजना। > क्या आपने प्रतिलिपि का उपयोग करने की कोशिश की है? और यह कैसे मदद कर सकता है? > फ़ाइल को बस फट करने के विरोध में आपको इसके लिए PHP का उपयोग करने की आवश्यकता क्यों है? क्योंकि मुझे वेब अपलोड की आवश्यकता है। मुझे एफ़टीपी की आवश्यकता नहीं है। – andser
शायद आप PHP को पूरी तरह से छोड़ सकते हैं और Nginx अपलोड मॉड्यूल का उपयोग कर सकते हैं? (http://www.grid.net.ru/nginx/upload.en.html) – mobius