【发布时间】:2016-08-20 14:46:44
【问题描述】:
从 SO 上或 SilverStripe 论坛中的问题来看,我面临着一个非常常见的情况:文件上传失败。
但是,我的情况似乎源于一个我还没有在网络上遇到过的问题;通过阅读其他问题和许多博客文章或论坛主题,我已排除:
- 权限问题
-
PHP 配置中的
upload_max_filesize和post_max_size(均设置为8M) -
Apache 配置中的
LimitRequestBody(默认值为 0,表示“无限制”)
出于多种原因,我已经排除了这些可能性,但这张图片显示了上传有时可以正常工作的三个连续上传的示例:
我在 SilverStripe 论坛上也有 started a thread 解决这个问题,但我不太希望在那里解决问题。
我在Upload、UploadField 和File 类中设置了断点,并在代码中单步执行了几个小时,但未能成功确定错误原因。
到目前为止,我的发现是任何超过 128 kiB 的文件都会导致内部服务器错误。任何低于此大小阈值的文件都会按预期上传。
发生此错误时,所有日志(Apache、PHP、SilverStripe)都完全静音。
权限问题似乎不太可能,因为:
- PHP 作为 ISPConfig 创建的用户 (
web1) 在 Fast-CGI 模式下运行 - Apache 以用户
apache:apache运行 - 我已将
apache添加到用户组,以便groups web1给我web1 : client1 sshusers和groups apache给我apache : apache ispapps ispconfig client1 - 上传文件夹 (
assets) 归web1:client1所有,权限为 775 - 临时上传文件夹 (
upload_tmp_dir) 归web1:client1所有,权限为 775。
我相信我正在寻找的是一种以某种方式获取有关上传失败的位置和原因的信息的方法。 Apache的日志级别可以设置为“debug”还是“trace”?
注意:“类似问题”中的一个条目将我引导至 this answer,这暗示 SSLRenegBufferSize 默认情况下正好为 128 kiB。不幸的是,协议是HTTPS还是HTTP没有影响:问题出现了。
[编辑] 我后来将LogLevel 指令设置为trace,但我在服务器日志中仍然没有关于此错误的消息。
【问题讨论】:
-
您检查过
phpinfo()是否正确应用了您的配置(例如最大上传设置)? -
是的,这是我检查的第一件事。我在第一个项目符号列表中报告的值来自 phpinfo。
-
我敢打赌,如果您创建一个简单的 php 表单来自己上传文件,那么您会得到相同的行为,因此服务器配置问题更像是问题的根源。
-
@FinBoWa:你能发表你的评论作为答案吗?
FcgidMaxRequestLen确实是罪魁祸首。更改值解决了问题。
标签: php apache file-upload silverstripe