Сокращение потребления памяти в PHP при обработке загрузок с помощью ввода php - PullRequest
8 голосов
/ 24 февраля 2012

У меня работает nginx 1.0.5 + php-cgi (PHP 5.3.6).Мне нужно загрузить ~ 1 ГБ файлов (необходимо 1-5 параллельных загрузок).Я пытаюсь создать загрузку больших файлов через ajax upload.Все работает, но PHP потребляет много памяти для каждой загрузки.Я установил memory_limit = 200M, но он работает до размера загруженного файла ~ 150MB.Если файл больше - загрузка не удалась.Я могу установить 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 / 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";
    }
}

Кто-нибудь знает способ уменьшить потребление памяти PHP?Благодаря.

Ответы [ 3 ]

4 голосов
/ 28 июня 2012

Есть хак, который подделывает заголовок типа контента, изменяя его с application/octet-stream на multipart/form-data.Это остановит PHP от заполнения $ HTTP_RAW_POST_DATA.Подробнее https://github.com/valums/file-uploader/issues/61.

1 голос
/ 25 февраля 2012

Раньше я был в той же обуви, и это то, что я делил файлы на разные куски в процессе загрузки.

Хороший пример - использование [1]: http://www.plupload.com/index.php "pulpload" или попытка использования Java-апплета http://jupload.sourceforge.net, который также имеет возможность возобновления при возникновении проблем с сетью и т. Д.

Самое важное, что вы хотите, чтобы ваши файлы загружались через веб-браузер, но это мешает вам делать это кусками

0 голосов
/ 24 июля 2012

Почему бы вам не попробовать использовать flash для загрузки огромных файлов. Например, вы можете попробовать swfupload, который имеет хорошую поддержку PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...