Предупреждение PHP: POST Content-Length 113 байтов превышает ограничение -1988100096 байтов в Unknown - PullRequest
10 голосов
/ 11 июня 2011

У меня было много проблем с пользователями, загружающими изображения на мой сайт.

Они могут загружать до 6 изображений

Первоначально мне пришлось изменить значения в php.ini на:

upload_max_filesize = 2000M
post_max_size = 2000M
max_execution_time = 120
max_file_uploads = 7
memory_limit=128M

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

Все шло нормально, пока я не проверил свой журнал ошибок, который содержал:

[11-Jun-2011 04:33:06] PHP Warning:  Unknown: POST Content-Length of 113 bytes exceeds the limit of -1988100096 bytes in Unknown on line 0
[11-Jun-2011 04:33:12] PHP Warning:  Unknown: POST Content-Length of 75 bytes exceeds the limit of -1988100096 bytes in Unknown on line 0
[11-Jun-2011 04:33:27] PHP Warning:  Unknown: POST Content-Length of 74 bytes exceeds the limit of -1988100096 bytes in Unknown on line 0
[11-Jun-2011 04:33:34] PHP Warning:  Unknown: POST Content-Length of 75 bytes exceeds the limit of -1988100096 bytes in Unknown on line 0
[11-Jun-2011 04:33:43] PHP Warning:  Unknown: POST Content-Length of 77 bytes exceeds the limit of -1988100096 bytes in Unknown on line 0
[11-Jun-2011 04:33:48] PHP Warning:  Unknown: POST Content-Length of 74 bytes exceeds the limit of -1988100096 bytes in Unknown on line 0
[11-Jun-2011 04:33:53] PHP Warning:  Unknown: POST Content-Length of 75 bytes exceeds the limit of -1988100096 bytes in Unknown on line 0
[11-Jun-2011 04:34:20] PHP Warning:  Unknown: POST Content-Length of 133 bytes exceeds the limit of -1988100096 bytes in Unknown on line 0
[11-Jun-2011 04:35:29] PHP Warning:  Unknown: POST Content-Length of 131 bytes exceeds the limit of -1988100096 bytes in Unknown on line 0
[11-Jun-2011 04:36:00] PHP Warning:  Unknown: POST Content-Length of 113 bytes exceeds the limit of -1988100096 bytes in Unknown on line 0
[11-Jun-2011 04:36:06] PHP Warning:  Unknown: POST Content-Length of 75 bytes exceeds the limit of -1988100096 bytes in Unknown on line 0
[11-Jun-2011 04:36:34] PHP Warning:  Unknown: POST Content-Length of 116 bytes exceeds the limit of -1988100096 bytes in Unknown on line 0

если я изменяю максимальное значение поста назад наверх 8M, я получаю сообщение, подобное этому:

PHP Warning:  POST Content-Length of 11933650 bytes exceeds the limit of 8388608 bytes in Unknown on line 0

Есть идеи, где я ошибаюсь?

Ответы [ 2 ]

21 голосов
/ 11 июня 2011

В некоторых 32-битных системах PHP берет параметры памяти, такие как 2000M или 2G, и преобразует их в целое число байтов, не выполняя проверку границ.Тогда число, начинающееся с 2G или 2048M, будет -2147483648 байт.

Некоторые версии PHP ограничивают это в верхней части, поэтому оно не переходит в отрицательные числа (то есть 32-битная подпись).целочисленное ограничение).

Если вы хотите достичь максимально возможного количества байтов в такой системе, используйте 2147483647.Это равно двум гигабайтам минус один байт.

В качестве альтернативы, если вам необходимо работать с большими данными, рассмотрите 64-битную систему.

Кроме того, вам следует учитывать следующее:

Согласно руководству по PHP , настройка memory_limit является более важной.Если он не предлагает достаточно памяти, проверка размера данных после этого пройдет, но PHP не будет иметь достаточно памяти для фактической обработки данных после.Вы получите еще одну ошибку, чем, что память превышена.Поэтому, когда вы настраиваете свой PHP, позаботьтесь о том, чтобы post_max_size было меньше, чем memory_limit.

В вашем примере memory_limit равно 128M, поэтому он не может обрабатывать пост-данные большего размерачем ~ 128 мегабайт.

( Этот пост в блоге показывает, что может произойти и как ведут себя настройки большой памяти в 32-битной и 64-битной системах )

7 голосов
/ 11 июня 2011

Похоже, ваш "2000M" превышает целочисленный предел. Из руководства :

PHP допускает горячие клавиши для битовых значений, включая K (килограмм), M (мега) и G (гига). PHP сделает преобразования автоматически, если вы используете какой-либо из них. Будьте осторожны, чтобы не превысить предел 32-разрядного целого числа со знаком (если вы используете 32-разрядные версии), так как это приведет к сбою сценария.

попробуйте меньшее значение, скажем 1000M. 2 гигабайта входящих данных, вероятно, в любом случае маловероятны.

...