40

我正在尝试使用 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=onand allow_url_fopen=off,但我认为这不应该解释吗?

这是 Apache Httpd 2.0 上的 PHP 5.3.10。

4

4 回答 4

64

我有完全相同的问题。PHP 报告在 中打开文件没有问题/tmp/myoutputfile,但该路径中没有文件。然后我做了

find / -name "myoutputfile"

并在/tmp/systemd-…/myoutputfile. 我在谷歌上找到了这篇文章
所以,就我而言,它是 Systemd 和 Apache Httpd 的组合。我希望这会对某人有所帮助。

于 2014-04-17T19:37:54.197 回答
20

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

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

  1. 输出相应的开关 /etc/systemd/system/multi-user.target.wants/apache2.service#PrivateTmp=true
  2. 重启系统:sudo systemctl daemon-reload
  3. 重启阿帕奇:sudo systemctl restart apache2
于 2019-11-21T09:57:51.327 回答
1

尝试添加/tmpopen_basedir. 例如:

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

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

于 2014-03-16T09:34:57.337 回答
0

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

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

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

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

于 2012-05-25T10:12:28.400 回答