2012-03-13 3 views
12

Я пытаюсь отправить данные POST, которые составляют 2 миллиона символов (не двоичная строка) через ajax (jQuery), и он всегда появляется как пустой на стороне PHP. Вот мой код:PHP/Apache/AJAX - ограничение POST?

var string = "<data string that is 2M chars long>"; 
$.ajax({ 
    cache: false, 
    type: 'POST', 
    url: 'data.php', 
    data: {'data_string': string} 
}); 

На стороне PHP, я получаю следующее сообщение об ошибке (при попытке извлечь данные из $_POST['data_string']):

Notice: Undefined index: data_string in data.php on line ... 

Я проверил post_max_size в php.ini , и он установлен на 256M, что должно быть более чем достаточно? Я в тупик, и не уверен, что я делаю неправильно ...

EDIT: Если я "string" небольшое количество данных (например, var string = 'test') затем $_POST["data_string"] возвращается test, как и ожидалось. Поэтому мне интересно, есть ли какой-то предел данных, который я достигаю в Apache2, PHP или в самом браузере? Я использую Google Chrome 17.0.963.79

edit2: memory_limit = 256M в php.ini

EDIT3: max_input_time = -1 в php.ini

EDIT4: var_dump ($ _ POST) возвращает массив (0)

EDIT5: работает последняя стабильная версия PHP5 на debian squeeze: PHP 5.3.3-7 + squeeze8 с Suhosin-Patch (cli) (построено: 10 февраля 2012 14:12:26)

+1

Сохраняется ли та же ошибка при значительно меньших строк, таких как 'test'? Неопределенный индекс показывает, что он не публикуется. – MetalFrog

+1

нет, ошибка не сохраняется с небольшими текстовыми данными. –

+0

Попробуйте 'var_dump ($ _ GET); var_dump ($ _ POST); 'если нет ничего, проверьте файлы конфигурации apache для возможных ограничений – Robus

ответ

21

Вам нужно будет проверить параметры пределов на всех элементах между вами и сервером. Довольно трудно для прокси-серверов, если таковые имеются, но по крайней мере вы можете проверить:

Apache:

  • LimitRequestBody, вокруг 2Gb по умолчанию, может быть, больше для 64bits, проверьте журналы ошибок для деталей.

PHP:

  • post_max_size, которая непосредственно связана с размером POST
  • upload_max_filesize, которые могут быть связаны, не уверен
  • max_input_time, если POSt занимает слишком много времени
  • max_input_nesting_level если ваши данные представляют собой массив с множеством подуровней
  • max_execution_time, но совершенно уверен, что это не то, что
  • memory_limit, как вы можете достичь размера exceding подпроцесса позволило памяти
  • max_input_vars, если массив данных имеет множество элементов

Если вы достигли скомпилированный в пределе для Apache ваше единственное решение состоит в том, чтобы избежать прямого POSt такого большого объема данных, вам придется разбить его на части.

+0

спасибо, я подозреваю, что строка слишком большая, и я, вероятно, просто разлому ее на части. –

+2

Спасибо за это, 'max_input_vars' был для нас виновником. – Ruben

0

Вы также можете захотеть набор set_time_limit(0) и ваш memory limit.

EDIT: Вы также можете хотеть console.log(string); или console.log(string.length); перед тем, как ваш запрос будет проверен, что он установлен правильно, а также проверьте свой запрос в инструментах разработчика firebug или chromes, чтобы проверить отправку ваших данных.

+0

memory_limit = 256M, set_time_limit (0) ничего не изменил. –

+1

есть также параметр max_input_time ini. также убедитесь, что ваши изменения действительно вступили в силу – miki

+0

Я установил max_input_time равным -1, и проблема все еще там. –

2

Вы также можете проверить suhosin.ini настройки, например .:

suhosin.post.max_value_length = 65000 
-1
//Adding Respond Box After Selected Field 
$('[maxlength]').bind('click keyup', function(){ 
    var RespondBox = '<div class="StPgRp" id="UpdateRespond"></div>'; 
    $('#UpdateRespond').remove(); 
    $(this).after(RespondBox); 
}); 

//Counting Maximum Characters Allowed In Selected Field 
$('[maxlength]').bind('click keyup', function(){ 
    var MaxLength = $(this).attr('maxlength'); 
    var CurrentLength = $(this).val().length; 
    var Remainder = MaxLength - CurrentLength; 
    $('#UpdateRespond').html('You have ' + Remainder + ' characters remaining.'); 
}); 

//Checking the PHP Function if YES then send message to user 
$('.Check').bind('click keyup', function(){ 
    var Check = $(this).parent().children('.Check').val(); 
}); 

Добавьте это в файл .js, связанного с вашей страницы, и ваш сортируется!

0

Просто разделите одинарные кавычки из имени параметра!

От:

data: {'data_string': string} 

To:

data: {data_string: string} 
Смежные вопросы