Thema: [PHP] Optimierung / Fragen
-
16. 04. 2012, 02:33 #1Mitglied
- Registriert seit
- Jun 2010
- Ort
- Australia
- Beiträge
- 227
- Danksagungen
- 0
[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.
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).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";
}
}
}
}
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.
manche methoden parameter waeren ueberfluessig da die auf die konstanten zugreifen =DPHP-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,
0 - ($new_width - $thumb_width) / 2, // Center the image horizontally
0 - ($new_height - $thumb_height) / 2, // Center the image vertically
0, 0,
$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++;
}
}
}
}
?>
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.
-
16. 04. 2012, 08:38 #2root
- Registriert seit
- Nov 2011
- Ort
- cd /
- Beiträge
- 1.745
- Danksagungen
- 19
Re: [PHP] Optimierung / Fragen
Ebenso verhält es sich mit != und !==PHP-Code:// hier wird überprüft, ob 1 und true bedeutungsgleich sind
$result = (1 == true);
echo $result; // wird true
// hier wird überprüft, ob 1 und true identisch sind
$result = (1 === true);
echo $result; // wird false
Warum das: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";
}
}
}
}
Da du die Unterscheidung nicht brauchst, kannst du die beiden If-Schachteln zusammenfassen:PHP-Code:if($entry !="." and $entry != ".." )
{
if(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:if($entry !="." and $entry != ".." and is_dir($imgaesDir.$entry))
{
echo "<li>".$entry."</li>\n";
}
Den Rest habe ich mir noch nicht angeschaut, mache ich bei Gelegenheit.PHP-Code:$wichtig = "Ich bin wichtig..";
function A($wichtig)
{
echo $wichtig;
}
function B()
{
global $wichtig;
echo $wichtig;
}
A($wichtig);
B();
-
16. 04. 2012, 11:29 #3
Re: [PHP] Optimierung / Fragen
Snippet 1 liesse sich durch Verwendung von glob() anstelle von opendir()/readdir() signifikant vereinfachen. Beispiel:
Dasselbe gilt analog auch für die Funktionen zum Auflisten der Verzeichnisinhalte in deinem zweiten Snippet.PHP-Code:foreach(glob('images/*', GLOB_ONLYDIR) as $dir) {
echo "<li>" . htmlspecialchars(basename($entry)) . "</li>\n";
}
-
17. 04. 2012, 00:47 #4Mitglied
(Threadstarter)
- Registriert seit
- Jun 2010
- Ort
- Australia
- Beiträge
- 227
- Danksagungen
- 0
Re: [PHP] Optimierung / Fragen
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* ?
Ja, du hastrecht, mein fehler... ich hab das garnicht gesehen/beachtet =D dadrauf haette ich auch selber kommen muessen haha =D
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!
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. =)
-
17. 04. 2012, 07:01 #5
Re: [PHP] Optimierung / Fragen
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.
Auf Systemen, welche GLOB_BRACE unterstützen, liesse sich das leicht über
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:glob('{*.jpg,*/*.jpg}',GLOB_BRACE)
PHP-Code:array_merge(glob('*.jpg'),glob('*/*.jpg'))
Geändert von Kugelfisch23 (17. 04. 2012 um 07:13 Uhr)
-


Zitieren

mehr lesen...







ver.di und VHS-Köln laden zum...
Heute, 00:01 in gulli:news