根本原因是php上传限制与phpmyadmin 4.4主题上传机制双重拦截;必须同步修改php.ini(upload_max_filesize=64m、post_max_size=128m、memory_limit=256m、file_uploads=on)、upload_tmp_dir权限,以及config.inc.php中添加ini_set('upload_max_filesize','64m'),并确保zip包结构规范、theme.json存在且name非空。
phpmyadmin 4.4 中上传主题包(.zip)失败,报错如 file upload error - cannot move uploaded file 或直接卡在上传界面无响应,根本原因不是主题包本身大,而是 php 的上传限制 + phpmyadmin 主题机制双重拦截——它走的是普通表单上传路径,不是“导入目录”那种绕过限制的方案。
为什么改了 php.ini 还不行?
phpMyAdmin 4.4 的主题上传功能(themes/upload.php)依赖标准 $_FILES 流程,但它的校验逻辑比普通导入更激进:
- 它会先调用
move_uploaded_file(),而该函数失败时不会抛出明确错误,只静默返回false - 它不读取
$cfg['UploadDir']配置,也就是说你配了$cfg['uploaddir']对主题上传完全无效 - 它硬编码检查了
ini_get('upload_max_filesize')值,如果 PHP 返回的是2M(哪怕你改成了64M),它可能因单位解析失败直接拒收
必须同步修改的三个位置
只改 php.ini 或只改 config.inc.php 都不够,缺一不可:
-
php.ini中确保这三项都设够且单位一致:upload_max_filesize = 64M、post_max_size = 128M、memory_limit = 256M(注意大小写,M不能写成m) -
php.ini中确认file_uploads = On,且upload_tmp_dir指向一个真实存在、PHP 进程有写权限的目录(比如/var/tmp) -
config.inc.php中添加一行:ini_set('upload_max_filesize', '64M');—— 这是给 phpMyAdmin 自身运行时环境补一道保险,防止它读不到 php.ini 的值
上传前必须手动解压再重打包
phpMyAdmin 4.4 的主题上传器对 ZIP 包结构极其敏感,常见失败场景:
- 压缩包根目录不是单层文件夹(比如你打包的是
mytheme/,但实际压缩时选中了整个父目录,导致解压后变成parent/mytheme/) - ZIP 中含 macOS 的
__MACOSX元数据或隐藏文件(.DS_Store),phpMyAdmin 解压时会跳过或报错 - 主题文件夹名含空格或中文,例如
我的主题,上传后路径解析失败
正确做法:unzip 解开原包 → 删除所有 __MACOSX 和 .DS_Store → 确保只剩一个干净文件夹 → 用 zip -r mytheme.zip mytheme/ 重新压缩(Linux/macOS)或 7-Zip(Windows)选“存储”模式压缩,禁用加密和注释。
上传后主题不显示?检查 themes/ 目录权限和 owner
即使上传成功,主题仍不列在下拉菜单里,大概率是权限问题:
- 确认
phpMyAdmin/themes/目录权限为755,且所属用户/组与 PHP-FPM worker 进程一致(比如www-data:www-data) - 上传后的主题文件夹(如
phpMyAdmin/themes/mytheme/)权限也必须是755,内部文件至少644 - 如果用 FTP 上传过文件,很可能 owner 变成
ftpuser,需执行:chown -R www-data:www-data themes/mytheme - phpMyAdmin 4.4 不支持子目录嵌套主题,
themes/mytheme/css/可以,但themes/mytheme/v2/css/会被忽略
最易被忽略的一点:phpMyAdmin 4.4 的主题加载器会扫描 themes/ 下所有**一级子目录**,但要求每个子目录内必须存在 theme.json(不是 info.json 或 metadata.json),且其中 "name" 字段不能为空字符串。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











