Robbit: PHP-Script kann nicht auf gemapptes Laufwerk zugreifen

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.

  1. 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

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  2. 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

    --
    <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
    1. 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

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
  3. 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

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. echo $begrüßung;

      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?

      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";

      1. Hello,

        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?

        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

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. 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";

          1. 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

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. 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";