PHP上载-500内部服务器错误 问题
当上传8MB或以上的文件时,我收到一个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上传文件(较大的文件)时,
PHP.ini
中的所有PHP设置都是正确的maxAllowedContentLength
已在web.config中设置maxAllowedContentLength
可以看出,我正在运行IIS7.5,使用FastCGI和PHP5.3.17
附加信息
我尝试了很多不同的方法来让它工作,但根本找不到问题所在
然而,我发现以下信息可能有助于找出这个问题的根源:
exit代码>在顶部尝试获得一个空白屏幕,但这将被忽略,并返回500错误李>
我认为问题在于PHP配置的configure命令
部分,因为当我更改.PHP
文件的处理程序映射以使用PleskPHP 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;
}