为什么使用递归选项创建目录(mkdir)时会失败?

10
我运行了以下代码:
mkdir('mnt/1',0777,true);
mkdir('mnt/a',0777);

创建了目录“a”,但未创建目录“1”,页面会显示警告。
Warning: mkdir(): File exists in /home/bitrix/www/php_test.php on line 3

我正在运行的apache用户对mnt目录具有完全权限:

drwxr-xr-x 1 bitrix bitrix   4096 Nov 28 10:10 mnt

PHP版本- PHP 5.3.3。Apache版本2.2.15。

有什么想法,为什么使用递归选项设置为true时mkdir会失败?

更新! 好的,我清空了文件夹,做了以下php脚本并再次运行它:

<?php
        error_reporting(E_ALL);
        mkdir('mnt/1',0777,true);
        mkdir('mnt/2/',0777,true);
        mkdir('./mnt/3',0777,true);
        mkdir('./mnt/4/',0777,true);

        mkdir('mnt/a',0777);
        mkdir('mnt/b/',0777);
        mkdir('./mnt/c',0777);
        mkdir('./mnt/d/',0777);
?>

这是输出结果:
Warning: mkdir(): File exists in /home/bitrix/www/php_test.php on line 3 
Warning: mkdir(): File exists in /home/bitrix/www/php_test.php on line 4 
Warning: mkdir(): File exists in /home/bitrix/www/php_test.php on line 5 
Warning: mkdir(): File exists in /home/bitrix/www/php_test.php on line 6

以下是脚本执行后文件夹mnt的内容:
drwxr-xr-x  1 bitrix bitrix  4096 Nov 28  2012 .
drwxrwx--- 11 bitrix bitrix 12288 Nov 28 11:10 ..
drwxr-xr-x  1 bitrix bitrix     0 Nov 28  2012 a
drwxr-xr-x  1 bitrix bitrix     0 Nov 28  2012 b
drwxr-xr-x  1 bitrix bitrix     0 Nov 28  2012 c
drwxr-xr-x  1 bitrix bitrix     0 Nov 28  2012 d

我还尝试了递归 mkdir 的绝对路径 - 仍然没有成功,而非递归 mkdir 则无论路径如何都能正常工作。递归 mkdir 出了什么问题?我还没有头绪... 更新! 进一步调查发现,这种情况发生是因为 mnt 是一个文件夹,由命令挂载。
mount -t cifs -o username=***user***,password=***password***,uid=bitrix,gid=bitrix,iocharset=utf8,codepage=866 //192.168.1.6/folder /home/bitrix/www/mnt

在所有其他目录中,递归mkdir都可以正常工作,而在该目录中仅非递归mkdir可以工作!更新!当从名为mnt的文件夹中运行时,脚本中的mkdir(由femtoRgon假定)可以同时正常递归和非递归地工作。但我仍然弄不明白,为什么从/home/bitrix/www运行时会失败?我甚至尝试使用选项file_mode = 0775,dir_mode = 0775进行挂载 - 没有运气。我的操作系统是CentOS 6.3,如果这很重要...

你在mnt中已经有一个名为1的目录了吗? - Arjan
没有“a”或“1”目录存在于脚本执行之前。 - Georgy Nemtsov
创建完'a'目录后,它的所有者/组和权限是什么? 另一个想法是递归调用可能试图更改'mnt'目录的权限,而这个apache用户没有拥有。 - mkilmanas
请提交您的所有代码。您的警告来自第3行,但您只显示了2行代码。 - zaf
啊哈!我在想,如果递归mkdir不必遍历挂载点(例如从mnt内执行mkdir('a/b/', 0777, true)),是否会起作用。无论如何,回答自己的问题是可以的,所以请回答吧! - femtoRgon
3个回答

2

在一番搜索后,我在 php.net 上找到了答案。这与 serverino 挂载选项有关。当我使用 noserverino 挂载文件夹时,所有问题都得到解决。无论如何,感谢大家的帮助!


0
您可以尝试在第一个参数后附加一个斜杠字符。
mkdir('./mnt/1/',0777,true);

0

这是创建目录的正确方式:

mkdir('/test1/test2', 0777, true);

mkdir("test1/test2",0777,true);

所以你的错误可能在一些缺失的行上。而不是你创建目录的方式。

更多细节可以在这里查看:http://php.net/manual/en/function.mkdir.php


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接