Php mkdir在/tmp目录中失败

Php mkdir在/tmp目录中失败,php,exec,mkdir,Php,Exec,Mkdir,我试图在php中创建一个文件夹,但每次使用/tmp/…作为路径时,代码都会失败: exec("mkdir -p /tmp/test/ 2>&1", $output, $return_code); // $output is empty, $return_code is 0 //mkdir("/tmp/test/"); // Alternative to above is_dir("/tmp/test/"); // returns true is_readable("/tmp/te

我试图在php中创建一个文件夹,但每次使用
/tmp/…
作为路径时,代码都会失败:

exec("mkdir -p /tmp/test/ 2>&1", $output, $return_code);
// $output is empty, $return_code is 0
//mkdir("/tmp/test/"); // Alternative to above

is_dir("/tmp/test/"); // returns true
is_readable("/tmp/test/"); // returns true
但是,如果我检查
/tmp
-文件夹,则没有这样的目录,并且所有后续对该文件夹的写入或读取操作都会失败,因为该文件夹不存在。
/tmp
的权限是正确的(root:root with 777),我可以毫无问题地执行
sudo-u http mkdir-p/tmp/test
。例如,如果我使用
tmp/test
,代码将正常运行,并在php SKcript目录中创建一个文件夹(位于属于我的文件夹中,而不是http用户的文件夹中…)

关于为什么php无法在
/tmp/
下创建一个文件夹,但报告它在那里,有什么想法吗

编辑: 指定读写操作:这些操作不是来自我自己的脚本,而是外部脚本,php脚本调用这些脚本来执行不同的任务。一旦所有操作都成功,文件夹就会被压缩并复制到其他地方

编辑: 运行
exec(“mkdir-p/tmp/testfolder”)

编辑: 事实证明,这不是php的问题,而是systemd/apache的问题。简而言之:systemd在运行时为apache创建一个私有tmp文件夹,该文件夹位于/tmp/systemd private XYZ下。因此,真实的
/tmp
不是php脚本所能看到的,而是私有的。
有关更多信息,请参阅。

不要这样做。使用PHP的惊人调用。从文档中:

$temp = tmpfile();
fwrite($temp, "writing to tempfile");
fseek($temp, 0);
echo fread($temp, 1024);
fclose($temp); // this removes the file

事实证明,这不是php的问题,而是systemd/apache的问题。简而言之:systemd在运行时为apache创建一个私有tmp文件夹,该文件夹位于/tmp/systemd private XYZ下。因此,真实的/tmp不能被php脚本查看,而是私有的

要禁用此行为,可以在/usr/lib/systemd/system/httpd.service中设置PrivateTmp=false


有关更多信息,请参阅。

php具有生成tmp文件的函数,为什么不使用它们呢?添加到MightyWork中:该函数的名称令人惊叹
tmpfile()
我不想创建一个临时文件,我需要一个新文件夹,原因有很多(一些exec调用了其中的其他skript,这些skript也存储了数据)。我可以在其他地方创建一个临时文件夹,但我仍然对php无法在/tmp下创建文件夹感兴趣。编辑:在问题中添加一些指定读/写操作的附加信息。你能用bash而不是PHP创建一个文件夹吗?是的,正如我在帖子中提到的,我可以做
sudo-uhttpmkdir-p/tmp/test
查看对问题的评论答案。也许你不应该在/tmp下创建文件夹?是的,这基本上是我的问题,因为我没有发现为什么不允许我在保存临时数据的文件夹中写入内容。而且,即使是这样,如果文件夹没有创建,为什么\u dir和\u readable返回true。您能验证它们没有创建吗。就像调用mkdir?Sooo后的文件夹截图一样,在添加上面的列表输出时,我找到了实际创建的文件夹,但在
/tmp/systemd-private-X
文件夹中。apache/php似乎在内部将
/tmp
重新路由到某个临时文件夹
is_dir
似乎使用了修改后的路径,而my
tar
-call没有使用,这是一个问题。对于现在发现此问题的任何人,这似乎是Oddbits的更新链接:
$temp = tmpfile();
fwrite($temp, "writing to tempfile");
fseek($temp, 0);
echo fread($temp, 1024);
fclose($temp); // this removes the file