PHP上传 - 500内部服务器错误

Ben*_*rey 8 php iis upload fastcgi internal-server-error

问题

上传大约8MB或更大的文件时,我收到500内部服务器错误.

  1. 所有PHP设置php.ini都是正确的
  2. maxAllowedContentLength 已在web.config中设置

服务器信息

正如人们可以从中看出的那样maxAllowedContentLength,我运行的是IIS 7.5,使用FastCGI和PHP 5.3.17

附加信息

我已经尝试了很多不同的东西来使这个工作,但根本找不到问题.

但是,我发现以下信息可能有助于找出问题的根源:

  1. 当使用我在服务器上的Media Wiki上传文件(较大的文件)时,我收到相同的错误,这表明它在我的代码中不是错误.
  2. 最重要的是 - 我设法在Plesk文件管理器中上传了一个18MB的文件,这显然意味着Plesk能够解决这个配置问题.我试图将所有Plesk控制面板设置复制到IIS中的此域,但这似乎不起作用.
  3. 在执行脚本之前返回错误,因为我尝试exit;在顶部写入以尝试获取空白屏幕,但这将被忽略并返回500错误.

我认为问题在于configure commandPHP配置的部分,因为当我更改.php文件的处理程序映射以使用Plesk php-cgi.exe而不是通常的时,我没有得到500内部错误.话虽如此,我不能把它放在这个PHP版本上,因为它是Plesk自己的exe,还有其他配置问题.

我认为它可能与configure命令有关的原因仅仅是因为它与其中一个有很大不同phpinfo().

如果您有任何想法或建议,请发布.我已经尝试了所有知识,似乎无法解决这个问题.如果只是Linux ...

提前致谢

更新1

忘记添加,PHP错误日志中没有返回错误.至于IIS错误,我不知道在哪里看

更新2

这是我在我的web.config文件中放置的内容:

<security>
    <requestFiltering>
        <requestLimits maxAllowedContentLength="2147483647" /> 
    </requestFiltering>
</security>
Run Code Online (Sandbox Code Playgroud)

更新3

在您的帮助下,我们设法获得IIS显示的错误.这是我收到的:

PHP警告:POST Content-Length为12221448字节超过了第0行的Unknown中的8388608字节限制

这跟那个有关系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
Run Code Online (Sandbox Code Playgroud)

更新5

最后,为了防止任何人发现任何潜在的问题,Plesk能够绝对正常上传大文件,所以我认为他们的php-cgi.exe编译方式不同.当我读取他们配置的phpinfo()时,configure command信息非常不同:

我的配置:

cscript/nologo configure.js"--​​enable-snapshot-build"" - disable-isapi"" - enable-debug-pack"" - without-mssql"" - without-pdo-mssql"" - without-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-analyze"

Plesk的配置:

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-sockets"" - enable-shmop"" - enable-soap"

更新(答案) 这是非常奇怪的,因为phpinfo()信息说一件事,但它显然被忽略,不知道为什么.

如果我更改了post_max_sizePlesk,对于该特定的域/子域,则没有任何更改(尽管它似乎已更改phpinfo()).但是,如果我实际上post_max_value在php.ini中更改了,那么这就解决了这个问题.

之所以这不是解决这个问题的好方法,原因很简单,因为当Plesk更新时,php.ini会被覆盖,因为PHP会更新,结果对php.ini所做的更改就会丢失.这意味着每次Plesk更新我都需要对php.ini进行更改.这就是为什么Plesk能够在不更改php.ini的情况下更改PHP设置的原因.

任何人都可以想到为什么PHP忽略本地值并恢复到php.ini中的值,即使php.ini声明本地值不同?

eis*_*eis 3

如果你查看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;
}
Run Code Online (Sandbox Code Playgroud)

文件中也有同样的内容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 上,您只能设置PHP_INI_USER按目录标记的 ini 指令。不幸的是, upload_max_filesizepost_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 上设置。即使 phpinfo 另有说明,Plesk 设置根本不起作用。我还打开了一个关于 phpinfo 行为的错误条目,因为似乎没有该条目。