首页 文章

PHP无法找到tmp目录

提问于
浏览
5

我在tmp目录中创建文件的函数有问题,例如 tmpfile()tempnam() . 他们似乎都没有写入tmp并返回false . upload_tmp_dir 在php ini中设置,文件上传工作正常 .

调试此错误时,我发现 sys_get_temp_dir() 获取了tmp目录的位置,遗憾的是我的PHP版本(5.1.6)不支持它 . 我还看到使用以下方法替换了 sys_get_temp_dir() 的功能:

if ( !function_exists('sys_get_temp_dir')) {
  function sys_get_temp_dir() {
    if (!empty($_ENV['TMP'])) { return realpath($_ENV['TMP']); }
    if (!empty($_ENV['TMPDIR'])) { return realpath( $_ENV['TMPDIR']); }
    if (!empty($_ENV['TEMP'])) { return realpath( $_ENV['TEMP']); }
    $tempfile=tempnam(__FILE__,'');
    if (file_exists($tempfile)) {
      unlink($tempfile);
      return realpath(dirname($tempfile));
    }
    return null;
  }
}

但是没有引用$ _ENV数组中的tmp目录,并且 tempnam() 失败,如前所述 .

还没有设置open_basedir,我听说会导致类似的问题

我怎样才能找到tmp目录的位置或是否设置了?
这是apache服务器配置问题还是PHP问题?

谢谢你的帮助

5 回答

  • 0

    可能不是最干净但这适用于我的旧5.1.6安装:

    function get_temp_path() {
      static $path = null;
      if ($path !== null) return $path;
      $file = tmpfile();
      $meta = stream_get_meta_data($file);
      fclose($file);
      $path = dirname($meta['uri']);
      return $path;
    }
    
  • 0

    你可以在你的php.ini中设置上传临时目录 - 这样的东西应该工作:

    upload_tmp_dir=/your-www/tmp/
    

    此外,如果您无法编辑php.ini或不想全局执行,您可以在脚本的开头使用它:

    ini_set('upload_tmp_dir','/your-home-www/tmp/');
    
  • 1

    我有同样的问题,解决方案是更改apache配置以将TEMP变量暴露给PHP,请参阅this post .

  • 2

    TMP,TEMP(也许是TMPDIR)仅在Windows上有效,通常指向 C:\Windows\TEMP . 在Linux上,默认临时位置是 /tmp . 要解决此问题(适用于 tempnam() 函数),您可以在网站空间的某处创建临时文件夹,指定适当的访问权限并将其作为第一个参数传递给上述函数 .

    不是一个好的解决方案,但总比没有好 .

  • 0

    像我这样的新手提示:我认为PHP无法从我的临时文件夹移动东西,但我只是因为文件夹的相对位置而感到困惑 . 这可能适用于其他人,所以我会解释,即使它与这个特定问题非常相关(因为这个特定问题可能是像我这样的新手的其他人的搜索结果) .

    我的问题是我在/ var / www / html /中回复了一个上传表单来自/ var / www / html /中的functions.php文件到/ var / www / html / user /中的一个profile.php文件,它在/中调用了一个uploadphoto.php文件无功/ www / html等/ . 上传的文件最终打算登陆/ var / www / html / uploads . 这最终意味着我对uploadphoto.php和上载/在functions.php中的大多数引用分别写成“../uploadphoto.php”或“../uploads/[etc.jpg]”,以便分步回到html / from html / user /(其中回显的代码落在html / user / profile.php中) . 这导致我直观地使用uploadphoto.php中的以下命令而不考虑它:

    move_uploaded_file($_FILES["file"]["tmp_name"][0], "../uploads/$filename")
    

    看到问题了吗? uploadphoto.php和uploads /在同一个目录中,所以我不需要../ here . 几个小时,我确信我再次弄乱了我的文件夹权限,因为我是图像上传的新手 . 我忘了检查更简单的错误 . 希望这有助于其他人 .

相关问题