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.
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? –
> 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
Forse potresti saltare completamente PHP e utilizzare il modulo Nginx Upload? (http://www.grid.net.ru/nginx/upload.en.html) – mobius