2012-05-25 87 views
13

我试图写一个文件到我/ tmp目录(在apache服务器上)与php fopen函数,但它失败:尽管777权限和没有open_basedir值不能写入到/ tmp与php,尽管777权限和没有open_basedir值

<?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。

+2

'test.txt'存在吗? – maialithar

+0

不,上述脚本的要点是测试我是否可以在我的/ tmp文件夹中创建文件。我已经用'x'和'w'标志试过脚本。 –

+1

chrooted也许? – Robus

回答

0

根据显示的错误信息,没有文件夹/tmp/。也许tmp文件夹在根目录以外的地方?

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

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

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

+0

正如我在这个问题中写的那样,在我的服务器上有一个名为/ tmp的文件夹,是的,它驻留在根目录下,并且我可以告诉用户执行php的文件不会将文件连续写入/ tmp文件夹。 –

0

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

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

我不知道这是你真的面临这个问题,但是我发现你的问题而寻找这种解决方案,所以我想这可能帮助别人。

17

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

+1

我正在使用CentOS,并正在通过将文件写入'/ tmp'来测试脚本。我从命令行浏览'/ tmp',并找不到它们。他们在一个'systemd-private ...'文件夹中! –

+2

为什么地狱这种行为? –

+0

有没有办法从PHP获得这个“私人文件夹”的整个路径? (我的意思是让“/tmp/systemd-private-b6fcf4393484blahblah87c822516fdfb-plesk-php70-fpm.service-OWpvrW/”) – OMA