При загрузке файлов размером около 8 МБ или более я получаю 500 внутренних ошибок сервера.
php.ini
верны maxAllowedContentLength
установлено в maxAllowedContentLength
web.config Как можно, скажем, из maxAllowedContentLength
, я запускаю IIS 7.5 , с FastCGI и PHP 5.3.17
Я пробовал так много разных вещей, чтобы заставить это работать, но просто не могу найти проблему.
Однако я нашел следующие фрагменты информации, которые могут помочь выяснить корень этой проблемы:
exit;
вверху, чтобы попытаться получить пустой экран, но это игнорируется и возвращается 500 ошибок. Я думаю, что проблема заключается в части команды configure конфигурации PHP , потому что, когда я изменяю отображение обработчика .php
файлов для использования Plesk php-cgi.exe
вместо обычного, я не получаю 500 внутренних Ошибка. Сказав это, я не могу оставить его в этой версии PHP, поскольку это собственный exe
Plesk, и есть другие проблемы с конфигурацией.
Причина, по которой я думаю, что это может быть связано с командой configure, просто потому, что это сильно отличается от одного phpinfo()
к другому.
Если у вас есть какие-либо идеи или предложения, разместите их. Я все испробовал, и, похоже, не могу это исправить. Если бы это был Linux …
заранее спасибо
ОБНОВЛЕНИЕ 1
Забыв добавить, в журнале ошибок PHP нет ошибок. Что касается ошибок IIS, я не знаю, где искать
ОБНОВЛЕНИЕ 2
Это то, что я поместил в свой файл web.config
:
<security> <requestFiltering> <requestLimits maxAllowedContentLength="2147483647" /> </requestFiltering> </security>
ОБНОВЛЕНИЕ 3
С вашей помощью нам удалось получить сообщение об ошибке, отображаемое IIS. Это то, что я получаю:
PHP Warning: POST Content-Length из 12221448 байт превышает предел 8388608 байт в Unknown в строке 0
Это связано с post_max_size
?
ОБНОВЛЕНИЕ 4
Настройки PHP следующим образом (из phpinfo()
):
post_max_size = 64M memory_limit = 128M max_file_uploads = 20 max_execution_time = 6000 upload_max_filesize = 64M
ОБНОВЛЕНИЕ 5
Наконец, на всякий случай, когда кто-либо может выявить любые потенциальные проблемы, Plesk может загружать большие файлы абсолютно нормально, поэтому я предположил, что их php-cgi.exe был скомпилирован по-разному. Когда я читал phpinfo () их configure command
информация configure command
была совсем другой:
Моя конфигурация:
msgstr " без-pi3web "" –with-pdo-oci = C: \ php-sdk \ oracle \ instantclient10 \ sdk, shared "" –with-oci8 = C: \ php-sdk \ oracle \ instantclient10 \ sdk, shared " "–with-oci8-11g = C: \ php-sdk \ oracle \ instantclient11 \ sdk, shared" "–enable-object-out-dir = .. / obj /" "–enable-com-dotnet = shared "" –with-mcrypt = static "" –disable-static-analysis "
Конфигурация Plesk:
cen / cscript / nologo configure.js "–enable-debug-pack" "–enable-cli" "–enable-cgi" "–enable-isapi" "–enable-one-shot" "–enable- pdo "" –enable-intl "" –with-openssl = shared "" –with-pdo-odbc "" –with-iconv "" –with-xml "" –with-xsl "" – -with-mysql "" –with-mysqlnd "" –with-mysqli "" –with-pdo-sqlite "" –with-pdo-mysql "" –with-curl = shared "" –enable -mbstring "" –enable-mbregex "" –with-imap = shared "" –enable-socket "" –enable-shmop "" –enable-soap "
UPDATE (ANSWER) Это очень странно, поскольку информация phpinfo()
говорит одно, но, очевидно, ее игнорируют, не зная почему.
Если я изменю post_max_size
в Plesk, для этого конкретного домена / поддомена, то ничего не изменится (хотя, похоже, оно изменилось в phpinfo()
). Однако, если я действительно изменяю post_max_value
в php.ini, это устраняет проблему.
Причина, по которой это не является хорошим способом исправить это, просто потому, что когда Plesk обновляется, php.ini перезаписывается, поскольку PHP обновляется, и в результате изменения, внесенные в php.ini, теряются. Это означает, что каждый раз, когда Plesk обновляется, мне нужно будет внести изменения в php.ini. Вот почему Plesk предлагает возможность изменять настройки PHP без внесения изменений в php.ini.
Может ли кто-нибудь подумать о том, почему PHP игнорирует локальное значение и возвращается к значению в php.ini, хотя php.ini утверждает, что локальное значение отличается?
Если вы посмотрите на исходный код PHP , вы можете увидеть в файле php-5.4.8-src\main\rfc1867.c
строку 706-709 это:
if (SG(post_max_size) > 0 && SG(request_info).content_length > SG(post_max_size)) { sapi_module.sapi_error(E_WARNING, "POST Content-Length of %ld bytes exceeds the limit of %ld bytes", SG(request_info).content_length, SG(post_max_size)); return; }
То же самое можно php-5.4.8-src\main\SAPI.c
в файле php-5.4.8-src\main\SAPI.c
Итак, сообщение PHP Warning: POST Content-Length of 12221448 bytes exceeds the limit of 8388608 bytes in Unknown on line 0
это настройка post_max_size. Вы подтвердили с помощью phpinfo (), что этот параметр настроен правильно, но, похоже, все равно использует значение по умолчанию 8M.
Что касается, почему, посмотрите эту тему :
Как оказалось, в Windows вы можете устанавливать только директивы ini, помеченные как
PHP_INI_USER
каждого каталога. К сожалению,upload_max_filesize
иpost_max_size
являются какPHP_INI_PERDIR
. Из документов PHP по адресу http://php.net/manual/en/configuration.changes.phpНастройки для каталога будут активны для любого скрипта, запущенного из этого каталога или любого его подкаталога. Значения под ключ должны иметь имя директивы конфигурации PHP и значения строки. Константы PHP в значениях не анализируются. Однако только значения конфигурации, изменяемые в PHP_INI_USER, могут быть установлены таким образом, значения PHP_INI_PERDIR не могут.
Таким образом, даже если Plesk имеет интерфейс для изменения этих директив, и даже несмотря на то, что
phpinfo()
набирает их, они ничего не делают, чтобы изменить фактические максимальные размеры загрузки. Plesk не должен позволять вам изменять их в Windows, аphpinfo()
не должен сообщать об изменениях, но что вы можете сделать.
Итак, это post_max_size, и его нужно установить на php.ini. Установка Plesk просто не будет работать, хотя phpinfo говорит иначе. Я также открыл запись об ошибке в поведении phpinfo, поскольку для нее не было записи.
Это довольно распространенная ошибка и связано с тем, что размер загружаемых данных не соответствует размеру файла : даже если размер файла POST max не превышает размер файла , это может быть размер загруженных данных .
См. Эту страницу в руководстве по PHP.
; Maximum size of POST data that PHP will accept. post_max_size = 8M
Другим источником проблем (для ОЧЕНЬ больших текстов) является кодировка UTF8. Вы можете найти себе «шесть мегабайт» TEXTAREA, который на самом деле составляет 6 мега * символов *, а с международными кодовыми точками он может работать до, скажем, 8,2 мегабайта. Таким образом, вы получаете явно противоречивую ситуацию: «шесть мегабайт данных превышают установленный предел в 8 мегабайт».
Вы сообщаете два явно противоречивых факта:
PHP settings as follows (from phpinfo()): post_max_size = 64M
а также
PHP Warning: POST Content-Length of 12221448 bytes exceeds the limit of 8388608 bytes
Из PHPINFO видно, что предел для POST составляет 64M . Однако ошибка говорит о том, что предел равен 8M (по умолчанию). Итак, мне кажется, что ваш код говорит о двух разных реализациях PHP (два разных виртуальных хоста: версия CGI и версия, отличная от CGI, на одном и том же хосте: две разные машины ?)
IIS будет повторно использовать процессы FastCGI. Вам нужно будет убить любые старые процессы, чтобы перезагрузить php.ini.
Отредактируйте модуль FastCGI и отредактируйте 'monitor changes to file' и выберите файл php.ini. Это заставит дочерние процессы перезапускаться всякий раз, когда вы сохраняете редактирование.
Вы можете повернуть пределы до -1, таким образом, у вас никогда не будет проблем с размером файлов. Вероятно, это не лучшее решение, поскольку вы в основном говорите «если я этого не вижу, его нет», но верьте, он действительно надежный и всегда будет работать.