技巧: WordPress upload 最终解决方案

关于上传限制这个问题,特别是使用 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
2
3
4
5
php_value[memory_limit] = 128M
php_value[max_execution_time] = 120
php_value[max_input_time] = 300
php_value[php_post_max_size] = 84M
php_value[upload_max_filesize] = 64M

注意,上面的配置部分 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 遇到问题,心细 & 不放过任何一个异常信息

|