Загрузка PHP – 500 Внутренняя ошибка сервера

Проблема

При загрузке файлов размером около 8 МБ или более я получаю 500 внутренних ошибок сервера.

  1. Все настройки PHP в php.ini верны
  2. maxAllowedContentLength установлено в maxAllowedContentLength web.config

Информация о сервере

Как можно, скажем, из maxAllowedContentLength , я запускаю IIS 7.5 , с FastCGI и PHP 5.3.17

Дополнительная информация

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

Однако я нашел следующие фрагменты информации, которые могут помочь выяснить корень этой проблемы:

  1. При загрузке файлов (более крупных) с использованием Media Wiki, которые у меня есть на сервере, я получаю ту же ошибку, это показывает, что это не ошибка в моем коде.
  2. Самое главное – мне удалось загрузить 18-мегабайтный файл в Plesk File Manager, это, очевидно, означает, что Plesk смог обойти эту проблему с конфигурацией. Я попытался скопировать все параметры панели управления Plesk в этот домен в IIS, но это, похоже, не работает.
  3. Ошибка возвращается до выполнения скрипта, поскольку я попытался написать 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, таким образом, у вас никогда не будет проблем с размером файлов. Вероятно, это не лучшее решение, поскольку вы в основном говорите «если я этого не вижу, его нет», но верьте, он действительно надежный и всегда будет работать.