无法从特定时间段内创建的目录中删除文件

时间:2014-07-04 06:54:31

标签: php

我有一个图片共享网站,当用户上传图片时,我的代码会根据日期(年/月)在飞行中创建目录

    $year = date('Y');
    $month  = date('m');
    $path = ("images/{$year}/{$month}/");
    if (!file_exists($path))
    mkdir($path,0777,TRUE);

所以最近我注意到我无法删除我的一些图像(通过php代码),在查看之后我发现我的一些目录不可写,尽管我可以上传图片(或至少我可以在那些年/月)

所以基本上它是我无法删除图像的目录。

我写了这个小代码来结账dirs

for($i = 1 ; $i < 13 ; $i++){
    if($i <= 9 )
    $i = '0'.$i;
    echo    $file = base_path('/files/images/2013/'.$i.'/');
    echo '  # IS_DIR ==>' ; var_dump(is_dir(($file)));
    echo '  # IS_WRIT ==>' ; var_dump(is_writable(($file)));
    echo '<br />';
}

所以结果如下:

enter image description here

/home/domains/site.com/public_html/files/images/2013/01/ # IS_DIR ==>true # IS_WRIT ==>true
/home/domains/site.com/public_html/files/images/2013/02/ # IS_DIR ==>true # IS_WRIT ==>true
/home/domains/site.com/public_html/files/images/2013/03/ # IS_DIR ==>true # IS_WRIT ==>true
/home/domains/site.com/public_html/files/images/2013/04/ # IS_DIR ==>true # IS_WRIT ==>true
/home/domains/site.com/public_html/files/images/2013/05/ # IS_DIR ==>true # IS_WRIT ==>true
/home/domains/site.com/public_html/files/images/2013/06/ # IS_DIR ==>true # IS_WRIT ==>true
/home/domains/site.com/public_html/files/images/2013/07/ # IS_DIR ==>true # IS_WRIT ==>true
/home/domains/site.com/public_html/files/images/2013/08/ # IS_DIR ==>true # IS_WRIT ==>true
/home/domains/site.com/public_html/files/images/2013/09/ # IS_DIR ==>true # IS_WRIT ==>false
/home/domains/site.com/public_html/files/images/2013/10/ # IS_DIR ==>true # IS_WRIT ==>false
/home/domains/site.com/public_html/files/images/2013/11/ # IS_DIR ==>true # IS_WRIT ==>false
/home/domains/site.com/public_html/files/images/2013/12/ # IS_DIR ==>true # IS_WRIT ==>false

enter image description here

/home/domains/site.com/public_html/files/images/2014/01/ # IS_DIR ==>true # IS_WRIT ==>false
/home/domains/site.com/public_html/files/images/2014/02/ # IS_DIR ==>true # IS_WRIT ==>true
/home/domains/site.com/public_html/files/images/2014/03/ # IS_DIR ==>true # IS_WRIT ==>true
/home/domains/site.com/public_html/files/images/2014/04/ # IS_DIR ==>true # IS_WRIT ==>true
/home/domains/site.com/public_html/files/images/2014/05/ # IS_DIR ==>true # IS_WRIT ==>true
/home/domains/site.com/public_html/files/images/2014/06/ # IS_DIR ==>true # IS_WRIT ==>true 

从2013/09到2014/01,我的目录似乎发生了一些事情

尽管权限/ GID / UID中的某些更改在图片中是显而易见的,但它似乎并不是问题,因为某些可写dirs具有相同的设置。

我不知道为什么会这样,我会感激任何帮助或建议

5 个答案:

答案 0 :(得分:4)

问题是,您尝试通过PHP删除它们,但这些目录的权限设置为755,所有者:组设置为sitecom:sitecom。这意味着apache无法删除它们。

尝试更改(如果您有权限)所有者:分组到apache:apache,然后您就可以从PHP脚本中删除它们。

答案 1 :(得分:1)

我的猜测是你通过FTP创建了这个文件夹:

/home/domains/site.com/public_html/files/images/2014/01/

现在你无法通过PHP更改它,因为PHP正在使用的用户没有删除该文件夹的权限,因为该用户不是文件所有者。

更改此文件夹的权限:

/home/domains/site.com/public_html/files/images/2014/01/ # IS_DIR ==>true # IS_WRIT ==>false

通过FTP与作为文件/文件夹所有者的用户连接,您应该能够将所有者更改为PHP正在使用的用户。

答案 2 :(得分:0)

尝试屏幕截图中的Recursive复选框。

答案 3 :(得分:0)

您尝试删除的文件夹中的某些文件可能会在其他地方通过代码打开,但由于某种原因尚未关闭。

答案 4 :(得分:0)

你从未向我们展示过删除的代码,但我建议用php执行exec()命令,然后使用-f标志执行rm。

exec("rm -rf images/2014/{$i}/");

-f标志强制解决问题,-r删除其中的子目录。