问题
上传大约 8MB 或更大的文件时,我收到 500 内部服务器错误。
- 中的所有 PHP 设置
php.ini
都是正确的 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
文件的处理程序映射以使用 Pleskphp-cgi.exe
而不是通常的处理程序映射时,我没有收到 500 内部错误。话虽如此,我不能把它留在这个 PHP 版本上,因为它是 Plesk 自己的exe
并且还有其他配置问题。
我认为这可能与配置命令有关的原因仅仅是因为这两者之间存在巨大差异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-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--without-mssql" "--without-pdo-mssql" "--没有-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=共享”“--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()
信息说的是一件事,但显然被忽略了,不知道为什么。
如果我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 声明本地值不同?