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 входящих данных, вероятно, вряд ли в любом случае.