为什么不能将信息写入/ tmp目录而不是/ var / www / html?

时间:2018-12-10 07:08:40

标签: php file-put-contents

在我本地计算机上安装的LAMP,因为我知道可以使用以下PHP函数将字符串xxxx写入/tmp/test

file_put_contents("/tmp/test","test1 test2") 

cat ajax_get.php

<?php
    $str = "test1 test2";
    ini_set('display_errors', 1);
    error_reporting(E_ALL);
    $str = implode(" ",$_GET);
    file_put_contents("/tmp/test",$str);
    print($str);
?>

为什么file_put_contents("/tmp/test",$str);中的命令ajax_get.php无法使用?

file_put_contents替换为

是没有用的
$handle=fopen("/tmp/test","w");
fwrite($handle,$str);
fclose($handle);

如果我更改ajax_get.php中的以下语句,也许是目录权限上的问题

    file_put_contents("/tmp/test",$str);

进入

    file_put_contents("test",$str);

并运行上一个过程,ajax_get.php/var/www/html/test中创建文件

cat /var/www/html/test
test1 test2

显示/tmp目录的权限。

ls -al /tmp
total 76
drwxrwxrwt 16 root    root    12288 Dec 10 18:39 .
drwxr-xr-x 23 root    root     4096 Dec  1 08:03 ..

.是当前目录/tmp,其权限为777(rwxrwxrwx), 为什么不能通过PHP将文件写入/tmp目录?

2 个答案:

答案 0 :(得分:12)

您不会与我们分享file_put_contents("/tmp/test",$str);的返回值,但我将假设您实际上是在写适当的字节。

在这种情况下,考虑到权限看起来还可以,并且您没有说正在得到错误消息,则最有可能的情况是systemd配置出现问题。

您的apache / PHP进程正在正确地写入该位置,但是systemd has a configuration setting that allows for each process to have its own /tmp directory

PrivateTmp=
    Takes a boolean argument. If true sets up a new file system
     namespace for the executed processes and mounts a 
     private /tmp directory inside it, that is not shared by     
     processes outside of the namespace. This is useful to secure 
     access to temporary files of the process, but makes sharing
     between processes via /tmp impossible. 

Defaults to false.

在这种情况下,您以普通用户或root用户看到的tmp与apache / php看到的tmp目录不同。例如,详细了解此here

您可以禁用apache的PrivateTmp设置,但是我认为选择不同的路径来存储文件并授予apache / PHP进程写入权限会更容易。

还有其他可能的解释,尽管有目录权限也无法写入tmp:该目录未添加到open_basedir指令中,或以某种方式添加到the directory immutable attribute got set中(对于/tmp来说是不太可能的)。但是在这些情况下,您都会收到一条错误消息。

答案 1 :(得分:-2)

file_get_contents方法的返回值在php manuel页上解释为 。此函数返回写入文件的字节数,如果失败则返回FALSE。 / em> 因此,file_get_contents必须是回报。首先,您必须检查此回报。

第二,您要为看起来只有一个权限的根用户创建一个文件到一个文件夹。 Apache用户没有root权限,因此您无法编写。请检查此url的权限,建议您更改文件夹的权限时要小心。