Verzeichnisse und Dateien zählen

radarin

Angesehenes Mitglied
Hallo Liste
Mit dem folgenden Script zähle ich alle Verzeichnisse und Dateien auf meiner Domain, und an anderer Stelle lediglich die Dateien innerhalb der Fotogallery, was natürlich wesentlich weniger zu rechnen gibt. Auf dem Bisherigen Server lief das ganze zügig ab, auf dem newuen Server dauert es ewig bis zur Meldung Fatal error: Maximum execution time of 1 second exceeded. Beanstandet werden jeweils verschiedene Zeilen.

CODE
<?PHP

function count_file($dir)
{

// Ueberprueft ob das angegebene Verzeichnis existiert
if(is_dir($dir))
{
$afile[directory]=0;
$afile[file]=0;
$afile[size]=0;

chdir($dir);
$handle=opendir(".");
while($file=readdir($handle))
{

// Handelt es sich bei $file um ein Unterverzeichnis?
if(is_dir($file) && $file!="." && $file!="..")
{

// directory um eins erhoehen
$afile[directory]++;

// rekursiver Aufruf mit aktuellem Verzeichnis
$y=count_file($file);

// Ergebnisse des rekursiven Aufrufs der Funktion zu
// directory und file aufaddieren, size
$afile[directory]+=$y[directory];
$afile[file]+=$y[file];
$afile[size]+=$y[size];
}

// Handelt es sich bei $file um eine Datei?
if(is_file($file))
{

// file um eins erhoehen / dateigrösse addieren
$afile[file]++;
$afile[size] += filesize($file);
}
}

// Verzeichnisstruktur zurueck gehen
if(stristr($dir,"../")) chdir($_SERVER["DOCUMENT_ROOT"].substr($_SERVER["PATH_INFO"],0,strrpos($_SERVER["PATH_INFO"],"/")));
elseif($dir!=".") chdir("../");

closedir($handle);
}

return $afile;
}





function fs_convert ($datei, $nachkommastellen = 0) {
$size = $datei;
if($size >= 1073741824) {
return round($size/(1073741824), $nachkommastellen)." GB";
}

if($size >= 1048576) {
return round($size/(1048576), $nachkommastellen)." MB";
}

if($size >= 1024) {
return round($size/(1024), $nachkommastellen)." KB";
}

return $size." Byte";
}


// Aufruf der Funktion

$dir="/home/domain/public/";
$atest=count_file($dir);



?>



Offenbar ist der Server damit überfordert. Aber warum? Gibt es eine Elegantere Lösung? In meinem Galleryscript lese ich die Verzeichnisse oder die Bilder innerhalb einer Verzeichnisses aus. In der Liste will ich einfach nur anzeigen, wieviele weitere Verzeichnisse darin enthalten sind, oder wieviele Bilder...

Thanks, René
 
hi,

sieht nach einem Script aus selfphp aus?!

QUOTE Fatal error: Maximum execution time of 1 second exceeded.


Du kannst in der Datei php.ini den Parameter "max_execution_time" ändern.

Falls php nicht im safe_mode läuft, kannst Du am Anfang des Scripts auch mal den Befehl:
set_time_limit(Anzahl_Sekunden)
hinzufügen.

hth
Duvi
 
hey.

Hat zwar keinen direkten Zusammenhang mit deinem Problem, aber schau dir auch mal an wie du ein Verzeichnis korrekt durchlaufen solltest: http://ch2.php.net/readdir

CODE /* Das ist der korrekte Weg, ein Verzeichnis zu durchlaufen. */
while (false !== ($file = readdir($handle))) {
echo "$file\n";
}

/* Dies ist der FALSCHE Weg, ein Verzeichnis zu durchlaufen. */
while ($file = readdir($handle)) {
echo "$file\n";
}



Gruss

Matthias
 
Stimmt, das Script habe ich mir nicht selber aus den Fingern gesogen. Nur auf dem einen Server läufts, auf dem Anderen nicht mehr.

SaveMod? Schon mehrfach gelesen, sagt mir sonst aber nichts. Die Laufzeit verlängern macht keinen Sinn, das Script sollte sich innert Sekunden abarbeiten und nicht nach einer Minute einen Laufzeitfehler ausgeben.

So wie von Matthias beschrieben bringt es leider auch nichts, das Script hängt sich weiter nach einer Ewigkeit auf...
 
CODE $afile[directory]=0;
$afile[file]=0;
$afile[size]=0;

PHP kennt weder das Array $afile noch die Konstanten directory, file oder size.
Besser:

CODE $afile = array(
'directory' => 0,
'file' => 0,
'size' => 0
);



CODE chdir($dir);
$handle=opendir(".");

Wieso so kompliziert? Du kannst ein Verzeichnis auch direkt öffnen, dann entfällt auch das zurückwechseln in das Originalverzeichnis am Ende. Außerdem ist es sinnvoll eine Fehlerbehandlung einzubauen.
Besser:

CODE $handle = opendir($dir) or trigger_error('Could not open ' . $dir, E_USER_ERROR); // E_USER_ERROR bricht das Script ab, um nur eine Fehlermeldung auszugeben E_USER_WARNING verwenden)



CODE while($file=readdir($handle)) {

Wie Matthias Müller schon angemerkt hat, kann dies zu Fehlern führen, da PHP sich nicht strikt an Typen hält.
Besser:

CODE while(($file =readdir($handle)) !== false) {


$_SERVER["PATH_INFO"] existiert auf meiner Testumgebung gar nicht. Aber daran wird es kaum liegen, da PHP sonst einen Error ausgeben müsste (WARNING).

Ansonsten kann ich zumindest keine Fehler entdecken, die das Script total verlangsamen würden. Sicher, gibt noch einiges zu verbessern aber das würde alles zusammen nichtmal eine Millisekunde ausmachen.
Falls es dich noch interessiert, hier kannst du dir meine Version anschauen (Lizenz da zu wenig an eigenem Material Public Domain).


Gruß,
Liste ;-)
 
Danke für deine Erläuterungen. Hab alle Vorschläge ausprobiert. Bringt leider nicht den gewünschten Erfolg. Auch Dein Script läuft bei mir nicht. Bleibt bei einer Datei stehen, weil die Grösse nicht definiert werden kann. Kommentiere ich die Fehlermeldung aus, so bleibt das Script einfach irgendwann kommentarlos stehen.
 
Ich denke du solltest deinen Hoster kontaktieren, denn so wie es aussieht muss dieser die Einstellung max_execution_time in der php.ini Datei korrekt setzen. Die max. Ausführung von 1 Sekunde ist sicherlich zu tief.

Lexus
 
Also das mit der Datei liegt wahrscheinlich an eingeschränkten Rechten, zumindest Leserechte sollte der Nutzer unter dem PHP/der Webserver läuft schon haben. Eine andere Möglichkeit wäre dass PHP Probleme damit hat die Dateigröße eines Links zu erkennen, das schaue ich mir besser morgen nochmal genauer an.

Zum Thema max_execution_time:
Von einem Hoster der den Wert so tief setzt erwarte ich mir dass ich entweder der einzige Kunde auf einem Quad-Xeon-System mit 16 GB Ram (dann gehts sicher unter 1 Sekunde) bin oder dass es nur ein Denkfehler bei der Konfiguration war der nun schnellstmöglich behoben wird ;-)

Gruß,
David
 
Bin die letzten wochen nicht dazu gekommen mich um das Problem zu kümmern. Derzeit sind die Werte so eingestellt:

CODE

engine = On
short_open_tag = On
asp_tags = Off
precision = 14
y2k_compliance = Off
output_buffering = Off

implicit_flush = Off

allow_call_time_pass_reference = On

safe_mode = Off
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_

safe_mode_protected_env_vars = LD_LIBRARY_PATH

max_execution_time = 30
memory_limit = 48M



file_uploads = On
upload_tmp_dir = /tmp
upload_max_filesize = 10M
allow_url_fopen = Off

...u.a.





Jetzt soll ich in der .htaccess noch ein Eintrag von su_php
machen. Wie geht das? was muss ich da eintragen?

Gruss René




 
eine zeile in die datei .htaccess einfügen:

suPHP_ConfigPath /pfad/zum/Verzeichnis/wo/die/php.ini/liegt/

den pfad natürlich anpassen, und nur bis zum verzeichnis, nicht direkt auf die php.ini selbst.
 
Danke, das grundsätzlche Problem besteht allerdings noch immer, der Seitenaufbau bleibt stehen und der Browser braucht eine Minute um die Seite zu laden...
 
Zurück
Oben