尽管拥有777权限且没有open_basedir值,但无法使用php写入/ tmp

时间:2012-05-25 10:03:53

标签: php fopen tmp php-safe-mode

我正在尝试使用php fopen函数将文件写入我的/ tmp目录(在apache服务器上),但它失败了:

<?php
$handle = fopen("/tmp/test.txt", "x");
if ($handle) echo "Success!";
else print_r(error_get_last());
?>

这将返回错误消息“无法打开流:没有此类文件或目录”。 / tmp目录的权限设置为drwxrwxrwt,我可以看到Web用户正在向其写入其他文件。神奇的是,如果我将脚本指向具有权限777的另一个文件夹,它将返回成功。但我的open_basedir“没有价值”。我有safe_mode = on和allow_url_fopen = off,但我认为不应该解释它吗?

这是关于apache 2.0的php 5.3.10。

4 个答案:

答案 0 :(得分:36)

我有完全相同的问题。 PHP报告在/tmp/myoutputfile中打开文件没有问题,但该路径中没有文件。然后我做了find / -name "myoutputfile"并在/tmp/systemd-.../myoutputfile找到了它。 Google找到了http://blog.oddbit.com/2012/11/05/fedora-private-tmp/。所以在我的情况下它是systemd + apache组合。希望这会对某人有所帮助。

答案 1 :(得分:1)

您的问题可能是由systemd和apache的组合引起的。这是一项称为PrivateTmp的安全功能,显然是一种选择退出。

如果您不想要它,可以这样禁用它:

  1. 将相应的开关 /etc/systemd/system/multi-user.target.wants/apache2.service#PrivateTmp=true
  2. 重新启动systemd:sudo systemctl daemon-reload
  3. 重新启动apache:sudo systemctl restart apache2

答案 2 :(得分:0)

根据显示的错误消息,没有文件夹/tmp/。也许tmp文件夹不是根目录?

如果文件实际上不存在,则不会显示此错误,因为它将尝试创建该文件。

如果文件已存在,方法x也会返回警告。 (doc:http://www.php.net/manual/en/function.fopen.php

我认为这也是另一个可能出错的原因,执行PHP的用户无权在/tmp/文件夹中写入。

答案 3 :(得分:0)

尝试将/tmp添加到open_basedir。例如:

    php_admin_value open_basedir /some/path:/another/path:/tmp

我不确定这是您实际遇到的问题,但我在寻找此解决方案时发现了您的问题,所以我想这可能有助于其他人。