Problem z floodem mysql przy przesyłaniu pliku

0

Witam, mam problem, z którym nie potrafię sobie poradzić, a który dotyczy przesyłania plików na serwer. Mam prosty kod, w którym <input> ma ustawiony parametr multiple, co pozwala na przesyłanie wielu plików jednocześnie.

Dane plików wysyłane są do prostego skryptu upload.php, który łączy się z bazą danych, umieszcza wpis o pliku w bazie danych i nadaje plikowi nazwę zgodną z kolejną wartością ID w bazie danych. Przy przesyłanie plików wielu plików jednocześnie (np. 5 czy 10) mysql nie radzi sobie z szybkością wykonania SELECT COUNT(id) przez co kilka plików może mieć tą samą nazwę.

Rozwiązaniem byłoby pewnie chwilowe przyblokowanie bazy, tak, aby nie można było wykonywać kolejnych zapytań, ale nie wiem jak to zrobić i czy jest to właściwy sposób.

0

MySQL jak najbardziej radzi sobie z odpaleniem zapytania, dlatego właśnie dostajesz te same wartości ;-)

Najprościej będzie w tej sytuacji wykorzystać UUID.

0

Tak radzi sobie, ale przy kodzie:

$zap=mysqli_fetch_array( mysqli_query($sql,"SELECT COUNT(`id`) FROM `pliki`") );

mysqli_query($sql,"INSERT INTO `pliki` VALUES('', NAZWA_PLIKU, INNE_DANE )");     //pierwsze pole "ID" ma parametr AUTO_INCREMENT

// zapisywanie pliku z używając w nazwie pobranego ID: $zap['COUNT(`id`)'];

W momencie, gdy wykonanych jest kilka zapytań w tym samym momencie MySQL nie nadąża z wykonaniem SELECT oraz INSERT przez co wypluwa tą samą wartość w SELECT co powoduje dalsze problemy.

Jeżeli chodzi o UUID to mógłbym prosić o mały przykład implementacji dla mojego przypadku?

1

MySQL jak najbardziej nadąża - dlatego właśnie dostajesz te same idki (bo MySQL jest tak szybki, że Twój skrypt nie daje rady odpalić dwóch zapytań w czas) :-)

A co do rozwiązania, no to właśnie UUID - w tym celu powstały i będą tu pasować idealnie.

Jeżeli chodzi o UUID to mógłbym prosić o mały przykład implementacji dla mojego przypadku?

Najpierw spróbuj sam - jeśli Ci się nie uda, opowiedz, jaki konkretnie problem napotkałeś.

0

No właśnie dlatego sobie radzi, bo robi wszystko równolegle :D źle podszedłeś do tematu. Tabelka na id powinna mieć autoincrement, dodajesz rekord z odpowiednim statusem np "NEW" wykonujesz operacje na pliku, aktualizujesz status koniec zabawy. Id wtedy zawsze będzie unikalne.

0

Panowie, dzięki za odpowiedzi, ale jestem raczej początkującym programistą. Nie słyszałem wcześniej o UUID i niestety nie wiem jak praktycznie mogę go wykorzystać w moim przypadku.

0

Nie słyszałem wcześniej o UUID

Jak każdy z nas - nie należy się przerażać, tylko czytać i kombinować ;-]

Tak czy siak:

  1. Zamień pole id z int auto_increment na uuid.
  2. Zamiast $zap=mysqli_fetch_array( mysqli_query($sql,"SELECT ...") ); zrób $id = wygeneruj_uuid(); (gdzie wygeneruj_uuid() jest jakąś funkcją do generowania UUIDków, np. stąd: https://github.com/ramsey/uuid).
  3. W momencie robienia insert into przekazuj to $id do zapytania.
0

Ok, dzięki Patryk27, teraz już rozumiem ideę wykorzystania UUID w tym przypadku, z resztą już sobie poradzę pewnie ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1