2015-10-05 80 views
-2

我想從特定類別中刪除超過特定年齡(例如2個月)的圖像。如何使用php刪除一些較舊的圖像?

這些圖像位於某個目錄裏,如果我用下面的代碼:

<?php 

// define the directory 
$dir = "images/"; 

// cycle through all files in the directory 
foreach (glob($dir."*") as $file) { 

    // if file is 2 Month (5.184e+6 seconds) old then delete it 
    if (filemtime($file) < time() - 5.184e+6) { 
     unlink($file); 
    } 
} 

?> 

則刪除所有2個月大的圖像,但我想按類別刪除圖像。

這是我的數據庫中的表:

------------------------------------ 
table msn_story_images 
------------------------------------ 
ID image(url) thumbnail sortstyID 

的圖像文件夾是相當大(約19GB),並且不能在服務器上列出。

+0

你使用什麼類型的數據庫,以及如何訪問它? – Fredd

+0

我正在使用mysql –

回答

2

好的,所以你只保存圖像的URL在數據庫中。我想你可以通過圖像的名稱在數據庫圖像和文件系統圖像之間建立邏輯關係。我建議首先從數據庫中獲取相關圖像,然後將它們放入只包含網址的平面數組中。瀏覽數組並轉換圖像名稱以省略前導URL部分。一個簡單的例子:

foreach($imagesWithUrl as $idx => $image) { 
    $imagesWithUrl[$idx] = basename($image); 
} 

然後,在你的循環,檢查該圖像陣列中從DB未來的所有腦幹:

/*** cycle through all files in the directory ***/ 
foreach (glob($dir."*") as $file) { 

    /*** if file is 2 Month (5.184e+6 seconds) old then delete it ***/ 
    if (filemtime($file) < time() - 5.184e+6 && in_array(basename($file), $imagesWithUrl)) { 
     unlink($file); 
    } 
} 
+0

我可以將它應用於任何風險因素嗎? –

+0

當然可以。爲了消除重大風險,請始終在本地或在您的開發環境中測試您的代碼。此外,在應用刪除作業時,請確保即將刪除的系統用戶僅對目標文件夾具有寫權限,而不具有對父文件夾的寫權限。 – jossif

+0

您的代碼運行良好,並顯示我的腳本已成功運行 –

0

我做這個劇本我的問題,如果更多的完美運行改善,然後告訴我

<?php 
$conn = new mysqli('localhost', 'freemed_mainuser', 'xDPf$$!O!H61','freemed_main'); 


$sql="select img.styid imgid,concat('sam_data/story/images/',img.image) as img,story.id storyid,story.title storytitle,story.insdatetime insdatetime from msn_story_images img , msn_stories story WHERE img.styid=story.id and insdatetime < DATE_SUB(CURDATE() , INTERVAL 60 
DAY) 
AND catid NOT 
IN (1, 86, 85, 88, 87) 
"; 
$data = mysqli_query($conn,$sql); 


while($row=mysqli_fetch_array($data)){ 

    unlink($row['img']); 

    echo "files deleted"; 



} 

/*and delete matching rows from DB*/ 
$del="DELETE msn_story_images, 
msn_stories FROM msn_stories INNER JOIN msn_story_images WHERE msn_story_images.styid = msn_stories.id AND msn_stories.insdatetime < DATE_SUB(CURDATE() , INTERVAL 60 DAY) AND msn_stories.catid NOT IN (1, 86, 85, 88, 87)"; 
$del_data=mysqli_query($conn,$del); 


?>