Sterge continut dupa o perioada de timp

Am un site unde utilizatorii pot posta postari cu continut video/foto/audio
Site-ul incarca continutul video/foto/audio pe server inainte sa insereze postarea in baza de date Mysql. Daca utilizatorul renunta sa posteze, fisierele imi raman in server.

Cum as putea programa stergerea fisierelor si anularea in cazul in care utilizatorul posteaza?
Am nevoie de o solutie care sa nu consume multe resurse

Schimbi ordinea, upload-ul la urmă.

Creează un script php care să citească fișierele. Apoi, compară data creării fișierelor cu data actuală. Dacă a trecut mai mult de “x” minute, atunci mergi mai departe și vezi dacă există postarea cu fișierul respectiv. Dacă nu există, ștergi fișierul.

Iar ca să automatizezi treaba asta setezi un cron job care să acceseze script-ul la un anumit timp. De exemplu la ora 3 dimineața. Sau din oră în oră. Cum crezi tu.

Câteva link-uri ajutătoare:

https://www.php.net/manual/en/function.glob.php
https://www.php.net/manual/en/function.filectime.php
https://www.php.net/manual/en/function.unlink
https://www.google.com/search?q=how+to+set+a+cron+job&hl=en&oq=how+to+set+a+cron+job

4 Likes

Cum as putea sa fac o exceptie pentru fisierele gasite?


  $files = glob("content/uploads/photos/2021/04/*");
  $now   = time();

  foreach ($files as $file) {
    if (is_file($file)) {
      if ($now - filemtime($file) >= 60 * 2 * 1 * 1) { // 2 minutes
       // echo(''.$file.'<br>');
		$file_source = str_replace("content/uploads/","",$file);
		
		global $db;
		$result = $db->query(sprintf("SELECT * FROM posts_photos WHERE source = %s", secure($file_source))) or _error("SQL_ERROR_THROWEN");
		
		
		unlink('content/uploads/'.$file_source.'');

		
      }
    }
  }

Sau lansezi o comanda (cron) care sterge fisierele mai vechi de 1h. Iar tot ce s-a uploadat cu succes muti in alt director si savezi calea in BD.

Ar trebui în query să folosești count și mai departe să verifici dacă $result === 0 (adică dacă nu s-au găsit rânduri), ștergi fișierul.

PS: Să știi că eu mai sus ți-am răspuns la întrebarea ta, dar ideal ar fi ca fișierele să fie încărcate într-un alt folder, gen content/temp_uploads/, și apoi, când utilizatorul adaugă postarea, să muți fișierele în folderul “content/uploads/”. După vei putea folosi codul de mai sus ca să golești folderul content/temp_uploads/, fără să mai fie nevoie de query. Cred că la asta s-a referit și alexjorj.

1 Like

Solutia oferita de tine prima data e mult mai buna, am deja fisiere vechi, inutile care trebuie sterse.

echo $file_source imi afiseaza toate fisierele mai vechi de 2 minute
echo $row[ ‘source’ ] imi afiseaza toate fisierele utile
Cum pot scoate din $file_source - $row[ ‘source’ ] pentru a defini o noua variabila cu fisierele inutile ?

  $files = glob("content/uploads/photos/2021/04/*");
  $now   = time();

  foreach ($files as $file) {
    if (is_file($file)) {
      if ($now - filemtime($file) >= 60 * 1 * 1 * 1) { // 2 minutes
       // echo(''.$file.'<br>');
		$file_source = str_replace("content/uploads/","",$file);
		
		global $db;
		$result = $db->query(sprintf("SELECT * FROM posts_photos WHERE source = %s", secure($file_source))) or _error("SQL_ERROR_THROWEN");
	
		while ($row = mysqli_fetch_assoc($result)) {
			echo $row[ 'source' ]."<br />";
			
		}
		
      }
    }
  }

Dacă am înțeles bine:

<?php
$query = $db->query("SELECT source FROM posts_photos") or _error("SQL_ERROR_THROWEN");

$database_files = [];
while ($row = mysqli_fetch_assoc($query)) {
	$database_files[] = $row['source'];
}

$unuseful_files = array_diff(
	$database_files,
	array_map(
		function($value){
			return str_replace("content/uploads/", "", $value);
		},
		glob("content/uploads/photos/2021/04/*")
	)
);

$now = time();

foreach($unuseful_files as $unuseful_file)
{
	if($now - filemtime($unuseful_file) >= 60 * 1 * 1 * 1)
	{
		unlink($unuseful_file);
	}
}
2 Likes