PHP Warning: POST Content-Length из 113 байт превышает предел -1988100096 байт в Unknown

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

Они могут загружать до 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

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

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

Любые идеи, в которых я ошибаюсь?

Ответ 1

В некоторых 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-битных системах.

Ответ 2

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

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

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