【问题标题】:mkdir fails in the /tmp directorymkdir 在 /tmp 目录中失败
【发布时间】:2013-08-03 16:14:38
【问题描述】:

我正在尝试在 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-Folder 没有这样的目录,并且该文件夹的所有后续写入或读取操作都会失败,因为该文件夹不存在。 /tmp 的权限是正确的(root:root with 777),我可以毫无问题地做sudo -u http mkdir -p /tmp/test。例如,如果我使用tmp/test,代码将运行良好并在 php-skript 的目录中创建一个文件夹(位于属于我的文件夹中,而不是 http-user ...)

关于为什么 php 无法在 /tmp/ 下创建文件夹但报告它存在的任何想法?

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

编辑: 跑完exec("mkdir -p /tmp/testfolder");

[daishy@littlezombie tmp]$ pwd
/tmp
[daishy@littlezombie tmp]$ ls -al
insgesamt 8
drwxrwxrwt 21 root   root   440  3. Aug 18:56 .
drwxr-xr-x 20 root   root  4096 10. Jun 16:49 ..
drwxrwxrwt  2 root   root    40  3. Aug 09:42 .font-unix
drwxr-xr-x  2 daishy users   60  3. Aug 14:40 hsperfdata_daishy
drwxrwxrwt  2 root   root    60  3. Aug 09:42 .ICE-unix
drwx------  2 daishy users   60  3. Aug 12:35 kde-daishy
drwx------  2 daishy users  140  3. Aug 18:49 ksocket-daishy
drwx------  3 root   root    60  3. Aug 18:54 systemd-private-5rIfGj
drwx------  3 root   root    60  3. Aug 09:42 systemd-private-HGNW9x
drwx------  3 root   root    60  3. Aug 09:42 systemd-private-od4pyY
drwx------  3 root   root    60  3. Aug 09:42 systemd-private-qAH8UK
drwxrwxrwt  2 root   root    40  3. Aug 09:42 .Test-unix
drwx------  4 daishy users   80  3. Aug 16:55 .Trash-1000
-r--r--r--  1 root   root    11  3. Aug 09:42 .X0-lock
drwxrwxrwt  2 root   root    60  3. Aug 09:42 .X11-unix
drwxrwxrwt  2 root   root    40  3. Aug 09:42 .XIM-unix

编辑: 事实证明,这不是 php 的问题,而是 systemd / apache 的问题。简而言之:systemd 在运行时为 apache 创建一个私有 tmp 文件夹,该文件夹位于 /tmp/systemd-private-XYZ 下。所以真正的/tmp 不能被php-skript 看到,而是私有的。 请参阅http://blog.oddbit.com/post/private-tmp-directories-in-fedora 了解更多信息。

【问题讨论】:

  • php有制作tmp文件的功能,为什么不用呢?
  • 要添加到 MightyPork:us1.php.net/manual/en/function.tmpfile.php 该函数被称为... tmpfile()
  • 我不是想创建一个临时文件,出于各种原因我需要一个新文件夹(其中还有一些对其他脚本的执行调用,也将数据存储在其中) .我可以在其他地方创建一个临时文件夹,但我仍然会对 php 无法在 /tmp 下创建文件夹的原因感兴趣。编辑:在问题中添加一些指定读/写操作的附加信息。
  • 你能用 bash 代替 PHP 创建文件夹吗?
  • 是的,正如我在帖子中提到的,我可以做到sudo -u http mkdir -p /tmp/test

标签: php exec mkdir


【解决方案1】:

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

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

更多信息请参见http://blog.oddbit.com/2012/11/05/fedora-private-tmp/

【讨论】:

【解决方案2】:

不要那样做。使用名为function, tmpfile() 的PHP。来自文档:

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

【讨论】:

  • 查看对问题发表评论的答案。
  • 也许您不应该在 /tmp 下创建文件夹?
  • 是的,这基本上是我的问题,因为我没有发现为什么不允许我在存在的保存临时数据的文件夹中写入内容。而且,即使是这样,为什么 is_dir 和 is_readable 会返回 true,如果没有创建文件夹。
  • 你能验证它们不是被创建的吗?喜欢调用 mkdir 后的文件夹截图?
  • Sooo,在添加上面的列表输出时,我找到了实际创建的文件夹,但在 /tmp/systemd-private-X 文件夹中。似乎 apache/php 在内部将 /tmp 重新路由到某个临时文件夹。 is_dir 似乎使用了修改后的路径,而我的tar-call 没有,这是一个问题。
猜你喜欢
  • 2013-01-07
  • 1970-01-01
  • 2021-01-31
  • 2013-02-07
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多