8

问题

上传大约 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 command出在 PHP 配置部分,因为当我更改.php文件的处理程序映射以使用 Pleskphp-cgi.exe而不是通常的处理程序映射时,我没有收到 500 内部错误。话虽如此,我不能把它留在这个 PHP 版本上,因为它是 Plesk 自己的exe并且还有其他配置问题。

我认为这可能与配置命令有关的原因仅仅是因为这两者之间存在巨大差异phpinfo()

如果您有任何想法或建议,请发表。据我所知,我已经尝试了一切,但似乎无法解决这个问题。要是Linux就好了……

提前致谢

更新 1

忘了补充,PHP 错误日志中没有返回错误。至于IIS错误,不知道去哪里找

更新 2

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

<security>
    <requestFiltering>
        <requestLimits maxAllowedContentLength="2147483647" /> 
    </requestFiltering>
</security>

更新 3

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

PHP 警告:12221448 字节的 POST 内容长度超过第 0 行未知中 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

更新 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" "--没有-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=共享”“--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_size在 Plesk 中更改该特定域/子域的 ,则不会发生任何更改(尽管在 中似乎已更改phpinfo())。但是,如果我实际上更改post_max_value了 php.ini 中的 ,那么这可以解决问题。

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

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

4

4 回答 4

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;
}

同样存在于文件中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_filesize两者post_max_size都是PHP_INI_PERDIR来自http://php.net/manual/en/configuration.changes.php的 PHP 文档

该目录的设置对于从此目录或其任何子目录运行的任何脚本都是活动的。键下的值应具有 PHP 配置指令的名称和字符串值。值中的 PHP 常量不会被解析。 但是,只有 PHP_INI_USER 中可更改的配置值可以这样设置,PHP_INI_PERDIR 值不能。

因此,即使 Plesk 有一个界面来更改这些指令,并且即使phpinfo()接受了它们,它们也不会改变实际的最大上传大小。Plesk 不应允许您在 Windows 上更改这些内容,phpinfo()也不应报告更改,但您能做什么。

所以,就是post_max_size,需要在php.ini上设置。Plesk 设置根本不起作用,即使 phpinfo 另有说明。我还打开了一个关于 phpinfo 行为的错误条目,因为它似乎没有条目。

于 2012-10-22T09:59:15.343 回答
2

这是一个相当常见的错误,因为上传的数据大小与文件大小不匹配:即使文件大小未超过 POST 最大大小也可能是上传的数据大小

请参阅PHP 手册中的此页面

; Maximum size of POST data that PHP will accept.
post_max_size = 8M

另一个麻烦来源(对于非常大的文本)是 UTF8 编码。您可能会发现自己有一个“6 兆字节”的 TEXTAREA,它实际上是 6 兆*字符*,而对于国际代码点,它可能会运行到 8.2 兆字节。因此,您会得到“6 MB 数据超过配置的 8 MB 限制”的明显矛盾的情况。

更新

你报告了两个明显矛盾的事实:

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 版本?两台不同的机器?)

于 2012-10-22T09:44:11.360 回答
0

IIS 将重新使用 FastCGI 进程。您需要关闭所有旧进程才能重新加载 php.ini。

编辑 FastCGI 模块并编辑 'monitor changes to file' 并选择 php.ini 文件。这将在您保存编辑时强制子进程重新启动。

于 2012-10-22T11:22:37.897 回答
0

您可以将限制设置为 -1,这样您就不会遇到文件大小的问题。它可能不是最好的解决方案,因为您基本上是在说“如果我看不到它,它就不存在”,但请相信,它确实可靠并且永远有效。

于 2017-01-03T23:38:10.620 回答