[英]PHP Upload - 500 Internal Server Error
上传大约8MB或以上的文件时,出现500内部服务器错误。
php.ini
中的所有PHP设置均正确 maxAllowedContentLength
从maxAllowedContentLength
可以看出,我正在使用IIS 7.5和FastCGI和PHP 5.3.17运行
我已经尝试了许多不同的方法来使它正常工作,但是根本找不到问题。
但是,我发现以下一些信息可能有助于弄清此问题的根源:
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_filesize
和post_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.