PHP-Script kann nicht auf gemapptes Laufwerk zugreifen
Robbit
- php
Salu Kollegen,
die folgende Funktion soll mir die Anzahl aller Dateien eines bestimmten Typs zählen:
function num_files( $dir, $recursive=false, $searchext, $counter=0, $totalsize=0 ) {
static $counter;
static $totalsize;
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if ($file != "." && $file != "..") {
$fileChunks = array_reverse(explode(".", $file));
$ext = $fileChunks[0];
if (is_file($dir."/".$file)&&(strtolower($ext) == strtolower($searchext))) {
$counter++;
}
else if (is_dir($dir."/".$file)) {
num_files($dir."/".$file, $recursive, $searchext, $counter);
}
}
}
closedir($dh);
}
}
return($counter);
}
Dumm nur, daß die Funktion nicht auf gemappte Netzlaufwerke zugreift. Der Apache, unter dem das PHP-Script ausgeführt wird, läuft bereits als User mit erweiterten Rechten. Wat nu?
Vielen Dank für Eure Hilfe. Es grüßt
-Rob.
hi,
Dumm nur, daß die Funktion nicht auf gemappte Netzlaufwerke zugreift.
Bitte mal testen:
Es muss anstelle eines Laufwerkes zuzuweisen eine Variable gesetzt werden:
$path = "//backup/c"; # unc: \servername\freigabename
(mit Perl geht das).
Hotte
Yerf!
Dumm nur, daß die Funktion nicht auf gemappte Netzlaufwerke zugreift. Der Apache, unter dem das PHP-Script ausgeführt wird, läuft bereits als User mit erweiterten Rechten. Wat nu?
Windows, richtig?
Die Laufwerks-Mappings sind seit Windows XP benutzerabhängig, d.h. das Mapping müsste für genau den Benutzer eingerichtet werden, unter dem der Apache läuft (per System-Aufruf und "net use"-Commando ist das evtl. aus dem Skript heraus möglich).
Alternativ könnte man auch die UNC-Pfade verwenden (also \server\freigabe\pfad).
Gruß,
Harlequin
Moin Moin!
Die Laufwerks-Mappings sind seit Windows XP benutzerabhängig,
Ich glaube, sogar schon ab 2000.
d.h. das Mapping müsste für genau den Benutzer eingerichtet werden, unter dem der Apache läuft (per System-Aufruf und "net use"-Commando ist das evtl. aus dem Skript heraus möglich).
Alternativ könnte man auch die UNC-Pfade verwenden (also \server\freigabe\pfad).
Das dürfte die stabilere Version sein. Zumindest habe ich auf einigen Windoof-Kisten reichlich Gezicke gesehen, wenn zwei verschiedene Benutzer ein Laufwerk auf den selben Buchstaben mappen wollten.
Alexander
Hello,
nette Funktion.
1. Zwei Fragen dazu: Warum static $counter und static $totalsize?
http://de3.php.net/manual/en/language.variables.scope.php#language.variables.scope.static
Kann sein, dass ich mich da irre, aber so wie ich static verstehe, kanns Du die Funktion nur
einmal pro Script sinnvoll benutzen?
Ich würde, da es sich ohnehi um zwei Ergebniswerte handelt, dafür die Referenz auf
ein Array durchreichen und als Rückgabewert lieber ein Fehlernummer nehmen
(z.B.: 0 = kein Fehler, 5 = cannot open directory... oder so );
2. Wie fängst Du das Aufhängen bei rekursiver Abarbeitung ab, wenn die Funktion auf eine Link stößt?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
echo $begrüßung;
- Zwei Fragen dazu: Warum static $counter und static $totalsize?
http://de3.php.net/manual/en/language.variables.scope.php#language.variables.scope.static
Kann sein, dass ich mich da irre, aber so wie ich static verstehe, kanns Du die Funktion nur
einmal pro Script sinnvoll benutzen?
Mit jedem Funktionsaufruf wird $counter erhöht, in Abhängigkeit von while und den ifs darin. $totalsize wird nicht verwendet. Sinnlos ist allerdings, $counter und $totalsize als Funktionsargument zu verwenden, denn die werden wegen des static ignoriert. Egal was man für einen Defaultwert nimmt oder was man übergibt, sie ändern sich dadurch nicht.
echo "$verabschiedung $name";
Hello,
- Zwei Fragen dazu: Warum static $counter und static $totalsize?
http://de3.php.net/manual/en/language.variables.scope.php#language.variables.scope.static
Kann sein, dass ich mich da irre, aber so wie ich static verstehe, kanns Du die Funktion nur
einmal pro Script sinnvoll benutzen?Mit jedem Funktionsaufruf wird $counter erhöht, in Abhängigkeit von while und den ifs darin. $totalsize wird nicht verwendet. Sinnlos ist allerdings, $counter und $totalsize als Funktionsargument zu verwenden, denn die werden wegen des static ignoriert. Egal was man für einen Defaultwert nimmt oder was man übergibt, sie ändern sich dadurch nicht.
Genau!
Mit jedem erneuten Funktionsaufruf wird $counter erhöht.
Das ist dann besonders sinnlos, wenn man die Funktion im selben Script mehrfach verwenden will.
Daher ist static hier mMn falsch eingestzt. Hier hätte man die gewünschten Ergebnisse besser als Referenz durchreichen sollen. Und weil es zwei sind, die der OP ursprünglich mal ins Auge gefasst hatte, hätte er sie als Array-Referenz durchreichen können.
Nun verstanden, was ich meinte?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
echo $begrüßung;
Mit jedem erneuten Funktionsaufruf wird $counter erhöht.
Das ist dann besonders sinnlos, wenn man die Funktion im selben Script mehrfach verwenden will.
Nö. Man kann ja auch mit mehreren Aufrufen die Anzahl der Dateien in mehreren Verzeichnissen abfragen wollen.
Hier hätte man die gewünschten Ergebnisse besser als Referenz durchreichen sollen. Und weil es zwei sind, die der OP ursprünglich mal ins Auge gefasst hatte, hätte er sie als Array-Referenz durchreichen können.
Wenn schon Referenz dann als Funktionsargument und da kann man auch zwei Einzelwerte nehmen.
echo "$verabschiedung $name";
Hello,
Mit jedem erneuten Funktionsaufruf wird $counter erhöht.
Das ist dann besonders sinnlos, wenn man die Funktion im selben Script mehrfach verwenden will.Nö. Man kann ja auch mit mehreren Aufrufen die Anzahl der Dateien in mehreren Verzeichnissen abfragen wollen.
Hier hätte man die gewünschten Ergebnisse besser als Referenz durchreichen sollen. Und weil es zwei sind, die der OP ursprünglich mal ins Auge gefasst hatte, hätte er sie als Array-Referenz durchreichen können.
Wenn schon Referenz dann als Funktionsargument und da kann man auch zwei Einzelwerte nehmen.
Ja, sach ma! Hast Du irgendwas genommen heute? :-)
Davon rede ich doch die ganze Zeit oder wie meinst Du, würde ich an eine Funktion Werte übergeben? Hast Du mich schon jemals mit "global" arbeiten sehen? Selbstverständlich werden die Werta als Funktionsargumente weitergegeben. Und das geht dann am besten als Referenz, da man sie ja auch zurück haben will. Ob das nun ein Array wird oder zwei einzelen Parameter, das hängt davon ab, wie sehr man sich sicher ist, dass die Funktion sich nicht noch weiterentwicklen soll...
Das Arbeiten mit varianten Argumentblöcken ist nicht neu aber in PHP durch die Übergabe per namen (und nicht per Offset) besonders bequem.
Und zu dem anderen Punkt:
NEIN, es ist Schwachsinn, hier static-Variablen zu benutzten.
Die Funktion wäre dann nicht frei nutzbar, sondern hätte einen Reentranzpunkt.
Ich scheue mich immer vor solchen Sprüchen, aber: MAN MACHT SOWAS NICHT.
So, nun erklär Du mir, warum es besonders geschickt ist und die Funktion universell verwendbar macht, wenn man static benutzt. Da bin ich jetzt aber gespannt.
Und sonst wünsche ich Dir eine gute Nacht :-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
echo $begrüßung;
» > Hier hätte man die gewünschten Ergebnisse besser als Referenz durchreichen sollen. Und weil es zwei sind, die der OP ursprünglich mal ins Auge gefasst hatte, hätte er sie als Array-Referenz durchreichen können.
» Wenn schon Referenz dann als Funktionsargument und da kann man auch zwei Einzelwerte nehmen.
Ja, sach ma! Hast Du irgendwas genommen heute? :-)
Nein, aber wenn du dich nicht klar ausdrückst, lässt das Interpretationsspielraum, der durchaus in eine nicht von dir vorgesehene Richtung geht. Und was das für eine Begründung sein soll, wenn zwei Parameter übergeben werden, dass das dann ein Array sein müsse entzieht sich meiner Kenntnis.
Davon rede ich doch die ganze Zeit oder wie meinst Du, würde ich an eine Funktion Werte übergeben?
Hast Du mich schon jemals mit "global" arbeiten sehen?
Ich führe keine Statistik über die von dir eingesetzten Dinge.
Selbstverständlich werden die Werta als Funktionsargumente weitergegeben. Und das geht dann am besten als Referenz, da man sie ja auch zurück haben will. Ob das nun ein Array wird oder zwei einzelen Parameter, das hängt davon ab, wie sehr man sich sicher ist, dass die Funktion sich nicht noch weiterentwicklen soll...
Auch dein Klarstellungsversuch ist kein stichhaltiges Argument für mich. In beiden Fälle verbleibt ein Anpassungsaufwand. Zudem kann ein Array hier nur ein Vehikel sein, wenn es keine bessere Möglichkeit gibt, was hier aber nicht der Fall ist. Es ist nicht ersichtlich und erforderlich, Werte zu bündeln, deren Beziehung zueinander fraglich ist.
Das Arbeiten mit varianten Argumentblöcken ist nicht neu aber in PHP durch die Übergabe per namen (und nicht per Offset) besonders bequem.
Ich habe eine Weile überlegt, was konkret du damit meinst. Es kann eigentlich nur ein PHP-typisches Array sein, denn nur da kann man etwas per Namen "positionieren". Funktionsargumente kann man bei der Übergabe nur richtig einsortieren. Eine Übergabe von Funktionsargumenten per Keyword wie bei Python möglich gibt es unter PHP nicht (Übergabe, nicht Übernahme).
NEIN, es ist Schwachsinn, hier static-Variablen zu benutzten.
Die Funktion wäre dann nicht frei nutzbar, sondern hätte einen Reentranzpunkt.
Ja, wenn man sie mehrfach unabhängig pro Scriptinstanz verwenden will. Ob das ihr Einsatzzweck ist, ist mir nicht bekannt.
Ich scheue mich immer vor solchen Sprüchen, aber: MAN MACHT SOWAS NICHT.
Eben. Deswegen versuche ich solche Aussagen zu vermeiden, ohne eine Begründung dazuzuschreiben.
So, nun erklär Du mir, warum es besonders geschickt ist und die Funktion universell verwendbar macht, wenn man static benutzt. Da bin ich jetzt aber gespannt.
Ich kenne die konkreten Anforderungen nicht und weiß deshalb auch nicht, ob sie universell verwendbar sein muss. Dass universelle Verwendbarkeit im Allgemeinen ein erstrebenswertes Ziel ist steht auf einem anderen Blatt.
echo "$verabschiedung $name";