PHP上载-500内部服务器错误 问题

PHP上载-500内部服务器错误 问题,php,iis,upload,fastcgi,internal-server-error,Php,Iis,Upload,Fastcgi,Internal Server Error,当上传8MB或以上的文件时,我收到一个500的内部服务器错误 PHP.ini中的所有PHP设置都是正确的 maxAllowedContentLength已在web.config中设置 察看连接信息 从maxAllowedContentLength可以看出,我正在运行IIS7.5,使用FastCGI和PHP5.3.17 附加信息 我尝试了很多不同的方法来让它工作,但根本找不到问题所在 然而,我发现以下信息可能有助于找出这个问题的根源: 当使用服务器上的Media Wiki上传文件(较大的文件)时,

当上传8MB或以上的文件时,我收到一个500的内部服务器错误

  • PHP.ini
    中的所有PHP设置都是正确的
  • maxAllowedContentLength
    已在web.config中设置
  • 察看连接信息 从
    maxAllowedContentLength
    可以看出,我正在运行IIS7.5,使用FastCGI和PHP5.3.17

    附加信息 我尝试了很多不同的方法来让它工作,但根本找不到问题所在

    然而,我发现以下信息可能有助于找出这个问题的根源:

  • 当使用服务器上的Media Wiki上传文件(较大的文件)时,我收到了相同的错误,这表明我的代码中没有错误
  • 最重要的是-我在Plesk文件管理器中上传了一个18MB的文件,这显然意味着Plesk能够绕过这个配置问题。我曾尝试将所有Plesk控制面板设置复制到IIS中的该域,但这似乎不起作用
  • 在执行脚本之前返回错误,因为我已尝试编写
    exit在顶部尝试获得一个空白屏幕,但这将被忽略,并返回500错误
    我认为问题在于PHP配置的
    configure命令
    部分
    ,因为当我更改
    .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>
    
    更新5

    最后,为了防止任何人发现任何潜在的问题,Plesk完全可以上传大文件,所以我假设他们的php-cgi.exe的编译方式不同。当我读取其配置的phpinfo()时,
    configure命令
    信息非常不同:

    我的配置:

    cscript/nologo configure.js”--启用快照生成 --禁用isapi“”--启用调试包“”--不使用mssql “--不带pdo mssql”“--不带-pi3web” --使用pdo oci=C:\php sdk\oracle\instantclient10\sdk,共享 --with-oci8=C:\php sdk\oracle\instantclient10\sdk,共享 --with-oci8-11g=C:\php-sdk\oracle\instantclient11\sdk,共享 --enable object out dir=../obj/“”--enable com dotnet=shared --使用mcrypt=static“”--禁用静态分析

    普莱斯克的配置:

    cscript/nologo configure.js”--启用调试包”--启用cli --启用cgi”“--启用isapi”“--启用一次触发”“--启用pdo” --启用intl“”--使用openssl=shared“”--使用pdo odbc --使用iconv“”--使用xml“”--使用xsl“”--使用mysql --使用mysqlnd“”--使用mysqli“”--使用pdo sqlite --使用pdo mysql“”--使用curl=shared“”--启用mbstring --启用mbregex“”--使用imap=shared“”--启用套接字 --启用shmop“”--启用soap

    更新(答案) 这非常奇怪,因为
    phpinfo()
    info说明了一件事,但它显然被忽略了,不知道为什么

    如果我在Plesk中更改特定域/子域的
    post_max_size
    ,则不会更改任何内容(尽管在
    phpinfo()
    中它似乎已更改)。但是,如果我在php.ini中实际更改了
    post_max_值
    ,那么这就解决了问题

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


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

    这是一个相当常见的错误,原因是上载的数据大小与文件大小不匹配:即使文件大小没有超过POST max size,它可能是由上传的数据大小决定的

    请参阅PHP手册中的

    ; Maximum size of POST data that PHP will accept.
    post_max_size = 8M
    
    另一个问题来源(对于非常大的文本)是UTF8编码。您可能会发现自己有一个“6MB”的文本区域,实际上是6MB*字符*,而对于国际代码点,它可能会运行到8.2MB。因此,您会遇到一个明显矛盾的情况,“6兆字节的数据超过了配置的8兆字节限制”

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

    PHP settings as follows (from phpinfo()):
    
        post_max_size = 64M
    

    从PHPINFO可以清楚地看出,POST的限制为64M。然而,错误表明限制为8M(默认值)。因此,在我看来,您的代码与两个不同的PHP实现(两个不同的虚拟主机?同一主机中的CGI版本和非CGI版本?两台不同的机器?

    如果您查看,您可以在文件
    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警告:POST内容长度为12
    
    PHP Warning: POST Content-Length of 12221448 bytes exceeds the limit of 8388608 bytes
    
    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;
    }