-->

PHP上传 - 500内部服务器错误(PHP Upload - 500 Internal Serv

2019-07-01 16:36发布

问题

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

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

服务器信息

正如人们或许可以从告诉maxAllowedContentLength ,我运行IIS 7.5,用的FastCGI和PHP 5.3.17

附加信息

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

然而,我发现信息,可以帮助找出此问题的根源的下列位:

  1. 上传时使用媒体文件,维基(较大的),我在服务器上,我收到了同样的错误,这正好表明它是不是在我的代码中的错误。
  2. 更重要的是 -我设法在上传的Plesk文件管理器的文件18MB,这显然表示Plesk是能够得到解决此问题的配置。 我曾尝试所有的Plesk控制面板设置在该域在IIS中复制,但是这似乎并没有工作。
  3. 在脚本执行之前被返回的错误,因为我已经试着写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警告: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-快照生成”, “ - 禁用ISAPI” “--enable-调试包” “--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对象-OUT-DIR = .. / OBJ /”“--enable-COM-DOTNET =共享”, “--with-mcrypt的=静态” “ - 禁用静态分析”

Plesk的配置:

CSCRIPT / NOLOGO configure.js “--enable-调试包” “--enable-(CLI)” “--enable-CGI” “--enable-ISAPI” “--enable-一次性”“--enable- PDO “ ”--enable-国际机场“, ”--with-OpenSSL的共享=“ ”--with-PDO-ODBC“ ”--with-的iconv“ ”--with-XML“ ”--with-XSL“” - -with-MySQL的 “ ”--with-mysqlnd“ ”--with-mysqli的“ ”--with-PDO-源码“, ”--with-PDO-MySQL的“, ”--with卷曲=共享“” --enable -mbstring” “--enable-mbregex” “--with-IMAP =共享”, “--enable-套接字” “--enable-shmop” “--enable皂”

UPDATE(ANSWER)这是因为极其怪异phpinfo()信息是说一个事情,但它显然是被忽略了,不知道为什么。

如果我改变post_max_size Plesk中,对于特定的域/子域名,再没有什么改变(虽然它出现在已经改变phpinfo() 但是,如果我真的改变post_max_value在php.ini那么这个修复该问题。

之所以这样,是不是解决这个问题的好办法,很简单,因为Plesk更新时,在php.ini覆盖为PHP已更新并且最终以丢失php.ini中所做的更改。 这意味着每次Plesk更新我需要TOT他php.ini中进行更改。 这就是为什么Plesk中提供更改PHP设置无需改变在php.ini的能力。

任何人都可以想到,为什么PHP是忽略了当地的价值,并在php.ini恢复到值,即使php.ini中指出,当地的价值是不同的?

Answer 1:

如果你看一下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上,你只能设置标记INI指令PHP_INI_USER每个目录。 不幸的是, upload_max_filesizepost_max_sizePHP_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行为似乎没有成为它的条目。



Answer 2:

这是一个相当常见的错误,是由于这样的事实, 数据的大小上载不符合文件大小 :即使您发布的最大容量不是由文件的大小超过了,也可能是由上传的数据大小

请参见本页面 PHP手册。

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

麻烦的另一来源(对于非常大的文本)是UTF8编码。 你可能会发现自己有“六兆” TEXTAREA,实际上是600万个*字符*,以及它可能运行,比方说,8.2兆字节码点国际。 因此,你得到的“六兆点字节的数据超过配置的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版本在同一主机?两台不同的机器 ?)



Answer 3:

IIS将重新使用FastCGI进程。 你需要杀死任何旧工艺得到的php.ini重装。

编辑FastCGI模块和编辑“监视对文件”并选择php.ini文件。 这将迫使子进程每次保存编辑重新启动。



Answer 4:

你可以把限制为-1,这样一来,你永远不会有关于文件的大小烦恼。 这可能是没有最好的解决方案,你基本上是说:“如果我没有看到它,它不存在”,但我们相信,它是真正可靠的,就没有问题。



文章来源: PHP Upload - 500 Internal Server Error