phpMyAdmin导入文件错误的解决办法

技术 2729 次围观 9 次吐槽

phpMyAdmin 这货的升级速度确实是快,今天已然升级到 4.2.3 了,打算升级一下 phpMyAdmin 并简单测试一下,在导入文件的时候发生以下错误:
Uploaded file cannot be moved, because the server has open_basedir enabled without access to the directory (for temporary files).
而在之前的版本 4.2.2 的时候,导入文件是没有问题的。相同的环境,因为版本升级而导致的问题,那肯定是代码有变动了。于是开始比较两个版本之间有什么不同。

既然是导入文件出的问题,那就来比较一下 phpMyAdmin 根目录下的 import.php 文件。
版本 4.2.2 的 import.php 中第 376 行:

$tmp_subdir = sys_get_temp_dir();

版本 4.2.3 的 import.php 中第 376 行:

$tmp_subdir = ini_get('upload_tmp_dir');

从代码中可以看出,导入文件的临时目录的获取方式变更了。前者使用了 PHP 的函数 sys_get_temp_dir 返回用于临时文件的目录;后者使用了 PHP 的函数 ini_get 来获取 php.ini 配置文件里 upload_tmp_dir 的值。如果在 php.ini 中 upload_tmp_dir 的值没有定义的话,那就会出现以上的错误。
LAMP一键安装脚本中,默认的 php.ini 中没有设置 upload_tmp_dir 的值(此处在官方的 php.ini-production 中也未定义),所以解决办法就是:
在 php.ini 中将 upload_tmp_dir 设为 /tmp 即可。
如果安装环境是 LAMP一键安装脚本 的话,则修改文件位于 /usr/local/php/etc/php.ini,其他的环境则根据实际情况找到 php.ini 来修改。
修改前:

;upload_tmp_dir =

修改后:

upload_tmp_dir = /tmp

在 Apache 的配置文件 httpd-vhosts.conf 中定义的 php_admin_value open_basedir 已包含了 /tmp 目录。而关于 /tmp 目录的权限一般已默认是 777 ,具备了可写权限。
按照上述步骤修改完 php.ini 后,需重启 Apache 。

service httpd restart

重启完毕,再次登录 phpMyAdmin 并导入文件就一切正常了。

最后吐槽 phpMyAdmin:
phpMyAdmin 导入文件的代码(import.php)中,导入文件的临时目录的获取方式几度变更,在版本4.0.8 中则是这样的:

$tmp_subdir = (PMA_IS_WINDOWS ? '.\\tmp\\' : 'tmp/');

在设置了 open_basedir 的情况下,最终(最新版 4.2.3)的解决方案是跟 php.ini 里的设置绑定了。那如果用户不能设置(比如虚拟主机用户) php.ini 中的 upload_tmp_dir 那不就意味着无法使用导入文件功能了么。
个人觉得,可以加个判断条件,如果从  php.ini 中读到的 upload_tmp_dir 的值为空,则改用 sys_get_temp_dir 函数获取用于临时文件的目录,然后再来判断获得的目录是否具备可写权限。这里给出的参考代码如下:

$tmp_subdir = ini_get('upload_tmp_dir'); 

if (empty($tmp_subdir)) {
    $tmp_subdir = sys_get_temp_dir();
}


2014年06月21日更新:
phpMyAdmin 更新到 4.2.4 后,import.php 如我所料地改成了以上我给出的建议代码。

参考链接:
http://docs.phpmyadmin.net/en/latest/faq.html#i-cannot-insert-a-text-file-in-a-table-and-i-get-an-error-about-safe-mode-being-in-effect
http://sourceforge.net/p/phpmyadmin/bugs/4405/

转载请注明:秋水逸冰 » phpMyAdmin导入文件错误的解决办法

发表评论
取消评论
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
表情

已有评论 (9)

  1. 我这版本不同,不行
    素材火6个月前 (2017-05-27)回复
  2. Ramnode SA机房速度真不行 订了一年的用了半个月就换了 Linode
    Matthew3年前 (2014-07-10)回复
    • 这个归根结底还是国内 ISP 的问题,出口网络的问题再怎么换机房都没用。
      秋水逸冰3年前 (2014-07-11)回复
  3. 能够把问题解决公布出来就是个好博客
    屠龙3年前 (2014-07-03)回复
  4. 真是帮了个大忙。在Arch Linux里,就downgrade最好。因为加了upload_tmp_dir也不能解决。
    allen3年前 (2014-06-22)回复
  5. 文章的图片太大了
    追梦3年前 (2014-06-19)回复
    • 599*424分辨率,131KB的图片还算大么?图片,css,js等静态资源都用了七牛加速,应该不会加载缓慢的吧。
      秋水逸冰3年前 (2014-06-20)回复
  6. 博主的文章真的帮了大忙。博主是在用DigitalOcean吗?
    So Simple3年前 (2014-06-14)回复
    • 我也是在使用过程中发现问题,网上没有解决方案,于是就自己调查了。没错,我是在用 DigitalOcean 的。
      秋水逸冰3年前 (2014-06-14)回复