在我本地计算机上安装的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
目录?
答案 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的权限,建议您更改文件夹的权限时要小心。