Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Tworzenie miniaturek dla dużej ilości plików
Regss
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 7.05.2006

Ostrzeżenie: (0%)
-----


Witam!
Próbuję napisać skrypt domowej galerii filmów. Na głównej stronie wyświetlane są trzy obrazy dla wybranej pozycji (okładka, fanart, miniaturka). Wszystkie trzy tworzone są za pomocą biblioteki GD2 w katalogu cache/ z wgranych przez użytkownika obrazów. Wgranie następuje poprzez ftp do katalogu export/. Następnie po uruchomieniu skryptu tworzy on wyżej wymienione trzy obrazy kolejno dla wszystkich pozycji. Niestety przy większej ilości pozycji skrypt przekracza limit wykonywania. Czy ma ktoś jakiś pomysł jak utworzyć miniaturki dla wszystkich pozycji w jakiś sprytny sposób.

Wydaje mi się, że lepszym rozwiązaniem będzie tworzenie miniaturki dla aktualnie przeglądanej pozycji po prostu sprawdzenie czy miniaturka istnieje, jeśli tak to wyświetl jeśli nie to utwórz i wyświetl? Po pewnym czasie zostaną utworzone wszystkie.

Ten post edytował Regss 16.12.2011, 20:42:08
Go to the top of the page
+Quote Post
einter-project
post
Post #2





Grupa: Zarejestrowani
Postów: 39
Pomógł: 0
Dołączył: 9.09.2011

Ostrzeżenie: (10%)
X----


Witam
Nie pogonisz w ten sposób dużej ilości plików, bo zawsze zabijesz serwer. Lepiej zmniejszaj je przy wgrywaniu na serwer a potem dopiero wyświetlaj miniaturki. Jak chcesz mogę Ci dać gotowca do zmniejszania zdjęć.

Pozdrawiam
Go to the top of the page
+Quote Post
Regss
post
Post #3





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 7.05.2006

Ostrzeżenie: (0%)
-----


Problem w tym, że użytkownik korzystający ze skryptu wrzuca pliki przygotowane przez określony program poprzez ftp nie ma tu systemu uploadu. Następnie uruchamia skrypt i to skrypt ma za zadanie zrobić całą resztę czyli odnaleźć wgrane zdjęcia dodać do bazy danych i przekonwertować je do potrzebnych miniatur. Skrypt do zmniejszania zdjęć to nie problem, mam swój. Problem leży w rozwiązaniu kiedy konwertować te zdjęcia.

Ten post edytował Regss 16.12.2011, 21:45:59
Go to the top of the page
+Quote Post
Fifi209
post
Post #4





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Może w nocy kiedy ruch jest stosunkowo niewielki? Cron i niech sobie po trochu robi (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Regss
post
Post #5





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 7.05.2006

Ostrzeżenie: (0%)
-----


Tylko skrypt ma służyć prostemu użytkownikowi który nie zna się na php. Musi być uniwersalny, działający na każdym serwerze. Konfiguracja skryptu ogranicza się do zmiany w pliku konfiguracyjnym danych do połączenia z bazą. Da się to zrobić z cron'em?

Wydaje mi się, że jednak najlepszą metodą będzie tworzenie miniatury pojedynczo przy przeglądaniu pojedynczej pozycji, ewentualnie dodanie pętli która utworzy np. 10 innych miniatur do losowych zdjęć oczywiście z warunkiem jeśli miniatury te nie istnieją.

Ten post edytował Regss 16.12.2011, 22:04:29
Go to the top of the page
+Quote Post
einter-project
post
Post #6





Grupa: Zarejestrowani
Postów: 39
Pomógł: 0
Dołączył: 9.09.2011

Ostrzeżenie: (10%)
X----


Sorki nie doczytałem, no to jest rozwiązanie banalne.
1) po zmniejszeniu usuwaj plik z katalogu export
2) odświerz stronę po zmniejszeniu np 50 fotek (musisz zobaczyć ile pójdzie za jednym razem).

$ID_UPDATE = 1;


// Twój skrypt w jakiejś pętli


if($ID_UPDATE == '500'){
print "<script type=\"text/javascript\" language=\"JavaScript\">
<!--

function reloading() {
setTimeout(\"location.reload();\", 500);
}
window.onload = reloading;

//-->
</script>";
}
$ID_UPDATE++;

Sam to stosuje jak ma mega zadanie i sobie chodzi nawet kilka dni

Ten post edytował einter-project 16.12.2011, 22:04:59
Go to the top of the page
+Quote Post
Regss
post
Post #7





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 7.05.2006

Ostrzeżenie: (0%)
-----


Nie chcę usuwać plików z export/ ponieważ użytkownik w każdej chwili będzie mógł dograć kolejne pliki i chcę zabezpieczyć się opcją w panelu admina która będzie odbudowywać miniaturki czyli usuwać i tworzyć wszystkie na nowo. Ale pomyślę nad tym...

Ten post edytował Regss 16.12.2011, 22:08:15
Go to the top of the page
+Quote Post
Shili
post
Post #8





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

Ostrzeżenie: (0%)
-----


Jeśli faktycznie mają to być maksymalnie 3 pliki generowane przy odsłonie - narzut powinien być tak niewielki, że będzie niezauważalny. Jeśli będzie ich 30 powinno być mniej więcej podobnie - chyba że skrypt jest nieoptymalnie napisany, albo czas wykonywania skryptu jest wybitnie kuriozalny.

Gorzej jak kiedyś będziesz chciał to rozbudować.
Wtedy najlepiej zaimplementować kolejkowanie elementów do zminiaturyzowania.

Ile docelowo planujesz mieć miniatur?
Go to the top of the page
+Quote Post
Niktoś
post
Post #9





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


JA to trochę inaczej mam rozwiązane:
Użytkownik uploaduje plik z którego robię miniaturke i zapisuje ją binarnie do bazy danych do kolumny binary ,albo blob.
Na oddzielnej stronie mam skrypt który odczytuje z bazy danych strumień i konwertuje je poprzez modyfikacje headera na zdjęcie inaczej mówiąc zamienia stronę html na jpg.
Odczytuje tę stronę poprzez parametry w url.
Nie mam problemu z wyświetlaniem miniaturek.

Ten post edytował Niktoś 16.12.2011, 22:40:56
Go to the top of the page
+Quote Post
Regss
post
Post #10





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 7.05.2006

Ostrzeżenie: (0%)
-----


Jeśli chodzi o ilość miniatur to myśle że niektórzy użytkownicy będą posiadać ponad 1000 pozycji więc do wygenerowania jest 3000 miniatur.
Go to the top of the page
+Quote Post
abort
post
Post #11





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


Ale przecież nie musisz wszystkich przetwarzać za każdym razem. Mało tego, zapewne nie chcesz.
Rozwiązaniem będzie porównywanie dat utworzenia danych obrazów i miniaturek (jeśli miniaturka jest nowsza, to nie trzeba jej generować, prawda?).
Widzę tylko jeden problem: przez FTP można ustawić oryginalną datę pliku, w związku z czym możesz spodziewać się scenariusza:

1. user uploaduje obrazek (timestamp obrazka z zeszłego roku)
2. Ty robisz miniaturki (timestamp aktualny)
3. User wrzuca inny plik pod tą samą nazwą (timestamp nowszy od timestampu miniaturki)

Tu może być problem... Choć osobiście sądzę, że to będą incydenty. Wtedy pozostaje rozwiązanie ze skasowaniem miniaturek i poczekaniem aż się wygenerują ponownie.
Go to the top of the page
+Quote Post
Regss
post
Post #12





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 7.05.2006

Ostrzeżenie: (0%)
-----


Oczywiście, że nie chcę dlatego przed próbą utworzenia będę sprawdzał czy istnieje miniaturka.

Wymyśliłem coś takiego, jak myślicie to będzie dobry sposób?
Tylko mam jeden problem nie wiem jak zrobić aby przy każdym przeładowaniu skryptu pokazywało się ile jest już utworzonych miniatur. Zmienna $output nie chce się wyświetlić.

Może zamiast header użyć javascriptu?

  1. <?php
  2. // liczy pliki
  3. $i = 0;
  4. $dir = opendir('export/movies/');
  5. while (false !== ($file = readdir($dir))) {
  6. $info = pathinfo($file);
  7. if ($file !== "." && $file !== ".." && isset($info['extension']) && $info['extension'] == "jpg") {
  8. $i++;
  9. }
  10. }
  11. closedir($dir);
  12.  
  13. // liczy miniaturki
  14. $a = 0;
  15. $dir = opendir('cache/');
  16. while (false !== ($file = readdir($dir))) {
  17. $info = pathinfo($file);
  18. if ($file !== "." && $file !== ".." && isset($info['extension']) && $info['extension'] == "jpg") {
  19. $a++;
  20. }
  21. }
  22. closedir($dir);
  23.  
  24. // jeśli liczba plików i miniatur nie jest równa uruchamia skrypt
  25. if ($i !== $a) {
  26. $output = 'Utworzono: ' . $a . ' z ' . $i . ' miniatur. Proszę czekać...';
  27. $z = 0;
  28. // tworzenie miniatur
  29. $dir = opendir('export/movies/');
  30.  
  31. // pętla co 5 utworzonych miniatur ładuje skrypt od nowa
  32. while (false !== ($file = readdir($dir)) && $z < 5) {
  33. $info = pathinfo($file);
  34.  
  35. // sprawdza czy plik nie jest katalogiem i posiada rozszerzenie .jpg
  36. if ($file !== "." && $file !== ".." && isset($info['extension']) && $info['extension'] == "jpg") {
  37.  
  38. // jeśli miniaturka nie istnieje tworzy ją
  39. if (!file_exists('cache/' . $info['filename'] . '-t.jpg')) {
  40. $img = imagecreatefromjpeg('export/movies/' . $file);
  41. $width = imagesx($img);
  42. $height = imagesy($img);
  43. $new_width = 200;
  44. $new_height = 280;
  45. $img_temp = imagecreatetruecolor($new_width, $new_height);
  46. imagecopyresampled($img_temp, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
  47. imagejpeg($img_temp, 'cache/' . $info['filename'] . '-t.jpg', 80);
  48. imagedestroy($img);
  49. imagedestroy($img_temp);
  50. $z++;
  51. }
  52. }
  53. }
  54. $output.= '<script language="JavaScript"> window.location ="test.php";</script>';
  55. } else {
  56. $output = 'Tworzenie miniatur zakończone, utworzono ' . $a . ' z ' . $i . ' miniatur.';
  57. }
  58. ?>
  59. <html>
  60. <head>
  61. <title>Panel admin</title>
  62. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  63. <link type="text/css" href="css/style.css" rel="stylesheet" media="all" />
  64.  
  65. </head>
  66. <body>
  67. <?PHP echo $output ?>
  68. </body>
  69. </html>



edit:

Lepsze okazało się przekierowanie javascript ładnie pokazuje ile zostało do końca tworzenia miniatur. Pozostaje pytanie czy cały ten skrypt jest mądrym rozwiązaniem.

Ten post edytował Regss 17.12.2011, 19:00:35
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 18.09.2025 - 17:25