2014-10-07 2 views
1

У меня возникла проблема, когда большие массивы данных, отправленные через POST с использованием AJAX, не превращаются в переменную $_POST в PHP.Данные POST, усеченные между браузером и PHP

Пользователь загружает файл Excel/CSV через веб-форму и анализируется через AJAX. Этот конкретный пример содержит 775 записей с 13 полями/элементами. Добавление дополнительных полей и количество элементов в наборе данных составляет менее 11 000 элементов. Из исследования, которое я сделал по этому вопросу, 32-разрядные браузеры (например, Firefox, Chrome и т. Д.) Должны иметь возможность обрабатывать 4,29 миллиарда элементов, поэтому я не вижу размер данных в качестве проблемы, тем более, что ответ из загрузки файла содержит все элементы.

Проблема только поднимается, когда вся форма отправляется для проверки и ввода в базу данных. Проблема в том, что консоль на обеих Firebug и Chrome Developer Tools показывает, что весь набор данных представлен: Firebug Output

Выполнение var_dump на $_POST дает это: enter image description here

php.ini имеет 'post_max_size' набор до 200М. Даже 'upload_max_filesize' установлен в 100M. Эта проблема возникает как в Firefox 32.0.3, так и в Chrome 37.0.2062.103 m, которые я тестировал лично и в других старых версиях (включая IE 10), которые тестировал UAT.

вызов AJAX является:

new wrapper.ajax('/t1.php', { 
    type: 'POST', 
    data: data, 
    form: $('form[name=oppForm]'), 
    success: function (response) 
    { 
    if (response.result) 
    { 
     window.location = response.result; 
    } 
    }, 
    complete: function() 
    { 
    $("#submit").loading('done'); 
    } 
}); 

РНР является:

<?php 
var_dump($_POST); 

Любые мысли?

EDIT

После разговора с некоторыми другими разработчиками, я также проверил выход из php://input и обнаружил, что она содержит все данные POST, что браузеры присылали, но о том, что данные не получал переведены $ _POST правильно. Однако он действительно работает, если я удалю 10 ключей из данных сообщения и отправлю 765 вместо 775.

+2

Также проверьте 'max_input_vars' и' max_input_nesting_level' (последнее должно быть менее важным в вашем случае). А также проверьте, нет ли f.e. suhosin используется для запуска вашего PHP-кода, который имеет дополнительные ограничения в отношении безопасности входящих данных. – CBroe

+0

Если вы работаете на Apache, есть также [limitrequestbody] (http://httpd.apache.org/docs/2.0/mod/core.html#limitrequestbody). – naneau

+1

Один разработчик предложил посмотреть на разницу между «php: // input» и $ _POST. '? Php file_put_contents ('/ tmp/zelda4.log', print_r (file_get_contents (" php: // input "), true)); file_put_contents ('/ tmp/zelda5.log', print_r ($ _ POST, true)); ' И« php: // input »содержит все ожидаемое содержимое, которое браузеры заявляют, что они отправили, но $ _POST все еще не показывает все это. –

ответ

3

Вопрос закончился тем, что 'max_input_vars' в файле php.ini не был установлен достаточно высоким. Значение было установлено равным 10 000, и пользователь подавал данные около 11k, поэтому некоторые из них были усечены. Изменение этого значения, чтобы быть больше, - это то, что решило проблему.

Смежные вопросы