PHP无法找到tmp目录

时间:2011-06-21 12:13:26

标签: php apache tmp

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

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

的功能
sys_get_temp_dir()

但$ _ENV数组中没有对tmp目录的引用,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; } } 失败,如前所述。

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

如何找出tmp目录的位置或是否已设置?
这是apache服务器配置问题还是PHP问题?

感谢您的帮助

6 个答案:

答案 0 :(得分:2)

你可以在你的php.ini中设置上传临时目录 - 类似的东西应该有用:

upload_tmp_dir=/your-www/tmp/

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

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

答案 1 :(得分:2)

我正在运行Ubuntu 18.04,当我从CLI运行PHP脚本时,我可以在/ tmp目录中创建/修改文件,但是当我尝试访问与网页相同的脚本时,我无法找到该文件正在创建。事实证明,Apache默认情况下会创建一个私有的tmp目录。以下帖子提供了有关问题Odd Bits - Private /tmp directory的一些见解。但是,文章中提到的/ usr / lib / systemd目录在我的机器上不包含任何针对http或apache2的服务。为了帮助查找问题,我执行了以下命令:

sudo find / -mount -type f -exec grep -e "PrivateTmp" '{}' ';' -print

,并在 /lib/systemd/system/apache2.service 中找到,该地址在“奇数位”帖子中提到的 PrivateTmp = true 。将文件从/ lib / systemd / system复制到/ etc / systemd / system /,然后将 true 更改为 false 并执行

systemctl daemon-restart
systemctl restart apache2

解决了该问题。比我聪明的人建议将文件复制到/ etc而不是在/ lib中进行编辑是正确的做法,因为/ lib由软件包“拥有”,并且应在/ etc中进行本地编辑。 systemd man page详细描述了systemd配置过程。

答案 2 :(得分:1)

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

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

答案 3 :(得分: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;
}

答案 4 :(得分:0)

我遇到同样的问题,解决方法是更改​​apache配置以将TEMP变量公开给PHP,参见this post

答案 5 :(得分:0)

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

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

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

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