Avatar billede simseboii Nybegynder
02. august 2008 - 18:01 Der er 11 kommentarer og
1 løsning

Maksimal udførelse på 30 sek.

Hej.

Jeg har lige lavet et galleri, hvor jeg bare kan oprette en mappe på min server og smide billederne op, så vises de automatisk på siden. Når man går ind på siden, generes der et thumbnail, som uploades til serveren og det vil derefter blive vist i stedet for billedet i fuldstørrelse.

Jeg har uploadet godt og vel 160 billeder, men når jeg går ind på siden laver den ikke thumbnails af alle billederne. Næsten alle, men der mangler cirka en 20 - 30 stykker.

Derimod kommer den med følgende besked:

  Fatal error: Maximum execution time of 30 seconds exceeded in
  /hsphere/local/home/snuzzer/snuzzer.dk/voresliv/thumbnail.php on
  line 7

index.php:
-------------------------------------------------------
[code]
        include("thumbnail.php");

        $dir = dir("galleri/".$_GET['dir']."/");

        while(false !== ($c = $dir->read()))
        {
            if(!strstr($c, ".jpg")) continue;

            if(!file_exists("galleri/".$_GET['dir']."/thumbs/".$c))
            {
                make_thumbnail($c, $_GET['dir']);
            }

            echo "<img src=\"galleri/".$_GET['dir']."/thumbs/thumb_".$c."\" alt=\"\" title=\"".$c."\" />&nbsp;&nbsp;";
        }
-------------------------------------------------------

thumbnail.php - som inkluderes i toppen af index.php:
-------------------------------------------------------
function make_thumbnail($filename, $gallerydir)
{
    $size = getimagesize("galleri/".$gallerydir."/".$filename);

    $thumb = imagecreatetruecolor("100", "90");
    $source = imagecreatefromjpeg("galleri/".$gallerydir."/".$filename);

    imagecopyresized($thumb, $source, 0, 0, 0, 0, "100", "100", $size[0], $size[1]);

    imagejpeg($thumb, "galleri/".$gallerydir."/thumbs/thumb_".str_replace(".jpg", "", $filename).".jpg");
}
-------------------------------------------------------

På forhånd tak.
Simon Støvring
Avatar billede simseboii Nybegynder
02. august 2008 - 18:06 #1
Jeg har søgt lidt nærmere, og fundet ud af, at det har noget med max_execution_time() at gøre. På mit webhotel, Surftown, er den sat til 30 sek. og kan ikke ændres med set_time_limit(), da "safe mode" er slået til i php.ini.

Kan jeg på nogen måde ændre scriptet, så jeg kan udskrive alle billederne? Evt. bruge noget sideskift uden at skulle involvere en MySQL-database?
Avatar billede janpolsen Nybegynder
02. august 2008 - 18:20 #2
Jeg ved ikke om det hjælper at bruge glob() i stedet for dir() og om det kan gøre noget ved hastigheden, men du kan evt. lave et array over alle billederne der skal laves thumbnails af.

Derfra kan du egentlig gøre mange forskellige ting :).

- Lave noget ajax, som kalder en side der laver f.eks. 10 thumbnails pr. gang og automatisk reloader, så længe der er billeder i arrayet.
- Ovenstående kan også laves med en almindelig POST til en side, som tager 10 billeder, laver thumbnails, fjerne de 10 billeder fra arrayet og POST'er det igen.

Du har et check i din kode sørger for ikke at lave thumbnails af samme billede flere gange, så du kan i teorien sagtens blive ved med at poste til samme fil.

Hvad hvis du laver en counter så kun løber 10 igennem inden du kalder samme side igen? Noget i form a:

index.php:
-------------------------------------------------------
[code]
        include("thumbnail.php");

        $dir = dir("galleri/".$_GET['dir']."/");
        $cnt = 0;
        while(false !== ($c = $dir->read()) && $cnt++ < 10)
        {
            if(!strstr($c, ".jpg")) continue;

            if(!file_exists("galleri/".$_GET['dir']."/thumbs/".$c))
            {
                make_thumbnail($c, $_GET['dir']);
            }

            echo "<img src=\"galleri/".$_GET['dir']."/thumbs/thumb_".$c."\" alt=\"\" title=\"".$c."\" />&nbsp;&nbsp;";
        }
        header("Location: {$PHP_SELF}");
-------------------------------------------------------

Ovenstående bør måske lige skrive noget på skærmen, så man kan se hvor langt programmet er nået. I så tilfælde skal du ændre dit header()-kald til noget javascript som genindlæser siden.
Avatar billede janpolsen Nybegynder
02. august 2008 - 18:21 #3
Wups... du bliver nødt til at bruge følgende i stedet for:
index.php:
-------------------------------------------------------
[code]
        include("thumbnail.php");

        $dir = dir("galleri/".$_GET['dir']."/");
        $cnt = 0;
        while(false !== ($c = $dir->read()) && $cnt < 10)
        {
            if(!strstr($c, ".jpg")) continue;

            if(!file_exists("galleri/".$_GET['dir']."/thumbs/".$c))
            {
                make_thumbnail($c, $_GET['dir']);
                $cnt++;
            }

            echo "<img src=\"galleri/".$_GET['dir']."/thumbs/thumb_".$c."\" alt=\"\" title=\"".$c."\" />&nbsp;&nbsp;";
        }
        header("Location: {$PHP_SELF}");
-------------------------------------------------------
Avatar billede wanze Nybegynder
02. august 2008 - 18:23 #4
Du kunne lave caching. Dvs., at den først tjekker om der allerede eksisterer en thumbnail er billedet. Dvs. når du går ind på siden første gang, så vil den forsøge at lave thumbnails for alle billederne (og gemmer billederne i en mappe). Du vil sikkert også få den der fejl først gang så, men næste gang skal den ikke lave thumbnail for alle billederne, men kun de resterende.

Næste gang du smider billeder op, så vil der ligeledes blive lavet thumbnails første gang du går ind på siden, men ikke de efterfølgende gange. Det vil spare dig for rigtig mange ressourcer og siden vil blive meget hurtigere til at indlæse.
Avatar billede simseboii Nybegynder
02. august 2008 - 18:26 #5
Det ser fornuftigt ud, men kan jeg så printe resten af billederne?
Avatar billede simseboii Nybegynder
02. august 2008 - 18:27 #6
wanze, det var lidt det, jeg prøvede på med file_exists(), men hvordan ville du ellers lave det?

Sådan her har jeg prøvet:
            if(!file_exists("galleri/".$_GET['dir']."/thumbs/".$c))
            {
                make_thumbnail($c, $_GET['dir']);

                $cnt++;
            }
Avatar billede wanze Nybegynder
02. august 2008 - 18:33 #7
Så opretter den nok ikke filerne eller også er din file_exist()-linje forkert. Tjek det efter.
Avatar billede simseboii Nybegynder
02. august 2008 - 18:46 #8
wanze, ah ja! Det var noget af en brøler. Alle thumbs' navn starter med thumb_, det havde jeg glemt i file_exist().

Mange tak.

Lig et svar.
Avatar billede wanze Nybegynder
02. august 2008 - 19:05 #9
Hehe. ;-)

Tak for point.
Avatar billede janpolsen Nybegynder
02. august 2008 - 19:32 #10
Du bør stadig lave det med, at den reloader siden, så du ikke får timeouts hver gang der er nye billeder ;).
Avatar billede wanze Nybegynder
02. august 2008 - 20:20 #11
Hm, ja, man kunne jo sætte den til kun at lave 10 billeder ad gangen, og så genindlæse siden.
Avatar billede janpolsen Nybegynder
02. august 2008 - 22:33 #12
Ja?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester