Ergebnis 1 bis 5 von 5
  1. #1
    Mitglied
    Registriert seit
    Jun 2010
    Ort
    Australia
    Beiträge
    230
    Danksagungen
    0

    Standard [PHP] Optimierung / Fragen

    Hallo Leute, ich bin ein richtiger neuling was PHP angeht und habe fuer meine webseite ein paar kleine skripte geschrieben, ich wollte jetzt wissen ob die *sicher* und ob diese ggf optimiert werden koennen:
    Alle snippeds funktionieren so wie sollen.

    PHP-Code:
    $imgaesDir "images/";
    if(
    $handle opendir($imgaesDir))
    {
       while(
    false!==($entry readdir($handle)))
       {
          if(
    $entry !="." and $entry != ".." )
          {
             if(
    is_dir($imgaesDir.$entry))
             {
                echo 
    "<li>".$entry."</li>\n";
             }
          }
       }

    Dieses snipped liest einen ordner aus und holt sich deren leve 1 sub-ordner und zeigt diese als liste an (html drumherum hab ich weggelassen).
    was genau ist der unterschied zwischen !== und != ? ich hab das stueck aus dem internet kopiert... ich kannte bisher nur die negation != aber !== ist mir neu?

    Das naechste skript ist ein bisschen laenger ... wie mach ich es das z.B. variable die ich anlege *global* ansprechbar sind in funktions definitionen? wenn ich funktionen auslagern will in eigene *.php dateien, brauch ich diese nur zu includen in die aufrufende *.php datei?
    ich wuerde gerne sowohl die funktionen als auch die *konstanten* auslagern.

    PHP-Code:
    <?php

    $size 
    70//thumbnail size
    $quality 30//thumbnail quality
    $thumbDir "thumbs/"//thumbnail directory
    $imgaesDir "images/"//original picture folder
    $txtDir "txt/"//text folder
    $spaceReplace ="-";
    $img_extension "jpg";//extension to look for
                
    $link_datattr "<img src=\"%thumb%\" alt=\"%alt%\" title=\"%title%\" data-image=\"%image%\" data-gallery=\"%gallery%\" />";
                   
     
    //renames extensions into lowercase if neccessary
    renameExtensionLowercase($imgaesDir);

    $imagesAndFolders readFolder($imgaesDir);

    foreach(
    $imagesAndFolders as $item)
    {
        

        
    //array of images - subfolder
        
    if(is_array($item))
        {
            
    //we have an array, that means it's a subfolder within the image/ path
            
    foreach($item as $img)
            {
                
    displayLink($img,$link_datattr,$img_extension,$txtDir,$spaceReplace,$thumbDir,$imgaesDir,$size,$quality);
            }
        }
        else
        {
            
    //it's not a subfolder, it's an actual image within the image/ path
                
    displayLink($item,$link_datattr,$img_extension,$txtDir,$spaceReplace,$thumbDir,$imgaesDir,$size,$quality);
        }
    }

    //reads/writes a textfile depending on the $filename and updates the link template attributes        
    function prepareTextFile($fileName,$linkTemplate)
    {
        
    $textFile $fileName;
        
    $link $linkTemplate;
        
    $name basename($fileName,".txt");
        
    $theData $name."\n".$name;
        
    //if file exists read out the content
        
    if(file_exists($textFile)){
            
    $theData file_get_contents($textFile);
        }
        else{
        
    //file does not exists so write the data
             
    file_put_contents($textFile$theData);
        }
            
    //replace dashes with space
            
    $theData str_replace("-"," ",$theData);
            
    //we split the data on the new line to get the title and description
            
    $split explode("\n",$theData);
            
            
    //the search pattern we are looking for
            
    $search  = array("%alt%""%title%");
            
    //to replace it with those items
            
    $replace = array (trim($split[0]),trim($split[1]));
            
            
    //and we apply that to our link
            
    $link str_replace($search$replace$link);
            
            
        
    //return the new link template
        
    return $link;
    }

    //displays the link on the html file
    function displayLink($imageFile,$linkTemplate,$img_extension,$txtDir,$spaceReplace,$thumbDir,$imgaesDir,$size,$quality)
    {
        
    $link $linkTemplate;
                
        
    $source $imageFile;
        
    $filename trim(basename($source));
        
    $name =    trim(basename($filename,".".$img_extension));
        
    $subfolder trim(str_replace($imgaesDir,"",str_replace($filename,"",$source)));
            
        
    //replace %tokens%
        
    $link trim(str_replace("%gallery%",basename($subfolder),
                
    str_replace("%image%"$source ,$link)));

        
    $textFile $txtDir.basename$subfolder).$spaceReplace.str_replace(" ",$spaceReplace,$name).".txt";
        
        
    $link prepareTextFile($textFile,$link);
        
        
    //our thumbnail destination name
        
    $destination $thumbDir basename($subfolder) . $spaceReplace str_replace(" ",$spaceReplace,$filename);
                
        
        
    //if our thumbnail does not exist for that image,\
        
    if(!file_exists($destination))
        {
            
    //we create a new thumbnail for that image
            
    cropImage($source,$size,$quality,$destination);
        }
        
    //we replace the thumbnail token with our actual thumbnail link
        
    $link str_replace("%thumb%"$destination$link);
        
        
    //and write our link to the homepage
        
    echo $link."\n\n";
    }

    //reads out a folder path
    function readFolder($path)
    {
        
    $dir opendir($path);
        
    $list = array();
        
        while(
    $file readdir($dir)){
            if (
    $file != '.' and $file != '..'){
                
    // add the filename, to be sure not to
                // overwrite a array key
                
    $path_info pathinfo($file);
                
                
    $ctime filectime($path $file) . ',' $file;
            
                if(
    is_dir($path.$file."/"))
                {
                  
    $sublist readFolder($path.$file."/");
                 
    // print_r($sublist);
                  
    $list[$ctime]=$sublist;
                }
                else if(
    $path_info['extension']=="jpg")
                {
                    
    //key: time,filename
                    
                    
    $list[$ctime] = $path.$file;
                }
            }
        }
        
    closedir($dir);
        
    krsort($list);
        return 
    $list;
    }

    //will create an array of images sorted by date
    function listdir_by_date($path){
        
    $dir opendir($path);
        
    $list = array();
        while(
    $file readdir($dir)){
            if (
    $file != '.' and $file != '..'){
                
    // add the filename, to be sure not to
                // overwrite a array key
                
    $path_info pathinfo($file);
                
                if(
    sizeof($path_info)==3){
                
                    
    $subdir opendir($path.$file);
                    while(
    $subfile=readdir($subdir)){
                        if (
    $file != '.' and $file != '..'){
                            echo 
    $subfile;
                        }
                    }
                }
                if(
    $path_info['extension']=="jpg")
                {
                    
    //key: time,filename
                    
    $ctime filectime($path $file) . ',' $file;
                    
    $list[$ctime] = $file;
                }
            }
        }
        
    closedir($dir);
        
    krsort($list);
        return 
    $list;
    }

    //this will scale down an image to a certain size with keeping the ratio and crop the rest off and write it into destination
    function cropImage($src,$size,$quality,$destination)
    {
        
    $image imagecreatefromjpeg($src);

        
    $filename $src;

        
    $thumb_width $size;
        
    $thumb_height $size;

        
    $width imagesx($image);
        
    $height imagesy($image);

        
    $original_aspect $width $height;
        
    $thumb_aspect $thumb_width $thumb_height;

        if(
    $original_aspect >= $thumb_aspect) {
           
    // If image is wider than thumbnail (in aspect ratio sense)
           
    $new_height $thumb_height;
           
    $new_width $width / ($height $thumb_height);
        } else {
           
    // If the thumbnail is wider than the image
           
    $new_width $thumb_width;
           
    $new_height $height / ($width $thumb_width);
        }

        
    $thumb imagecreatetruecolor($thumb_width$thumb_height);

        
    // Resize and crop
        
    imagecopyresampled($thumb,
                           
    $image,
                           
    - ($new_width $thumb_width) / 2// Center the image horizontally
                           
    - ($new_height $thumb_height) / 2// Center the image vertically
                           
    00,
                           
    $new_width$new_height,
                           
    $width$height);
        
    imagejpeg($thumb$destination$quality);
        
    }

    //renames extensions to lowercase
    function renameExtensionLowercase($path)
    {
        
    $files glob($path "*.*");
        
    $z=0;
        
    $x=0;
        for(
    $i=0;$i<count($files);$i++) {
            if(
    stripos($files[$i],"Thumbs.db")) {
                
    unlink($files[$i]);
                
    $z++;
            }
            else {
                    
    $ext strtolower(substr($files[$i],strlen($files[$i])-3,3));
                    if (
    preg_match("/(jpg|gif|png|bmp)/",$ext)) {
                        
    $filename substr($files[$i],0,strlen($files[$i])-3);
                        
    $newfile $filename.$ext;
                        
    //echo $ext."\n";
                        
    rename($files[$i],$newfile);
                        
    $x++;
                    }
            }
        }
    }

    ?>
    manche methoden parameter waeren ueberfluessig da die auf die konstanten zugreifen =D
    es waere sehr nett wenn ihr mir die sachen erklaeren koennt oder tips geben, ich bin in der lage es dann selber um zu coden (ausser optimierungen, ich hab keine ahnung ob ich ueberal lden optimalen weg gehe...bin wie gesagt php neuling)


    was in diesem code genau passiert ist folgendes: ich schaue in einem order *images/* nach *.jpg dateien und rename alle file extensions toLowercase, speichere alle gefunden images/subfolder+images in eine sortierte liste nach datum, erstelle fuer die bilder ein thumbnail (falls dieses noch nicht exestiert) und eine txt datei. die textdatei beinhaltet blos einen titel + beschreibung des fotos. Falls die text datei nicht exestiert wird diese erstellt mit default values. ansonsten wird diese ausgelesen. Es werden dann die thumbnails als html link auf der seite angezeigt.

    Ich hatte keine lust die informationen in und aus einer DB zu holen, ich weis garnicht wie das geht =) deswegen woltle ich alles auf dem dateisystem auslagern.

  2. #2
    Gesperrt
    Registriert seit
    Nov 2011
    Beiträge
    1.862
    Danksagungen
    25

    Standard Re: [PHP] Optimierung / Fragen

    PHP-Code:
    // hier wird überprüft, ob 1 und true bedeutungsgleich sind
    $result = (== true);
    echo 
    $result// wird true

    // hier wird überprüft, ob 1 und true identisch sind
    $result = (=== true);
    echo 
    $result// wird false 
    Ebenso verhält es sich mit != und !==


    PHP-Code:
    $imgaesDir "images/";
    if(
    $handle opendir($imgaesDir))
    {
       while(
    false!==($entry readdir($handle)))
       {
          if(
    $entry !="." and $entry != ".." )
          {
             if(
    is_dir($imgaesDir.$entry))
             {
                echo 
    "<li>".$entry."</li>\n";
             }
          }
       }

    Warum das:
    PHP-Code:
          if($entry !="." and $entry != ".." )
          {
             if(
    is_dir($imgaesDir.$entry))
             {
                echo 
    "<li>".$entry."</li>\n";
             }
          } 
    Da du die Unterscheidung nicht brauchst, kannst du die beiden If-Schachteln zusammenfassen:
    PHP-Code:
          if($entry !="." and $entry != ".." and is_dir($imgaesDir.$entry))
          {
              echo 
    "<li>".$entry."</li>\n";
          } 
    Wenn du innerhalb einer Funktion auf eine äußere Variable zugreifen möchtest, dann kannst du diese entweder als Parameter mit rein geben oder mittels global darauf zugreifen:

    PHP-Code:
    $wichtig "Ich bin wichtig..";

    function 
    A($wichtig)
     {
        echo 
    $wichtig;
     }

    function 
    B()
     {
        global 
    $wichtig;
        echo 
    $wichtig;
     }

    A($wichtig);

    B(); 
    Den Rest habe ich mir noch nicht angeschaut, mache ich bei Gelegenheit.

  3. #3
    ex-Moderator Avatar von Kugelfisch23
    Registriert seit
    Oct 2007
    Beiträge
    18.640
    Danksagungen
    459

    Standard Re: [PHP] Optimierung / Fragen

    Snippet 1 liesse sich durch Verwendung von glob() anstelle von opendir()/readdir() signifikant vereinfachen. Beispiel:
    PHP-Code:
    foreach(glob('images/*'GLOB_ONLYDIR) as $dir) {
       echo 
    "<li>" htmlspecialchars(basename($entry)) . "</li>\n";

    Dasselbe gilt analog auch für die Funktionen zum Auflisten der Verzeichnisinhalte in deinem zweiten Snippet.

  4. #4
    Mitglied

    (Threadstarter)


    Registriert seit
    Jun 2010
    Ort
    Australia
    Beiträge
    230
    Danksagungen
    0

    Standard Re: [PHP] Optimierung / Fragen

    Zitat Zitat von accC Beitrag anzeigen
    PHP-Code:
    // hier wird überprüft, ob 1 und true bedeutungsgleich sind
    $result = (== true);
    echo 
    $result// wird true

    // hier wird überprüft, ob 1 und true identisch sind
    $result = (=== true);
    echo 
    $result// wird false 
    Ebenso verhält es sich mit != und !==
    Ok das macht sinn...verhaelt es sich mit der *identitaetsfrage* aehnlich wie z.B. in C#/C++
    dass hier die speicher addresse ueberprueft wird ? oder vergleiches nur einen *hash* ?


    Zitat Zitat von accC Beitrag anzeigen
    PHP-Code:
    $imgaesDir "images/";
    if(
    $handle opendir($imgaesDir))
    {
       while(
    false!==($entry readdir($handle)))
       {
          if(
    $entry !="." and $entry != ".." )
          {
             if(
    is_dir($imgaesDir.$entry))
             {
                echo 
    "<li>".$entry."</li>\n";
             }
          }
       }

    Warum das:
    PHP-Code:
          if($entry !="." and $entry != ".." )
          {
             if(
    is_dir($imgaesDir.$entry))
             {
                echo 
    "<li>".$entry."</li>\n";
             }
          } 
    Da du die Unterscheidung nicht brauchst, kannst du die beiden If-Schachteln zusammenfassen:
    PHP-Code:
          if($entry !="." and $entry != ".." and is_dir($imgaesDir.$entry))
          {
              echo 
    "<li>".$entry."</li>\n";
          } 
    Ja, du hastrecht, mein fehler... ich hab das garnicht gesehen/beachtet =D dadrauf haette ich auch selber kommen muessen haha =D


    Zitat Zitat von accC Beitrag anzeigen
    Wenn du innerhalb einer Funktion auf eine äußere Variable zugreifen möchtest, dann kannst du diese entweder als Parameter mit rein geben oder mittels global darauf zugreifen:

    PHP-Code:
    $wichtig "Ich bin wichtig..";

    function 
    A($wichtig)
     {
        echo 
    $wichtig;
     }

    function 
    B()
     {
        global 
    $wichtig;
        echo 
    $wichtig;
     }

    A($wichtig);

    B(); 
    Den Rest habe ich mir noch nicht angeschaut, mache ich bei Gelegenheit.
    Aah, ok..ich dachte ich muss bei der deklaration das global verwenden =D..
    hm diese variante ist irgendwie bisschen verwirrend egal - merken =)
    [/PHP]

    THX fuer die hilfe!


    Zitat Zitat von Kugelfisch23 Beitrag anzeigen
    Snippet 1 liesse sich durch Verwendung von glob() anstelle von opendir()/readdir() signifikant vereinfachen. Beispiel:
    PHP-Code:
    foreach(glob('images/*'GLOB_ONLYDIR) as $dir) {
       echo 
    "<li>" htmlspecialchars(basename($entry)) . "</li>\n";

    Dasselbe gilt analog auch für die Funktionen zum Auflisten der Verzeichnisinhalte in deinem zweiten Snippet.
    Ja, ganz am anfang hab ich sogar glob benutzt um *.jpg raus zu fischen, jedoch hat es nicht rekursiv die ordner durchsucht und/oder hat mir die subordner nicht mit angegeben, oder die files im 0. level...irgendwas passte nicht... zumindest so wie ich das benutzt hatte... deswegen hab ich es dann umgeschrieben..ich werde mal die funktion ausprobieren ob die mir das zurueck gibt was ich brauche:

    struktur kan nfolgende sein
    images/ (level 0 folder)
    |
    ---- Folder1 (level 1 folder)
    | |
    | ---- 1.jpg
    | |
    | ---- 2.jpg
    |
    ---- Folder2 (level 1 folder)
    | |
    | ---- 3.jpg
    | |
    | ---- 4.jpg
    |-- 5.jpg

    es wird nie level 2 folder geben =) brauche aber die information wo sich die dateien befinden um diese zu verlinken =)

    Danke schonmal fuer alles, ich werde mal anfangen die funktionen bisschen umzuschreiben, habe naemlich keine lust 5-6 variablen immer mit zu geben die fuer das ganze php skript gueltig sind - sprich global sind. =)

  5. #5
    ex-Moderator Avatar von Kugelfisch23
    Registriert seit
    Oct 2007
    Beiträge
    18.640
    Danksagungen
    459

    Standard Re: [PHP] Optimierung / Fragen

    Zitat Zitat von tomekpl Beitrag anzeigen
    Ok das macht sinn...verhaelt es sich mit der *identitaetsfrage* aehnlich wie z.B. in C#/C++
    dass hier die speicher addresse ueberprueft wird ? oder vergleiches nur einen *hash* ?
    Der Vergleichsoperator in C++ überprüft ebenso wie der Vergleichsoperator in PHP den Inhalt der Variablen. Anders als in C++ tritt jedoch (aufgrund der nicht-strikten Typisierung) nicht bereits beim Kompilieren ein Fehler auf, wenn zwei verschiedene Typen miteinander vergleichen werden, sondern es wird versucht, den einen Typen in den anderen umzuwandeln. So liefert z.B. '42' == 42 true, in C++ wäre solch ein Vergleich aufgrund der strikten Typisierung nicht möglich.

    Der Identitätsoperator führt einen solchen Vergleich durch und prüft zudem explizit die Typen der Operanden. Sind diese nicht identisch, wird false zurückgeliefert. Speicheradressen oder Hash-Werte werden nicht überprüft.

    Zitat Zitat von tomekpl Beitrag anzeigen
    Ja, ganz am anfang hab ich sogar glob benutzt um *.jpg raus zu fischen, jedoch hat es nicht rekursiv die ordner durchsucht und/oder hat mir die subordner nicht mit angegeben, oder die files im 0. level...irgendwas passte nicht... zumindest so wie ich das benutzt hatte...
    Auf Systemen, welche GLOB_BRACE unterstützen, liesse sich das leicht über
    PHP-Code:
    glob('{*.jpg,*/*.jpg}',GLOB_BRACE
    lösen. Ist das System nicht GLOB_BRACE-fähig, musst du glob() für Dateien der 0. und der 1. Ebene separat ausführen und die Ergebnisse z.B. mit array_merge() vereinigen:
    PHP-Code:
    array_merge(glob('*.jpg'),glob('*/*.jpg')) 
    Geändert von Kugelfisch23 (17. 04. 2012 um 07:13 Uhr)

  6.  
     
     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •