2015-10-17 11 views
10

Mam stronę, na której ludzie publikują obrazy, ludzie mogą polubić post, tak jak w tabeli jest wiersz, jeśli ktoś usuwa post, chciałbym usunąć każdy wiersz dla tego konkretnego posta. Liczba może być bardzo duża, jak 15 000 lub więcej, czas oczekiwania może być długi dla użytkownika, który usunął wpis.Jak usunąć tysiące wierszy z PHP i MySQL w tle?

Aby usunąć wpis, należy użyć formularza, w którym chciałbym usunąć 15 000 wierszy z innego skryptu w tle. Jak mogę to osiągnąć?

+1

Jeśli masz obce ograniczenia klucza, możesz [USUNĄĆ KASKADĘ] (http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html): ale niezależnie od to, upewnij się, że masz przyzwoite indeksowanie i że masowe usuwanie nie powinno być poważnym problemem –

+0

Co powiesz na [mysql create event] (https://dev.mysql.com/doc/refman/5.1/en/create-event .html). Ustaw flagę. wydarzenie to podnosi (wybierasz interwał). Wbudowana funkcja crona. Coś jak [to] (http://stackoverflow.com/a/32193862), które napisałem. W twoim przypadku twoje instrukcje usunięcia wystąpiłyby z kaskadowaniem lub bez w zależności od konfiguracji – Drew

+1

Po prostu oznaczę ten wpis jako usunięty i ustawię zadanie cron do czyszczenia wszystkich podobnych spraw do wszystkich usuniętych wpisów. – Berriel

Odpowiedz

9

Wiele opcji. Jest to bardziej decyzja architektoniczna/inżynieryjna niż cokolwiek innego. Wrzucę pomysł.

Zacznij od miękkich operacji usuwania. Zamiast faktycznie usuwać wpis (i jego relacje), ustaw status na usunięty. Miej konfigurację zadania CRON podczas czasu wolnego, aby uruchomić zapytanie, aby uzyskać posty ze statusem usuniętego i usunąć wszystko na dobre w tym czasie.

Właśnie zauważyłem @Berril zasugerował to samo w swoich komentarzach.

Na marginesie, czy usunięcie naprawdę 15 000 wierszy zajmie tyle czasu?

DELETE FROM `table` WHERE post_id = x 

Wygląda na to, że wykonamy szybko, ale nie widząc struktury danych, trudno powiedzieć na pewno.

+1

+1 za polecanie miękkiego usunięcia. aby dodać do tego, OP może mieć tabelę archiwum, do której możesz przenieść "usunięty" post do. w ten sposób możesz nadal generować dokładne raporty dla celów wewnętrznych. Usuwanie w ogóle nie jest świetnym pomysłem, ale jest kilka przypadków, w których jest. –

+0

Problem z dowolnym podejściem z prostą instrukcją DELETE polega na tym, że nie bierze ona pod uwagę wszystkich indeksów i pamięci podręcznej zapytań, które trzeba przebudować. – itoctopus

3

Użyj Ajax. spróbuj wykonać poniższy skrypt, aby zażądać innej strony, aby usunąć wiersze w tle.

<script> 
     var con=new XMLHttpRequest(); 
     con.onreadystatechange=function() 
     { 
      if(con.readyState==4 && con.status==200) 
       div.innerHTML+=con.responseText+"</br>"; 
     } 
     con.open("POST","db.php",true); 
     con.send(); 
</script> 

i wpisz następujący kod w pozycji db.php. I założyć, że Db.php jest w tym samym katalogu, w którym aktualna plik html jest:

$conn = mysqli_connect($servername, $username, $password, $dbname); 
// Check connection 
if (!$conn) { 
    die("Connection failed: " . mysqli_connect_error()); 
} 


$run = mysqli_query($conn,"[Your Query here]"); 
print "Your Post Deleted Successfully!"; 
+0

Strona wywołująca ajax odejdzie, zamykając żądanie ajax. Żądanie prawdopodobnie zakończy się na serwerze, ale odpowiedź nie zostanie odebrana przez stronę. Nie jest to jednak zły pomysł. Lazy cron może działać w ten sposób. – Rudie

2

przypadku uruchomienia PHP w trybie FastCGI (zwykle nginx), można wykorzystać fastcgi_finish_request() dokończyć żądanie użytkownika, a jednocześnie robi rzeczy w tle, np. powolne usuwanie wielu rekordów, które nie wymagają potwierdzenia przez użytkownika.

4

Miękkie usuwać + zadanie crona polecamy:

Nie polecam całkowicie usunięcie zapisów z wyjątkiem trzeba jak np prywatności danych

Jednak, jak już wspomniano, należy dodać do każdej tabeli kolumnę, taką jak deleted, a kiedy rekord ma zostać usunięty, należy ustawić wartość w tej kolumnie na wartość true.

Po tym można rozwinąć cronjob, który zostanie uruchomiony. Na przykład. codziennie w bazie podczas północy.

Cronjob zwykle będzie wykonywany na powłoce i nie ma tak krótkiego czasu, jak przeglądarka.

W twoim przypadku: nie usunąć wszystkie dane, gdy zdjęcie zostało usunięte:

Kiedy masz do czynienia z zaledwie kilku zapisów jest legit, aby usunąć wszystkie rekordy w pełni, gdy użytkownik chce je usunąć .

Jednak w twoim przypadku istnieje prawdopodobnie tysiące rekordów, które należy usunąć. Tak więc, gdy spróbujesz usunąć wszystkie z nich, gdy użytkownik usunie określony obraz, to na pewno wymaga czasu i prawdopodobnie kończy się z upływem czasu. Robienie tego przez ajax nie jest dobre, ponieważ użytkownicy nie chcą czekać, aż wszystkie żądania ajax-owe zostaną zakończone.

Powiązane problemy