关于上传限制这个问题,特别是使用 docker nginx + php-fpm 的同学,可以参考一下。
本文解决两个问题:
- WordPress编辑文章上传图片时提示 HTTP 错误(404)
- 上传文件最大限制是 2 M 或者 8 M,修改限制
我直接说原因了:
http 404 是上传文件 100% 之后处理文件,但是文件处理文件的时候出现了问题,那么就应该修改 max_execution_time
;
如果是传输途中 http error,应该修改 async-upload 设置,包括 post 大小和 upload 大小。
网上的教程很多,也都说的很对。但是有个前提: 使用的原生的 wordpress + httpd/apache。
大致上的方案是:
- 修改 php.ini,可以不确定环境加载的 ini 文件,可以在网站的根目录自己新建一个 php.ini
- 修改 .htaccess 文件
- functions.php 里面用 ini_set() 函数
- 保证 /wp-content/uploads 具有可读写权限
大多数 wordpress 插件也都是这么干的,也米有错。
设置的内容如下:
file_uploads on 是否允许通过HTTP上传文件的开关。默认为ON即是开。
upload_tmp_dir – 文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
upload_max_filesize 8m 望文生意,即允许上传文件大小的最大值。默认为2M
post_max_size 8m 指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M。
一般来说,设置好上述四个参数后,在网络正常的情况下,上传<=8M的文件是不成问题的
但如果要上传>8M的大文件的话,只设置上述四项还不一定能行的通。除非你的网络真有100M/S的上传高速,否则你还得继续设置下面的参数。
max_execution_time 600 每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time 600 每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit 8m 每个PHP页面所吃掉的最大内存,默认8M
然而如果你使用的 nginx 的话,问题就不是这样了。
- nginx 有自己上传配置和超时传输时间, 并且多个站点的话,只能配置在 http 项里
- php-fpm 的配置默认会覆盖掉 php.ini 的配置,不信的话,你配置一下看看是不是不生效
- 容器里面这些参数都不能做 env 传递,所以还要传递配置文件
nginx 主要配置的是 client_max_body_size 100m;
,如果不配置 提示 http 错误,然后 attach 上去发现
1 | client intended to send too large body |
fpm的配置会覆盖 php.ini,所以要在 fpm 的 conf 文件中配置:
1 | php_value[memory_limit] = 128M |
注意,上面的配置部分 php_post_max_size
其实应该是 post_max_size
。
这里的 php_value
最该改成 php_admin_value
。
配置文件搜一下可以发现是 /usr/local/etc/php-fpm.d/www.conf
。(docker 容器里)
所以之后,如果你配置,那么响应的 docekr compose 文件也要修改。
最后效果如下:
Merlin 2018.3 遇到问题,心细 & 不放过任何一个异常信息