gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:37:09 25 4
gpt4 key购买 nike

问题

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

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

  • 服务器信息

    maxAllowedContentLength 大概可以看出, 我正在运行 IIS 7.5 , 使用 FastCGI 和 PHP 5.3.17

    附加信息

    我已经尝试了很多不同的方法来让这个工作,但根本找不到问题。

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

  • 我认为问题出在configure command PHP配置的一部分 ,因为当我更改 .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 Warning: POST Content-Length of 12221448 bytes exceeds the limit of 8388608 bytes in Unknown on line 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信息非常不同:

    我的配置:

    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() info 说的是一件事,但显然被忽略了,不知道为什么。

    如果我更改 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 声明本地值不同?

    最佳答案

    如果你看 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 :

    As it turns out, on Windows, you can only set ini directives that are marked PHP_INI_USER per directory. Unfortunately, upload_max_filesize and post_max_size are both PHP_INI_PERDIR. From the PHP docs at http://php.net/manual/en/configuration.changes.php

    The settings for the directory would be active for any script running from this directory or any subdirectory of it. The values under the key should have the name of the PHP configuration directive and the string value. PHP constants in the values are not parsed. However, only configuration values changeable in PHP_INI_USER can be set this way, PHP_INI_PERDIR values can not.



    因此,即使 Plesk 有一个界面来更改这些指令,并且
    即使 phpinfo()接受他们,他们没有做任何改变
    实际的最大上传大小。 Plesk 不应允许您更改
    那些在 Windows 上,和 phpinfo()不应报告更改,但
    你能做什么。

    所以,它是post_max_size,它需要在php.ini 上设置。 Plesk 设置根本不起作用,即使 phpinfo 另有说明。我也开了 bug entry关于 phpinfo 行为,因为它似乎没有条目。

    关于PHP 上传 - 500 内部服务器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13007906/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com