繁体   English   中英

PHP上传-500 Internal Server Error

[英]PHP Upload - 500 Internal Server Error

问题

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

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

服务器信息

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

附加信息

我已经尝试了许多不同的方法来使它正常工作,但是根本找不到问题。

但是,我发现以下一些信息可能有助于弄清此问题的根源:

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

我认为问题出在PHP配置的configure command部分内 ,因为当我更改.php文件的处理程序映射以使用Plesk php-cgi.exe而不是通常php-cgi.exe ,我没有得到500 Internal错误。 话虽如此,我不能将其保留在此PHP版本上,因为它是Plesk自己的exe并且还有其他配置问题。

我认为可能与configure命令有关的原因仅仅是因为这从一个phpinfo()到另一个phpinfo()很大的不同。

如果您有任何想法或建议,请发布它们。 我已尽一切努力尝试了一切,但似乎无法解决。 如果只是Linux ...

提前致谢

更新1

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

更新2

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

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

更新3

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

PHP警告:12221448字节的POST内容长度超出了第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 

更新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,共享”“” --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 =共享“” --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“”-启用-mbstring“” --enable-mbregex“” --with-imap = shared“” --enable-sockets“” --enable-shmop“” --enable-soap“

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

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

之所以不是解决此问题的好方法,原因仅在于当Plesk更新时,由于更新PHP而覆盖了php.ini,因此丢失了对php.ini所做的更改。 这意味着每次Plesk更新时,我都需要对php.ini进行更改。 这就是为什么Plesk可以更改PHP设置而无需更改php.ini的原因。

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

如果查看PHP源代码 ,则可以在文件php-5.4.8-src\\main\\rfc1867.c行中看到:

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-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设置有关。 您已经通过使用phpinfo()确认已正确配置了此设置,但是无论如何它似乎正在使用默认值8M。

至于为什么,请看这个线程

事实证明,在Windows上,您只能在每个目录中设置标记为PHP_INI_USER ini指令。 不幸的是, upload_max_filesizepost_max_size都是PHP_INI_PERDIR 来自位于http://php.net/manual/zh/configuration.changes.php的PHP文档

从该目录或该目录的任何子目录运行的任何脚本的目录设置均处于活动状态。 键下的值应具有PHP配置指令的名称和字符串值。 不解析值中的PHP常量。 但是,只能以这种方式设置PHP_INI_USER中可更改的配置值,而不能设置PHP_INI_PERDIR值。

因此,即使Plesk具有更改这些指令的接口,即使phpinfo()了这些指令, 它们也不会更改实际的最大上传大小。 Plesk不允许您在Windows上进行更改,并且phpinfo()不应报告更改,但是您可以做什么。

因此,它是post_max_size,需要在php.ini中设置。 即使phpinfo另有说明,Plesk设置也无法正常工作。 我也打开了一个关于phpinfo行为的错误条目 ,因为似乎没有它的条目。

这是一个相当常见的错误,是由于正在上传的数据大小与文件大小不匹配 :即使POST最大大小未超出文件大小 ,也可能是已上传的数据大小

请参阅PHP手册中的此页面

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

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

更新资料

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM