【问题标题】:PHP Upload - 500 Internal Server ErrorPHP 上传 - 500 内部服务器错误
【发布时间】:2012-10-12 01:18:48
【问题描述】:

问题

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

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

服务器信息

maxAllowedContentLength 可以看出,我正在运行 IIS 7.5、FastCGI 和 PHP 5.3.17

附加信息

我尝试了很多不同的方法来解决这个问题,但根本找不到问题。

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

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

我认为问题在于 PHP 配置的 configure command 部分,因为当我将 .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>

更新 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” “--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() 信息在说一件事,但显然被忽略了,不知道为什么。

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

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

谁能想到为什么 PHP 会忽略本地值并恢复到 php.ini 中的值,即使 php.ini 声明本地值不同?

【问题讨论】:

  • php.ini 中的 upload_max_filesizepost_max_size 是正确的,真的吗? (我知道你已经写了,但只是为了确定 :))
  • 是的,他们是正确的。已使用phpinfo() 进行检查。只是为了测试,我将限制减少到 2MB 并尝试上传 3MB 文件,我收到的错误是我的自定义错误说“文件太大”,而不是“内部服务器错误”
  • maxRequestLength 在 web.config 中? ()
  • 错误日志说明了确切的问题?
  • @eis 出错了!!! :-) 将在答案中发布,现在应该能够解决这个问题

标签: php iis upload fastcgi internal-server-error


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您查看source code of 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。

    至于为什么,见this thread

    事实证明,在 Windows 上,您只能设置以下 ini 指令 每个目录标记为PHP_INI_USER。很遗憾, 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中设置。 Plesk 设置根本不起作用,即使 phpinfo 另有说明。我还打开了一个关于 phpinfo 行为的bug entry,因为它似乎没有条目。

    【讨论】:

    • 我已经找到了答案,但它并不好,将在几分钟内更新我的问题,以便您看到:-)
    • 回答已接受,非常感谢您的帮助。 Plesk 允许您更改无法更改的值,这不是很可悲吗?我现在已经在这个问题上花费了超过 12 个小时,而这正是我最初怀疑的!要是我费心尝试 php.ini 而不是使用 Plesk 面板就好了……无语……非常感谢您抽出宝贵的时间 +1
    • 为此打开了一个错误报告,看看他们是否至少会修复 phpinfo 输出:bugs.php.net/bug.php?id=63330
    【解决方案3】:

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

    编辑 FastCGI 模块并编辑“监控文件更改”并选择 php.ini 文件。这将在您保存编辑时强制子进程重新启动。

    【讨论】:

    • 我知道这一点,只需简单重启 IIS 即可
    • 好的,很好。我知道有一些人完全错过了这一点,在一些简单的事情上浪费了时间。
    【解决方案4】:

    这是一个相当常见的错误,是由于上传的数据大小与文件大小不匹配:即使您发布的最大大小未超过文件大小,可以是上传的数据大小

    请参阅 PHP 手册中的 this page

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

    【讨论】:

    • 玩过这个,但似乎不是问题:-(
    • 我注意到你的报告中有一些奇怪的地方。是的,这不是经常困扰我的通常限制(我似乎无法记住这个 PHP 怪癖),你遇到了更奇怪的东西。
    • 回复您的更新。两台不同的机器。 Plesk 管理所有的虚拟主机等,所以我不知道这是否导致了问题?
    • @BenCarey 但是,如果您在有问题的同一脚本中检查了 phpinfo() 中的值,我也不知道这可能是什么原因。
    • 奇怪的是,你现在就在我所在的位置!不知道是什么原因造成的,也不知道 Plesk 是如何解决这个问题的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2014-06-08
    • 2018-01-15
    • 2010-12-14
    相关资源
    最近更新 更多