Avatar billede megoo Nybegynder
17. september 2003 - 21:27 Der er 2 kommentarer og
1 løsning

Optimering af thumbnail script

Hej

Jeg har følgende script som løber alle underfoldere igennem og genererer et thumb af enhvert billedfil den støder på. Det virker fint, men problemet er at det foregår lidt langsomt. Derfor kommer 30sek grænsen (ved ikke om det er en generel tidsgrænse eller hva, men der kommer en fatal fejl når den har arbejdet i 30 sek).

Så derfor: Enten skal mit script optimeres, ellers skal der en work-around til 30 sek grænsen (web-hotel!).

//----------------------------------------------------
class CThumbnailGenerator
{
//--- Settings ---
var $m_thumbnailPrefix          = "tn_";
var $m_thumbnailPath            = "/thumbs/";

//--- Member variables ---
var $m_directories              = array();

/************************************************
*
*/
function GenerateThumbnails($newWidth=80, $quality=75)
{
  // List all directories in m_directories[]
  $this->AquireDirectories();

  // Iterate through each directory
  foreach($this->m_directories as $dir)
  {
    // Open directory
    if($hndDir = opendir($dir))
    {
      // Loop through all files in directory
      while($file = readdir($hndDir))
      {
        $dst_file = $dir."/".$this->m_thumbnailPath.$this->m_thumbnailPrefix.$file;

        if(!file_exists($dst_file))
        {
          // Get extension of file
          $extension = substr($file, -4);

          // Check for valid image file
          if(($extension == ".JPG") || ($extension == ".jpg") || ($extension == ".gif") || ($extension == ".png") )
          {
            // Find the image size of current imagefile
            if(($imginfo = @getimagesize($dir."/".$file)) == NULL){
              return false;
            }

            // height/width
            $srcWidth = $imginfo[0];
            $srcHeight = $imginfo[1];

            $ratioWidth = $srcWidth/$newWidth;
            $ratioHeight = 0;
            $destWidth = $newWidth;
            $destHeight = $srcHeight / $ratioWidth;

            $src_img = imagecreatefromjpeg($dir."/".$file);
            $dst_img = imagecreatetruecolor($destWidth, $destHeight);

            ImageCopyResampled($dst_img, $src_img, 0, 0, 0, 0, $destWidth, (int)$destHeight, $srcWidth, $srcHeight);
            imagejpeg($dst_img, $dst_file, $quality);
            imagedestroy($src_img);
            imagedestroy($dst_img);
          }
        }
      }
    }
    closedir($hndDir);
  }
}

/************************************************
* Searches through a directory and lists any
* subdirectories in an array
*/
function AquireDirectories()
{
  // Open directory
  if( $hndDir = opendir("./") )
  {
    // Loop through all files
    while($curDir = readdir($hndDir))
    {
      // Select only directories
      if(is_dir($curDir)){

        // Deselect toplevel dirs
        if($curDir != "." && $curDir != ".."){
          $this->m_directories[] = $curDir;
        }
      }
    }

    // Close directory
    closedir($hndDir);
  }
}

} //end class 'CThumbnailGenerator'
Avatar billede megoo Nybegynder
17. september 2003 - 21:30 #1
Anyone up for the challenge?

Og ja, jeg er ny indenfor PHP ;o)
Avatar billede detox Nybegynder
17. september 2003 - 22:15 #2
Det er muligt det kan optimeres, men det er ikke sikkert du undgår 30 sekunders timeout. Det hænger jo osse sammen med hvor mange billeder der er. Derfor syntes jeg du skal prøve at ændre timeout. Fx:
set_time_limit(antal_sekunder);
eller:
set_time_limit(0);
for ubegrænset tid.
Avatar billede megoo Nybegynder
19. september 2003 - 08:52 #3
det er desværre ikke muligt da det foregår på et webhotel med 'safe-mode'.
Ok, lukker mens jeg finder ud af om det overhovedet bliver et problem i praksis.
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