php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 22.09.2006, 23:50  
Benutzer
 
Registriert seit: 21.11.2004
Beiträge: 44
peng
peng eine Nachricht über ICQ schicken
Standard Ordner Browser

Hi.
Ich code zur Zeit an einer Funktion, die die Ordnerstruktur eines bestimmten Pfade einliest und diese dann als HTML-Struktur ausgiebt. Das Problem ist nur, dass diese Funktion extrem langsam ist wenn ich mal n paar Unterordner habe. Wenn ich die Daten in eine temporäre Datei speichere, geht es zwar schneller, aber dann sind die Daten nicht immer aktuell.

Mein bisheriger Code lautet folgendermaßen:
PHP-Code:
<?php
function parse_folder($folder,$name) {
    global 
$folder_id$folder_depth$folderbrowser;
        
$folder_id++;
    
$folder_depth++;
    
$subfolders = array();
    
$fv opendir($folder);
    while(
$file readdir($fv)) {
      if(
$file!='..' && $file!='.') {
        if(
is_dir($folder.$file)) {
          
array_push($subfolders,$file);
        }
      }
    }
    if(
count($subfolders)>0) { 
        
$has_subfolders true;
    } else {
        
$has_subfolders false;
    }
    
$folderbrowser .= '<div class="folder" style="position:relative; left:'.(5*$folder_depth).'px;">';
    if(
$has_subfolders == true) {
        
$folderbrowser .= '[url="javascript:expand(\''.$folder_id.'\')"]+[/url] ';
    }
    
$folderbrowser .= $name;
    if(
$has_subfolders == true) {
        
$folderbrowser .= '<div id="subfolder_'.$folder_id.'" style="display:none;">';
    }
    foreach(
$subfolders as $file) {
        
parse_folder($folder.$file.'\\',$file);
    }
    if(
$has_subfolders == true) {
        
$folderbrowser .= '</div>';
    }
    
$folderbrowser .= '</div>';
    
$folder_depth--;

}
?>
Fällt euch eine Idee ein, wie ich die Performance optimieren kann?

mfg Patrick
peng ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 23.09.2006, 08:51  
Erfahrener Benutzer
 
Registriert seit: 27.08.2004
Beiträge: 239
vollkommenegal
Standard

Bist Du sicher, dass das überhaupt funktioniert? Wenn ich parse_folder() aufrufe und danach $folderbrowser ausgebe, bekomme ich einen "+-"-Link und daneben steht der Name des Verzeichnisses, dass ich in parse_folder() übergeben habe. Soweit okay.

Klicke ich im IE auf den Link, bekomme ich einen JavaScript-Error.
Klicke ich im FireFox auf den Link, bekomme ich ebenfalls einen JavaScript-Error.

Bin ich zu blöd?

cya
vollkommenegal ist offline  
Alt 23.09.2006, 13:38  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo,
dein Code ist grauenhaft.

Was produziert deine Funktion eigentlich? Weder dokumentierst du deinen Code mitsamt seiner $..folder.. Variablen, noch macht es Sinn auf gut dünken Variablen mal als Parameter der Funktion zugänglich zu machen, mal per global rein- und wieder rauszuladen.
Außerdem vermischt du HTML und PHP, wieviel Ärger das einem machen kann sehe ich grade bei XTCommerce. Ne schlimme Sauerei, wenn du mal das Layout anpassen möchtest.
Erzeuge dir einen Daten-Array, der die ausgelesene Verzeichnis-Struktur enthält und übergib sie meinetwegen einer display()-Methode/Funktion.

Zitat:
Klicke ich im IE auf den Link, bekomme ich einen JavaScript-Error.
Die JavaScript Funktion expand() gibt es auch nicht und definiert wird sie auch nirgends.

Thread verschoben.


Zu deiner Frage aber nochmal: Du liest wie normal ein Verzeichnis aus, Performance-Bremsen sehe ich nicht. Ich war vor kurzem auch dabei, etwas ähnliches zu basteln, habe mich dann aber entschieden, keine Struktur anzuzeigen, sondern immer nur den aktuellen Zustand (welche Ordner und Dateien liegen im aktuellen Verzeichnis) und dann klickweise die nächste Ebene. Alles auf einmal kann übel viel werden, zumal den User das meiste vielleicht eh nicht interessiert.
Mach es doch so wie FileZilla (FTP Programm), das zeigt dir die Root-Ebene an und wenn du Ordner öffnest, cached es diese Information.
Natürlich nicht ewig, aber zumindest bis zum Ende der Session.
Ändert sich deine Verzeichnisstruktur denn so oft? Wie wäre es wenn du nach und nach per Ajax die Struktur nachlädst?..
Zergling-new ist offline  
Alt 23.09.2006, 19:31  
Benutzer
 
Registriert seit: 21.11.2004
Beiträge: 44
peng
peng eine Nachricht über ICQ schicken
Standard

Also, die Funktion expand() ist nur eine kleine Javascriptfunktion, die folgendermaßen aussieht:

Code:
<script language="javascript">
		function expand(id) {
			if(document.getElementById("subfolder_" + id).style.display == "none") {
				document.getElementById("subfolder_" + id).style.display = "block"
			} else {
				document.getElementById("subfolder_" + id).style.display = "none"
			}
		}
</script>
Die Variable $folder_id ist für das Javascript, dass ich jeden Unterordner einzeln ansprechen und öffnen bzw. schließen kann.

Die Variable $folder_depth ist dafür da, um die Ebene des aktuellen Ordners zu speichern, dass ich den dann entsprechend einrücken kann.

Und dann ist da noch die Variable $folderbrowser. In diese wird einfach das erzeugte HTML gespeichert, damit ich dass dann später in meine Seite einfügen kann.


So, jetzt nochmal der extrem kommentierte Code, dass euch das mal klar ist, was ich da eigentlich gemacht habe:
PHP-Code:
<?php
$folder_id 
1// Die eindeutige ID jedes Ordners, um ihn später per Javascript anzuzeigen, oder zu verstecken
$folder_depth 0// Die Ordnertiefe des aktuellen Ordners, um ihn entsprechend einzurücken
$folderbrowser ""// Das HTML des Ordnerbrowsers

/*
function parse_folder($folder, $name)

$folder ist der komplette Pfad des Ordners, der ausgelesen werden soll
$name ist der Name des Ordners der im HTML verwendet wird
*/
function parse_folder($folder$name) {
    global 
$folder_id$folder_depth$folderbrowser// Die benötigten globalen Variablen holen
    
$folder_id++; // Neue ID für neuen Ordner
    
$folder_depth++; // Da wir einen neuen Unterordner anlegen müssen wir die Ordnertiefe erhöhen
    
$subfolders = array(); // Array erstellen in dem die Unterordner gespeichert werden
    
$fv opendir($folder); // Den Ordner öffnen
    
while($file readdir($fv)) { // Alle Einträge des Ordners auslesen
      
if($file!='..' && $file!='.') { // Wenn der aktuelle Eintrag kein Verweis auf den Aktuellen oder übergeordneten Ordner ist...
        
if(is_dir($folder.$file)) { // ...und wenn der aktuelle Eintrag in Ordner ist...
          
array_push($subfolders,$file); // ...dann füge den Eintrag dem Array $subfolder hinzu
        
}
      }
    }
    
// Herausfinden, ob der Ordner überhaupt Unterordner hat und das dann in der Variable $has_subfolders speichern
    
if(count($subfolders)>0) { 
        
$has_subfolders true;
    } else {
        
$has_subfolders false;
    }
    
$folderbrowser .= '<div class="folder" style="position:relative; left:'.(5*$folder_depth).'px;">'// Einen neuen DIV-Tag starten und ihn Relativ zur orginalen Position pro Ordnertiefen-Level um 5 Pixel einrücken.     
    
if($has_subfolders == true) {
        
$folderbrowser .= '[url="javascript:expand(\''.$folder_id.'\')"]+[/url] '// Wenn der Ordner Unterordner hat, dann füge einen Link hinzu, um den DIV-Tag mit den Unterordnern zu öffnen oder schließen
    
}
    
$folderbrowser .= $name// In den DIV-Tag den Namen des aktuellen Ordners einfügen
    
if($has_subfolders == true) { // Wenn der Ordner Unterordner hat...
        
$folderbrowser .= '<div id="subfolder_'.$folder_id.'" style="display:none;">'// ...füge einen weiteren DIV-Tag ein,der eine eindeutige ID hat... 
        
foreach($subfolders as $file) {
            
parse_folder($folder.$file.'\\',$file); // ...und parse alle darin enthaltenen Unterordner
        
}
        
$folderbrowser .= '</div>'// Schließe den DIV-Tag für die Unterordner
    
}
    
$folderbrowser .= '</div>'// Schließe den DIV-Tag für den Aktuellen Ordner
    
$folder_depth--; // Da wir mit dem Ordner fertig sind können wir wieder die Ordnertiefe erniedrigen

}
?>
Ich will mehr oder weniger ein kleines Kontrollpanel für den Apache-Webserver basteln. Und da will ich auch die Funktion einbauen, bestimmte Ordner mit .htaccess Passwort zu schützen, bzw. allgemein die .htaccess-Dateien für jeden einzelnen Ordner anzupassen.

Tut mir Leid, wenn ich das am Anfang net richtig dokumentiert habe. (Ist das jetzt besser, oder wieder zu ausführlich? )

Also ihr denkt ich sollte es am Besten per AJAX einzeln nachladen, ja?


mfg Patrick
peng ist offline  
Alt 24.09.2006, 08:18  
Erfahrener Benutzer
 
Registriert seit: 27.08.2004
Beiträge: 239
vollkommenegal
Standard

Zitat:
Also ihr denkt ich sollte es am Besten per AJAX einzeln nachladen, ja?
Ich würde es zumindest mal probieren...

mfg

P.S.: Respekt. Nettes Skript.
vollkommenegal ist offline  
Alt 24.09.2006, 14:31  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Naja ob du es mit Ajax machst hängt a) davon ab, ob du mit Ajax Erfahrung hast und b) musst du selbst nochmal überlegen, ob du es überhaupt so machen möchtest.
Zergling-new ist offline  
Alt 24.09.2006, 18:36  
Benutzer
 
Registriert seit: 21.11.2004
Beiträge: 44
peng
peng eine Nachricht über ICQ schicken
Standard

Also ich habs jetzt mit Ajax gemacht, funktioniert prächtig.
peng ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zugriff mit session auf Ordner begrenzen Diego1978 PHP Tipps 2008 1 08.07.2008 06:38
[Erledigt] PHP -&gt; Ordner anlegen der sich auch beschreiben lässt?! Nightuser PHP Tipps 2008 13 30.06.2008 23:51
Serverbeschränkung (Ordner beschränkung) triopsi Server, Hosting und Workstations 2 29.04.2008 17:07
für jedes Event immer neuen Ordner anlegen, sinnvoll? Matthiasnet PHP Tipps 2007 3 19.05.2007 11:57
TreeMenu Fatal Error PHP Tipps 2006 8 07.04.2006 11:22
Unter ordner und Files automatisch auslesen lichtscheu PHP Tipps 2006 6 09.03.2006 19:19
Ordner auf Inhalt prüfen Juuro PHP Tipps 2005-2 10 20.07.2005 19:22
Kann keine Datei im eigens erstellten Ordner anlegen PHP Tipps 2005 8 11.03.2005 21:03
kann php ordner und file unterscheiden? Promaetheus PHP Tipps 2004 7 14.09.2004 14:58
ordner in einem verzeichnis auslesen und anzeigen lindner PHP Tipps 2004 5 19.08.2004 00:03
WebFTP: php denkt die ordner wären dateien... phpfortgeschrittener PHP Tipps 2004 15 09.08.2004 18:38
Ist der Ordner schon vorhanden? Pimbolie1979 PHP Tipps 2004 2 21.07.2004 15:02
Ordner per Skript erstellen --> Rechte Problem PHP Tipps 2004 2 06.07.2004 14:19
Ordner Auslesen PHP Tipps 2004 3 03.07.2004 09:17
Ordner lesen --> Baumstruktur --> Problem PHP Tipps 2004 0 30.06.2004 17:22

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php folder browser, php ordnerbrowser, php ordner browser, microsoft office suite 2007 service pack 1, php folder bwroser, php ordnertiefe, ordner um browser php, folder_depth=, ordnerbrowser, folderbrowser javascript, ordnerbrowser html, php array unterordner erstellen code, xajax unterordner sehr langsam, is_dir übergeordnet, ordner browser, folder browser style

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:52 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.