解决虚拟主机的 max_input_vars 限制

正在使用的这个Uncode 主题上上个月发了新版本,但我迟迟不敢升级,像这种自定义度极高又内置一堆关联插件的超级主题,总是担心升级的时候会出幺蛾子。

由于禁不住新版本中增加了一个叫“Matrix 模式”的新功能诱惑,最后还是一咬牙点了更新按钮。然后怀着忐忑的心情检查前后端,貌似一切正常,清空缓存再检查一遍,依然一切正常,然后平静地睡了。

直到前几天修改了主题设置,打破了这份平静——终于还是出了问题。

像往常一样调整了几处主题设置,然后就发现前端页面样式加载不完整,精心配置的小工具全部消失,字体字号颜色混乱……反正就是出问题了,怎么改主题设置都不起作用。

按照“清缓存、换主题、禁插件”的黄金套路检查了一圈,问题依旧,差点就准备恢复备份。最后无意中注意到了后台的一条异常提醒(平时后台的插件提醒太多,根本没在意),点进了这个页面,是主题设置中的信息页:

总算找到了原因,开始折腾解决。

PHP Max Input Vars

从 PHP 5.3.9 开始默默地增加了 max_input_vars 这个变量,用来限制提交的表单数量,默认值1000。可能老版本主题的设置数据量没超过这个值,以前没处理也没出什么问题,新版本主题则会丢失一部分设置数据,导致那些乱七八糟的页面问题。

因为用的是虚拟主机,没办法直接修改服务器上的 php.ini 文件,只能用替代的自定义方案。

  1. 在本地新建 php.ini 文件,添加一行配置代码 max_input_vars = 3000
  2. 将文件上传到 WordPress 站点所在的根目录下,不出意外就应该能生效了
  3. 要是还没效果,可以在 .htaccess 文件添加 SetEnv PHPRC /home/USERNAME/public_html/,其中 USERNAME 为你的 cPanel 账号

按照这种自定义方案,理论上可以修改 php.ini 文件中的任何参数,比如还可以修改下面这些常用的限制:

;上传文件的大小限制
upload_max_filesize = 2M
;内存限制
memory_limit = 128M
;同时上传的文件数限制
max_file_uploads = 20

WordPress Memory Limit

在 PHP 中 memory_limit 的默认值为128M,这里是因为 WordPress 自己做了“单站点40M + 多站点64M”的内存限制,所以需要在主题中修改。

  1. 打开根目录下的 wp-config.php 文件
  2. 在里面添加 define( 'WP_MEMORY_LIMIT', '96M' );
  3. 如果想超过128M 就要用上面的方法自定义 php.ini

照上面修改后所有前端样式都恢复了正常,但丢失的设置数据就真的丢了。幸好出问题之前有自动备份,那些小工具布局、自定义CSS 什么的都愉快地找了回来,又可以平静地睡了。

这个故事告诉我们,备份真的很重要!