Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tworzenie miniaturek dla dużej ilości plików
Forum PHP.pl > Forum > PHP
Regss
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.
einter-project
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
Regss
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.
Fifi209
Może w nocy kiedy ruch jest stosunkowo niewielki? Cron i niech sobie po trochu robi smile.gif
Regss
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ą.
einter-project
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
Regss
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...
Shili
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?
Niktoś
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.
Regss
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.
abort
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.
Regss
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.