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

And*_*lie 22 php fopen php-safe-mode tmp

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

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

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

这是关于apache 2.0的php 5.3.10.

And*_*hov 41

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

  • 我正在使用CentOS,并通过将文件写入`/ tmp`来测试脚本.我从命令行浏览`/ tmp`并找不到它们.他们在一个`systemd-private ...`文件夹中! (4认同)
  • 为什么地狱这种行为? (2认同)
  • 有没有办法从PHP获取这个"私人文件夹"的整个路径?(我的意思是"/tmp/systemd-private-b6fcf4393484blahblah87c822516fdfb-plesk-php70-fpm.service-OWpvrW/") (2认同)

unt*_*ill 18

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

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

  1. 注释相应的开关 /etc/systemd/system/multi-user.target.wants/apache2.service#PrivateTmp=true
  2. 重启 systemd: sudo systemctl daemon-reload
  3. 重启阿帕奇: sudo systemctl restart apache2

  • 我在 Centos 7 和 Apache 2.4 上的“/etc/systemd/system/multi-user.target.wants/httpd.service”。 (2认同)
  • PrivateTmp 不应该破坏您的 PHP 脚本。 (2认同)

Ren*_*Pot 0

根据显示的错误信息,没有文件夹/tmp/。也许 tmp 文件夹位于根目录之外的其他位置?

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

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

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