Michimu: Verzeichnis opendir problem

Hallo und schönen guten Morgen,

habe hier ein keines Problem mit opendir();
Habe hier einen Eindows XP Rechner noch rumstehen, auf dem auch Apache drauf ist und der für kleine Emailzwecke mißbraucht wird.

In einer Webseite haben ich folgendes drinnen, daß mir echte Probeleme macht, da es mir die Anzahl der Dateien nicht zurück gibt... es stehe immer 0 Datein als Ausgabe da !!...

<?
//session_start();  -> Test, noch nicht verfügbar.
$benutzername = "Michael1";

// *** Verzeichnis lesen -> Transmission availabel <-

$anzahl=0;
$handle=opendir("c:/Mail-Service/Hamster V1.3.23/Mails/$benutzername");
while ($file = readdir ($handle)) {
if ($file != "" && $file != "." && $file != "..") {
if(is_file ($file)){
$anzahl++;
}
}
}
closedir($handle);

if($anzahl != 0)
echo "Transmission availabel";
else
  echo "no Transmission";
?>

Warum mag das nicht so wie ich ...
$handle=opendir("c:/Mail-Service/Hamster V1.3.23/Mails/$benutzername");

Könnt Ihr mir sagen wo ich da den Fehler habe ?

Gruß
Michimu

  1. Hallo Michimu,

    $benutzername = "Michael1";
    // *** Verzeichnis lesen -> Transmission availabel <-

    Nur eine Anmerkung: es heißt "available" :-)

    $anzahl=0;
    $handle=opendir("c:/Mail-Service/Hamster V1.3.23/Mails/$benutzername");

    Hier solltest Du überprüfen, ob opendir erfolgreich war, siehe erste Benutzer-Anmerkung in http://de3.php.net/manual/de/function.readdir.php.

    while ($file = readdir ($handle)) {
    if ($file != "" && $file != "." && $file != "..") {

    $file != "" kannst Du Dir sparen. Der Leerstring entspricht dem boolschen Wert false, somit würde der Schleifenrumpf überhaupt nicht abgearbeitet werden, siehe auch http://de3.php.net/manual/de/language.types.boolean.php.

    Könnt Ihr mir sagen wo ich da den Fehler habe ?

    Meine Vermutung ist, dass opendir fehlschlägt.

    Freundliche Grüsse,

    Vinzenz

    1. Hallo Vinzenz,

      du hast Recht, opendir scheitert.
      Was ich nun erfahren habe - google usw. - kann opendir nur im Stammverzeichnis "leben" und ausgeführt werden.
      Bedeutet... Nur im Verzeichnis htdocs läuft es ast rein.

      Es würde zwar eine Möglichkeit geben über die httpd einen Alias zu setzen, was aber angeblich alles andere als gut sein sollte und angeblich auch unsicherheiten bringen soll...

      ABER ... ;-)

      Habe mir einen Trick einfallen lassen....
      Da mann diese Abfrage ja sowieso nur nur dann laufen lassen sollte, den Sinn davon hast du bestimmt bemerkt -Wenn Hamster Emails abruft, soll das beim "Benutzer" angezeigt werden - also braucht mann sagen wir mal alle 20 min. eine routine die die Abfrage wiederholt.

      Also das PHP säubern, in den Ornder Mails von Hamster legen, eine Batchdatei basteln über cliphp.exe das ergebnis jeweils in den "Benutzer-Ordner / Emailempfänger" und schon läuft es ...

      Gruß
      Michimu

      1. Hallo Michimu,

        du hast Recht, opendir scheitert.

        Du solltest dennoch den Hinweis von Eddi beachten, https://forum.selfhtml.org/?t=101675&m=624583.

        Da mann diese Abfrage [...] - also braucht mann sagen wir mal alle 20 min. eine routine die die Abfrage wiederholt.

        Wie wär's mit einer Frau? *fg*

        Freundliche Grüsse,

        Vinzenz

        PS: Du könntest Österreich einsetzen :-)

        1. .....

          Da mann diese Abfrage [...] - also braucht mann sagen wir mal alle 20 min. eine routine die die Abfrage wiederholt.

          Wie wär's mit einer Frau? *fg*

          oh ups ;-)))

          Viele Grüße...

          Michimu

      2. Hallo Michimu,

        Was ich nun erfahren habe - google usw. - kann opendir nur im Stammverzeichnis "leben" und ausgeführt werden.
        Bedeutet... Nur im Verzeichnis htdocs läuft es ast rein.

        auf was steht denn open_basedir?

        Grüße aus Nürnberg
        Tobias

    2. Hallo Michimu,

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

      Wie Tom schon zu sagen pflegte "Schon Scheiße, wenn die erste Datei im Verzeichnis '0' heißt *gg*"

      while(($f=readdir($handle))!==FALSE)

      Gruß aus Berlin!
      eddi

      1. Hallo XaraX!

        btw. der Bug in scandir() wurde behoben: http://bugs.php.net/bug.php?id=31515

        Messung vor dem Bugfix:

        scandir (loop:1, files:10000)
        mem: 40M
        time: 0.40674495697021s

        my_scandir (loop:1, files:10000)
        mem: 1M
        time: 0.17293095588684s

        scandir (loop:100, files:10000)
        mem: 40M
        time: 41.659919977188s

        my_scandir (loop:100, files:10000)
        mem: 1M
        time: 20.631703853607s

        Messung nach dem Bugfix:

        scandir (loop:1, files:10000)
        mem: 1M
        time: 0.050025939941406s

        scandir (loop:100, files:10000)
        mem: 1M
        time: 8.0913100242615s

        function my_scandir($dir) {  
                $dh  = opendir($dir);  
                while (false !== ($filename = readdir($dh))) {  
                        $files[] = $filename;  
                }  
                sort($files);  
                return $files;  
        }
        

        Selbst ohne sort() in my_scandir() ist scandir() noch schneller, obwohl da in jedem Fall sortiert wird.

        Grüße
        Andreas

        --
        SELFHTML Linkverzeichnis: http://aktuell.de.selfhtml.org/links/
        1. Hallo Andreas,

          vielen Dank an Dich, daß Du Dich der Sache angenommen hast! Ich selbst bin da zu ängstlich, nicht zuletzt wegen meinem erbärmlichem Englisch :)

          Gruß aus Berlin!
          eddi

          1. Hallo!

            vielen Dank an Dich, daß Du Dich der Sache angenommen hast! Ich selbst bin da zu ängstlich, nicht zuletzt wegen meinem erbärmlichem Englisch :)

            Das ist doch Quatsch, meines ist auch erbärmlich ;-)

            Wenn Du Dir sicher bist dass Du einen Fehler in PHP gefunden hast, hilfst Du am meisten wenn Du den Fehler bei bugs.php.net meldest (nachdem Du Dich davon überzeugt hast dass dieser Bug noch nicht gelemdet wurde). Die wenigsten Leute da haben englisch als Muttersprache, d.h. man ist darin geübt Leute wie Dich und mich zu verstehen ;-)

            Grüße
            Andreas

            --
            SELFHTML Linkverzeichnis: http://aktuell.de.selfhtml.org/links/
            1. Hallo Andreas,

              hast Du Ahnung, wie ich aus den Sourcen PHPs sauber ein paar PHP-eigene Funktionen rauslösche?
              Als Beispiel möchte ich die Funktion mail() entfernen. In Welchen Dateien müßte ich suchen?

              Gruß aus Berlin!
              eddi

              1. Hallo!

                hast Du Ahnung, wie ich aus den Sourcen PHPs sauber ein paar PHP-eigene Funktionen rauslösche?

                Warum willst Du das machen? Bedenke was Du Dir damit an zusätzlichem Pflegeaufwand einhandelst, wenn PHP aktualisiert wird...

                Als Beispiel möchte ich die Funktion mail() entfernen.

                Warum verwendest Du nicht einfach disable_function?

                In Welchen Dateien müßte ich suchen?

                Ich kenne mich mit dem PHP-Source nicht so besonders gut aus, bei Extension müsste eine PHP Funktion normalerweise per "function_entry" registriert werden, was bei ext/standard/mail.c allerdings nicht gemacht wird (ist ja auch keine richtige Extension). Soweit ich das auf die Schnelle sehe, werden die Standard-Funktionen alle in ext/standard/basic_functions.c registriert. Vermutlich reicht es entsprechende Stellen dort und vielleicht auch in ext/standard/php_standard.h auszukommentieren. Aber wie gesagt - mit einem ganz dicken Fragezeichen versehen ;-) Du könntest ja auch als quick&dirty hack für sendmail_path sowas wie /dev/null verwenden >:->
                Das wäre evtl. eine Frage die man auf php.general (ich weiß, da gibts viel Müll, lesen aber auch einige der Devs), oder sogar php.internals stellen könnte.
                Aber vielleicht kann Dir auch hier noch jemand anders weiterhelfen...

                Ich würde das erhlich gesagt nicht im Source machen.

                Grüße
                Andreas

                --
                SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/
                1. Hallo ;-)

                  Naja, wenn man einmal dabei ist...

                  Ich hab mal folgendes probiert:

                  --- ext/standard/basic_functions.c    2005-01-18 12:32:10.000000000 +0100  
                  +++ ext/standard/basic_functions.c    2005-02-22 19:20:29.000000000 +0100  
                  @@ -701,8 +701,8 @@  
                    
                          /* functions from mail.c */  
                   #ifdef HAVE_SENDMAIL  
                  -       PHP_FE(mail,                                                           NULL)  
                  -       PHP_FE(ezmlm_hash,                                                     NULL)  
                  +/*     PHP_FE(mail,                                                           NULL)*/  
                  +/*     PHP_FE(ezmlm_hash,                                                     NULL)*/  
                   #endif  
                    
                          /* functions from syslog.c */
                  

                  Durch diese Änderung werden die beiden Funktionen von mail.c nicht registriert. Wenn man das dann kompiliert ergibt folgendes Script:

                  <?php  
                  var_dump(function_exists('mail'));  
                  var_dump(mail('akorthaus@web.de','test','test'));  
                  ?>
                  

                  folgende Ausgabe:

                  bool(false)
                  Fatal error:  Call to undefined function mail() in /home/akorthaus/test/mailt.php on line 3

                  scheint also zu funktionieren ;-)

                  Aber wie gesagt, keine Garantie dass das nicht doch irgendwelche Nebenwirkungen hat.

                  Grüße
                  Andreas

                  --
                  SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/
                  1. Hallo Andreas,

                    das werde ich probieren. Viel Dank!

                    Gruß aus Berlin!
                    eddi

                2. Hallo!

                  hast Du Ahnung, wie ich aus den Sourcen PHPs sauber ein paar PHP-eigene Funktionen rauslösche?
                  Warum willst Du das machen?

                  Ersteinmal geht es mir nur um einen Test, ob und wie PHP darauf reagiert. Dann, wenn keine Mucken auftreten, würde ich gerne (beim Beispiel bleibend) eine eigene Funktion mail() in PHP schreiben und die Funktion mit auto_append_file wieder anlegen.

                  Bedenke was Du Dir damit an zusätzlichem Pflegeaufwand einhandelst, wenn PHP aktualisiert wird...

                  Das weiß ich und ich sehe es mit großer Sorge, allerdings muß ich das jetzt schon beim apachen...

                  Als Beispiel möchte ich die Funktion mail() entfernen.
                  Warum verwendest Du nicht einfach disable_function?

                  Vielleicht ist das einfach nur ein Denkfehler: Ich würde gerne eigene Funktionalitäten für mail() nutzen wollen, jedoch andere darüber im Unklaren lassen (so gut das mit get_defined_functions() halt machbar ist ;). Es soll also nur die Funktionalität geändert werden ohne einen Redeclare auszulösen, daher kommt nur einundderselbe Name in Frage. Gäbe es andere Möglichkeiten?

                  In Welchen Dateien müßte ich suchen?
                  Ich kenne mich mit dem PHP-Source nicht so besonders gut aus, bei Extension müsste eine PHP Funktion normalerweise per "function_entry" registriert werden, was bei ext/standard/mail.c allerdings nicht gemacht wird (ist ja auch keine richtige Extension). Soweit ich das auf die Schnelle sehe, werden die Standard-Funktionen alle in ext/standard/basic_functions.c registriert. Vermutlich reicht es entsprechende Stellen dort und vielleicht auch in ext/standard/php_standard.h auszukommentieren.

                  Danke! In ext habe ich natürlich nicht geschaut.

                  Aber wie gesagt - mit einem ganz dicken Fragezeichen versehen ;-) Du könntest ja auch als quick&dirty hack für sendmail_path sowas wie /dev/null verwenden >:->

                  *lach* es soll ja was bei rauskommen, was mit identischen Parametern aber nur im Endeffekt(!) gleiches vollzieht.

                  Das wäre evtl. eine Frage die man auf php.general (ich weiß, da gibts viel Müll, lesen aber auch einige der Devs), oder sogar php.internals stellen könnte.
                  Aber vielleicht kann Dir auch hier noch jemand anders weiterhelfen...

                  Ich würde das erhlich gesagt nicht im Source machen.

                  Dabei ist mir auch unwohl; wenn es nicht anders geht, muß ich da hineinknien ;_(

                  Gruß aus Berlin!
                  eddi

                  1. Hoi!

                    Ersteinmal geht es mir nur um einen Test, ob und wie PHP darauf reagiert.

                    ;-)

                    Dann, wenn keine Mucken auftreten, würde ich gerne (beim Beispiel bleibend) eine eigene Funktion mail() in PHP schreiben und die Funktion mit auto_append_file wieder anlegen.

                    Das würde ja wenig Sinn machen, aber vermutlich meinst Du auto_prepend_file. Ja, das sollte wohl funktionieren. Verstehe allerdings immer noch nicht den Sinn, warum man sowas wollen könnte ;-)

                    Bedenke was Du Dir damit an zusätzlichem Pflegeaufwand einhandelst, wenn PHP aktualisiert wird...

                    Das weiß ich und ich sehe es mit großer Sorge, allerdings muß ich das jetzt schon beim apachen...

                    Das wird vor allem schwierig wenn mal eine recht lange Zeit zwischen Updates  liegt, wenn jemand anders ein Update machen muss...

                    IMHO bringt sowas meist mehr Probleme als Nutzen. Den Source zu bearbeiten sollte meiner Meinung nach immer das allerletzte Mittel bleiben. Vielleicht könnte man das bei Gentoo per Portage-Overlay etwas vereinfachen, allerdings zweifele ich selbst daran. Vor allem wenn so ein Patch bei Updates angepasst werden muss dann hilft alles nichts. Wenn sich dann die Patches häufen wird das früher oder später eine ganz schon fiese Sache. Etwas besser wartbar wäre evtl. eine eigene PHP-Extension, die sich darum kümmert, das geht dann wenigstens so lange gut wie sich die API nicht ändert ;-)

                    Als Beispiel möchte ich die Funktion mail() entfernen.
                    Warum verwendest Du nicht einfach disable_function?

                    Vielleicht ist das einfach nur ein Denkfehler: Ich würde gerne eigene Funktionalitäten für mail() nutzen wollen, jedoch andere darüber im Unklaren lassen (so gut das mit get_defined_functions() halt machbar ist ;). Es soll also nur die Funktionalität geändert werden ohne einen Redeclare auszulösen, daher kommt nur einundderselbe Name in Frage. Gäbe es andere Möglichkeiten?

                    Du kannst in einer Extension auch Funktionen überschreiben. xdebug macht das z.B. mit der Funktion var_dump(), die bei xdebug schön buntes HTML ausgibt (was nebenbei bemerkt sehr angenehm beim debuggen ist).

                    Ich weiß nicht ob das der vollständige Code ist, aber folgende Zeilen haben auf jeden Fall was damit zu tun:

                     zend_hash_find(EG(function_table), "var_dump", 9, (void **)&orig);  
                     orig->internal_function.handler = zif_xdebug_var_dump;  
                    
                    

                    So könntest Du halt eine eigene kleine Extension schreiben, die entsprechendes mit mail() macht. Wäre sicher eine nette Übung ;-) Der Vorteil wäre, dass eben diese Extension auch bei einem Update nicht verändert werden muss. Solange die API sich nicht ändert (kommt nicht wirklich oft vor...) kann man die Extension als .so im Verzeichnis liegen haben, und per php.ini einbinden.

                    Wie so eine Extension erstellt wird:

                    http://cvs.php.net/co.php/php-src/ext/skeleton/  (veraltet) http://cvs.php.net/pecl/PECL_Gen/ (aktuell, mit manual)

                    Ich weiß allerdings nicht wie man eine Standard-Funktion aus einer Extension heraus deaktiviert, vor allem so dass sie von einer User-Funktion überschrieben werden kann. Möglich dass das geht. Bei der xdebug Variante müsstest Du Deine neue Mail-Funktion in C implementieren, was nicht immer so witzig ist ;-)

                    Grüße
                    Andreas

                    --
                    SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/
                    1. Re:

                      auto_prepend_file.

                      Stimmt!

                      Etwas besser wartbar wäre evtl. eine eigene PHP-Extension, die sich darum kümmert, das geht dann wenigstens so lange gut wie sich die API nicht ändert ;-)

                      Eigene API *lach* ich krepel bei C mit hallo.c herum.

                      Vielen Dank auch für die anderen aufschlußreichen Verweise und Informationen, aber ich glaube, wir sollten das hier abbrechen sonst mutiere vom PHP-Bastler zum Profi-Programmierer. Ein bischen Naivität muß ich mir noch behalten, um Spaß an PHP zu haben, sonst packt mich doch noch ernsthalft die Lust C/C++ durchzukauen :)

                      Gruß aus Berlin!
                      eddi

  2. Hello,

    <?
    //session_start();  -> Test, noch nicht verfügbar.
    $benutzername = "Michael1";

    // *** Verzeichnis lesen -> Transmission availabel <-

    $anzahl=0;
    $handle=opendir("c:/Mail-Service/Hamster V1.3.23/Mails/$benutzername");

    Hier wurde ein _Handle_ besorgt

    while ($file = readdir ($handle)) {
    if ($file != "" && $file != "." && $file != "..") {
    if(is_file ($file)){

    hier wurde mit einem _Namen_ gearbeitet.

    Bei solchen Differenzen muss immer die rote Lampe angehen.

    if (is_file ($dir.$file))    wäre Dein Freund

    wenn in $dir das Verzeichnis mit dem abschließenden Verzeichnis-Separator steht

    die anderen Prüfungen kannst Du Dir dann schenken.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau