Tom: Locking auf Windows-Systemen, Helfer gesucht

Hello Fortgeschrittene,

ich ahbe leider mein WAMP-System hier übereilt vor eineigen Wochen gelöscht, da ich mit mehreren LAMPs arbeiten kann.

Nun sitze ich am Artikel zum Locking, und versuche die Aussagen aus der Literatur bezüglich Windows zu verifizieren. Neuinstallation möchte ich mir im Moment ersparen, da kein Platz mehr auf der Platte ist.

Wenn ich ein paar PHP-Testscripte zur Verfügung stelle, wäre dann jemand bereit, die auf einem WAMP-System zu testen? Handelt sich nur um einige hundert Bytes große Scripte.

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

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
  1. Hallo, Tom!

    Wenn ich ein paar PHP-Testscripte zur Verfügung stelle, wäre dann jemand bereit, die auf einem WAMP-System zu testen? Handelt sich nur um einige hundert Bytes große Scripte.

    hab einen laufen (xampp), wenn du mir sagst, was ich machen soll, kann ichs hier testen.

    freundl. Grüsse aus Berlin, Raik

    1. Hello,

      Wenn ich ein paar PHP-Testscripte zur Verfügung stelle, wäre dann jemand bereit, die auf einem WAMP-System zu testen? Handelt sich nur um einige hundert Bytes große Scripte.

      hab einen laufen (xampp), wenn du mir sagst, was ich machen soll, kann ichs hier testen.

      Ok, ich mach mal ein paar kleine Testscripte fertig. Du musst sie nur ín mehreren Browserinstanzen starten und mir dann die Ausgaben mitteilen. Ich teste das erstmal auf das Verhalten auf Linux, dann schreibe ich das Script hier in den Thread.

      Bis denne also

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

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
  2. wenn ich zeit habe, dass ich das auf mein Laptop testen

    der hat XAMPP drauf

  3. Hello,

    <?php #### exclusive_lock.php ####

    Testet Locking-Verhalten

    ini_set("track_errors","1");
    set_time_limit(0);

    echo "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.1 Transitional//EN">\n";
    echo "<HTML>\n";
    echo "<HEAD>\n";
    echo "  <TITLE>Dauerlauf</TITLE>\n";
    echo "</HEAD>\n";
    echo "<BODY>\n";

    $ok = ignore_user_abort();
    if ($ok)
    {
      echo "Abbruch durch Benutzer wird ignoriert<br />";
    }
    else
    {
      echo "Abbruch durch Benutzer stoppt das Script<br />";
    }
    flush();

    diese Schleife läuft solange, bis der Client einen Abbruch sendet

    es wird eine Datei angelegt /geöffnet und dann gesperrt.

    $fh = fopen('lockversuch.txt','a+');
    if (!$fh)
    {
      echo "Datei konnte nicht angelegt/geöffnet werden";
      exit;
    }

    $lock_ok = flock($fh,LOCK_EX + LOCK_NB);
    if (!$lock_ok)
    {
      echo "Datei konnte nicht gesperrt werden<br />\n";
      exit;
    }
    else
    {
      echo "Datei wurde im exclusive Mode gesperrt<br />\n";
      echo "Freigabe erfolgt 3 Sekunden nach Schließen des Fensters oder STOPP<br/>\n";
    }

    while (!connection_aborted())
    {
      echo getmypid()." ".time()." lebt noch<br />";
      flush();
      sleep(3);
    }

    echo "</body>\n";
    echo "</html>";
    ?>
    ---------------------------------------------------------------------------
    <?php #### shared_lock.php ####

    Testet Locking-Verhalten

    ini_set("track_errors","1");
    set_time_limit(0);

    echo "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.1 Transitional//EN">\n";
    echo "<HTML>\n";
    echo "<HEAD>\n";
    echo "  <TITLE>Dauerlauf</TITLE>\n";
    echo "</HEAD>\n";
    echo "<BODY>\n";

    $ok = ignore_user_abort();
    if ($ok)
    {
      echo "Abbruch durch Benutzer wird ignoriert<br />";
    }
    else
    {
      echo "Abbruch durch Benutzer stoppt das Script<br />";
    }
    flush();

    diese Schleife läuft solange, bis der Client einen Abbruch sendet

    es wird eine Datei angelegt /geöffnet und dann gesperrt.

    $fh = fopen('lockversuch.txt','a+');
    if (!$fh)
    {
      echo "Datei konnte nicht angelegt/geöffnet werden";
      exit;
    }

    $lock_ok = flock($fh,LOCK_SH + LOCK_NB);
    if (!$lock_ok)
    {
      echo "Datei konnte nicht gesperrt werden<br />\n";
      exit;
    }
    else
    {
      echo "Datei wurde im shared Mode gesperrt<br />\n";
      echo "Freigabe erfolgt 3 Sekunden nach Schließen des Fensters oder STOPP<br/>\n";
    }

    while (!connection_aborted())
    {
      echo getmypid()." ".time()." lebt noch<br />";
      flush();
      sleep(3);
    }

    echo "</body>\n";
    echo "</html>";
    ?>
    ---------------------------------------------------------------------------

    Anleitung:

    beide Scripte in ein verzeich is kopieren, in dem PHP Schreibrechte (Anlegen von Dateien) hat.
    Dann erst das shared_lock starten und Meldung betrachten.
    Wenn im Fenster "xxx <zeit> lebt noch" erscheint, dasselbe Script in einem zweiten Fenster
    nochmal starten. Nun muss wieder "yyy <zeit> lebt noch" erscheinen. Also eine andere PID.

    Wenn man nun das exclusive_lock.php in einem dritten Fesnter startet, dann muss das mit einem "Datei konnte nicht gesperrt werden" quitiert werden.

    Drückt man nun in beiden shared_lock-Fesntern den Stopp-Button des Fensters, dann sollte es ca. drei Sekunden später möglich sein, im exclusive_lock-Fenter durch Reload-Button des Fensters die Meldung "zzz <zeit> lebt noch" zu erzeugen.

    Wenn man nun in einem der shared-Fenster wieder relaod drückt, müsste "Datei konnte nicht gesperrt werden" erscheinen.

    Ich bräuchte Ergebnisse für Win98SE, für WIN 2000, für Win XP und alle folgenden.

    Freue mich auf Eure Unterstützung

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

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. bei mir legt er unter Windows XP eine Datei an...
      das war's dann aber auch schon
      er lädt und lädt und lädt
      mehr passiert nicht

      1. Hello,

        bei mir legt er unter Windows XP eine Datei an...
        das war's dann aber auch schon
        er lädt und lädt und lädt
        mehr passiert nicht

        Das ist leider eine sehr dürftige Beschreibung.
        Wie oft wurde denn das Script gestartet?
        Was passiert in den verschiedenen Fenstern?

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

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hello,

          bei mir legt er unter Windows XP eine Datei an...
          das war's dann aber auch schon
          er lädt und lädt und lädt
          mehr passiert nicht

          Das ist leider eine sehr dürftige Beschreibung.
          Wie oft wurde denn das Script gestartet?
          Was passiert in den verschiedenen Fenstern?

          ich habe die shared_lock.php gestartet, die Datei wurde angelegt... danach, wird die Datei nur noch geladen
          rufe ich die Datei ein 2. mal auf... wird dort auch geladen was das zeug hält.. ich weiss nur nicht was ;-)

          dann hab ich mal die exclusive_lock.php aufgerufen, dann kam diese Meldung

          Abbruch durch den Benutzer stoppt das Script
          Datei konnte nicht gesperrt werden

          nachdem ich mal alle Fensater geschlossen und ca. 5min gewartet habe, hab ich nochmal die exclusive_lock.php aufgerufen... nun lädt sie auch, aber was?!

          1. Hello,

            Hello,

            bei mir legt er unter Windows XP eine Datei an...
            das war's dann aber auch schon
            er lädt und lädt und lädt
            mehr passiert nicht

            Das ist leider eine sehr dürftige Beschreibung.
            Wie oft wurde denn das Script gestartet?
            Was passiert in den verschiedenen Fenstern?

            ich habe die shared_lock.php gestartet, die Datei wurde angelegt... danach, wird die Datei nur noch geladen
            rufe ich die Datei ein 2. mal auf... wird dort auch geladen was das zeug hält.. ich weiss nur nicht was ;-)

            dann hab ich mal die exclusive_lock.php aufgerufen, dann kam diese Meldung

            Abbruch durch den Benutzer stoppt das Script
            Datei konnte nicht gesperrt werden

            nachdem ich mal alle Fensater geschlossen und ca. 5min gewartet habe, hab ich nochmal die exclusive_lock.php aufgerufen... nun lädt sie auch, aber was?!

            Das ist ok so.
            Normalerweise sollte da alle drei Sekunden eine Kontrollausgabe kommen, aber bei Windows funktioniert ggf. das sleep() nicht.

            Aber das Locking scheint unter WinXP entgegen dem PHP-Handbuch also zu funktionieren.

            Erstmal Dank.

            Du könntest das sleep() in de Schleife mal auskommentieren, und den Versuch dann wiederholen...

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

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. Hallo,

              bei mir legt er unter Windows XP eine Datei an...
              das war's dann aber auch schon
              er lädt und lädt und lädt
              mehr passiert nicht

              Das ist leider eine sehr dürftige Beschreibung.
              Wie oft wurde denn das Script gestartet?
              Was passiert in den verschiedenen Fenstern?

              ich habe die shared_lock.php gestartet, die Datei wurde angelegt... danach, wird die Datei nur noch geladen
              rufe ich die Datei ein 2. mal auf... wird dort auch geladen was das zeug hält.. ich weiss nur nicht was ;-)

              dann hab ich mal die exclusive_lock.php aufgerufen, dann kam diese Meldung

              Abbruch durch den Benutzer stoppt das Script
              Datei konnte nicht gesperrt werden

              nachdem ich mal alle Fensater geschlossen und ca. 5min gewartet habe, hab ich nochmal die exclusive_lock.php aufgerufen... nun lädt sie auch, aber was?!

              Das ist ok so.
              Normalerweise sollte da alle drei Sekunden eine Kontrollausgabe kommen, aber bei Windows funktioniert ggf. das sleep() nicht.

              Aber das Locking scheint unter WinXP entgegen dem PHP-Handbuch also zu funktionieren.

              Erstmal Dank.

              Du könntest das sleep() in de Schleife mal auskommentieren, und den Versuch dann wiederholen...

              ich hab jetzt sleep auskommentiert

              hab mal die exclusive_lock.php gestartet
              nach kurzer Zeit ist 1 GB Ram verrbaucht und 2GB Virtueller Arbeitsspeicher belegt...

              die Meldung ist
              808 1090794008 lebt noch

              aber mein Rechner ist tot

              1. Hello Badboy,

                bei mir legt er unter Windows XP eine Datei an...
                das war's dann aber auch schon
                er lädt und lädt und lädt
                mehr passiert nicht

                Das ist leider eine sehr dürftige Beschreibung.
                Wie oft wurde denn das Script gestartet?
                Was passiert in den verschiedenen Fenstern?

                ich habe die shared_lock.php gestartet, die Datei wurde angelegt... danach, wird die Datei nur noch geladen
                rufe ich die Datei ein 2. mal auf... wird dort auch geladen was das zeug hält.. ich weiss nur nicht was ;-)

                dann hab ich mal die exclusive_lock.php aufgerufen, dann kam diese Meldung

                Abbruch durch den Benutzer stoppt das Script
                Datei konnte nicht gesperrt werden

                nachdem ich mal alle Fensater geschlossen und ca. 5min gewartet habe, hab ich nochmal die exclusive_lock.php aufgerufen... nun lädt sie auch, aber was?!

                Das ist ok so.
                Normalerweise sollte da alle drei Sekunden eine Kontrollausgabe kommen, aber bei Windows funktioniert ggf. das sleep() nicht.

                Aber das Locking scheint unter WinXP entgegen dem PHP-Handbuch also zu funktionieren.

                Erstmal Dank.

                Du könntest das sleep() in de Schleife mal auskommentieren, und den Versuch dann wiederholen...

                ich hab jetzt sleep auskommentiert

                hab mal die exclusive_lock.php gestartet
                nach kurzer Zeit ist 1 GB Ram verrbaucht und 2GB Virtueller Arbeitsspeicher belegt...

                die Meldung ist
                808 1090794008 lebt noch

                aber mein Rechner ist tot

                Ich quote ausnahmsweise mal alles, weil ich es dann komplett drucken und in die Dku aufnehmen kann.

                Also, der RAM-Verbrauch kommt zustande, weil unter Windows der Buffer nicht zwischendurch geleert werden kann. Flush() http://de2.php.net/manual/de/function.flush.php ist der böse Bube unter Windows. Raik hat es herausgefunden.
                Das Script läuft in einer Schliefe solange, bis ein User_abort() stattfindet, also das Fenster geschlossen oder der Stopp-Button gedrückt wird odr eben das flock() schiefgeht.

                Wenn Du also wieder sleep(3) eiträgst, wird nur alle drei Sekunden ein Eintrag im Buffer gemacht.

                Wichtig ist aber, dass das Filelocking funktioniert.

                Dankie für die Mithilfe.

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

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
                1. ein Klick auf Abbruch half nix...
                  nachdem ich das Fenster geschlossen hatte, wurde trotzdem kein Ram freigegeben

                  ich musste den Apachen beenden, danach war ein weiterarbeiten wieder möglich ;)

                  1. Hello,

                    ein Klick auf Abbruch half nix...
                    nachdem ich das Fenster geschlossen hatte, wurde trotzdem kein Ram freigegeben

                    ich musste den Apachen beenden, danach war ein weiterarbeiten wieder möglich ;)

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

                    Auch nicht, wenn Du etwas länger gewartet hast? Normalerweise sollte der Buffer nach ca. 3-4sec. wieder frei sein. Sonst hat die Apache/PHP-Version ne echte Macke...

                    Hattest Du sleep() wieder hochgestellt auf 3sec? Sonst ist der Ram natürlich sofort dicht, wenn der Ausgabebuffer nicht geflusht wird. Das hatte ich gestern nicht berücksichtigt.

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau
                    1. Hello,

                      ein Klick auf Abbruch half nix...
                      nachdem ich das Fenster geschlossen hatte, wurde trotzdem kein Ram freigegeben

                      ich musste den Apachen beenden, danach war ein weiterarbeiten wieder möglich ;)
                      Harzliche Grüße aus http://www.annerschbarrich.de

                      Auch nicht, wenn Du etwas länger gewartet hast? Normalerweise sollte der Buffer nach ca. 3-4sec. wieder frei sein. Sonst hat die Apache/PHP-Version ne echte Macke...

                      Hattest Du sleep() wieder hochgestellt auf 3sec? Sonst ist der Ram natürlich sofort dicht, wenn der Ausgabebuffer nicht geflusht wird. Das hatte ich gestern nicht berücksichtigt.

                      das kann ich dir jetzt nicht mehr sagen, das war heute morgen um ca. 2 Uhr... jetzt haben wir es 18 Uhr :-)

                      kurzzeitgedächnis lässt grüssen :-)

            2. Hallo, Tom!

              Normalerweise sollte da alle drei Sekunden eine Kontrollausgabe kommen, aber bei Windows funktioniert ggf. das sleep() nicht.

              doch, sleep scheint zu funktionieren, da bei mir ein kleines testscript nach der gesamtzeit die erwartete ausgabe macht, aber mit flush scheint es probleme zu geben.
              wegen des ram fressenden scriptes konnte ich auch unter win2k die shared_lock.php bisher nur ein mal starten mit folgender ausgabe:
              Abbruch durch Benutzer stoppt das Script
              Datei wurde im shared Mode gesperrt
              Freigabe erfolgt 3 Sekunden nach Schließen des Fensters oder STOPP
              824 1090795474 lebt noch
              824 1090795474 lebt noch
              824 1090795474 lebt noch
              824 1090795474 lebt noch
              [...]

              freundl. Grüsse aus Berlin, Raik

              1. Hallo, Tom!

                doch, sleep scheint zu funktionieren, da bei mir ein kleines testscript nach der gesamtzeit die erwartete ausgabe macht, aber mit flush scheint es probleme zu geben.

                das hier: http://www.php4-forum.de/befehle/flush.htm?PHPSESSID= scheint meine vermutung zu bestätigen:
                <zitat>
                flush()

                Beschreibung:
                Leert den Puffer des Servers und sendet die auszugebenen Daten dem User sofort zu anstatt zu warten bis die komplette Seite fertig erstellt ist. Ermöglicht somit ein schnelleres Anzeigen der Inhalte auf dem Bildschirm.

                Achtung: Der Befehl funktioniert nur, wenn PHP direkten Zugriff auf den Buffer des Servers hat. Dies ist nicht der Fall, wenn PHP als CGI-Version (also auch unter Windows) installiert ist. Bei Apache mit PHP-Modul hingegen funktioniert es.
                </zitat>

                freundl. Grüsse aus Berlin, Raik

                1. Hello Raik,

                  danke für die Infos zu flush().
                  Da ich selber bisher nur unter Linux/Apache gearbeitt habe, habe ich noch nicht darauf geachtet. Das Locking scheint ja aber zu funktionieren, wenn ich badboys Aussagen zu Win XP dazu lese, obwohl das Handbuch anderes dazu schreibt.

                  <cite>
                  flock() wird antiquierten Dateisystemen wie FAT und dessen Derivate nicht unterstützt, und gibt deshalb in solchen Umgebungen immer FALSE zurück (Dies ist speziell bei Windows 98 Benutzern der Fall).
                  </cite> von http://de2.php.net/manual/de/function.flock.php

                  Welches Windows hattest Du benutzt?

                  Wieso läuft PHP auf Windows im CGI-Modus und nicht als Modul? Geht das da nicht?

                  Fragen über Fragen...

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

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau
                  1. Hallo, Tom!

                    Welches Windows hattest Du benutzt?

                    <cite [pref:t=85718&m=505367]>
                    ... konnte ich auch unter win2k die shared_lock.php ...
                    <7cite>                   ^^^^^

                    Wieso läuft PHP auf Windows im CGI-Modus und nicht als Modul? Geht das da nicht?

                    weil, zumindest noch bis vor kurzem, der modul-modus beim apache2 noch als experimentell eingestuft wurde (http://www.apachefriends.org/f/viewtopic.php?p=1680#1680. wie es jetzt damit ist, weis ich nicht, ich hatte php aber bis zu einem update schon mal als modul laufen und es hat bei mir funktioniert. ich werde es also heute nochmal damit versuchen.

                    moin übrigens! ;-) (14.11 uhr, gestern wieder zu lange am rechner gefummelt ... )

                    freundl. Grüsse aus Berlin, Raik

    2. Hi Tom,

      mein System: Win 2000 mit Apache 2.0.49

      Dann erst das shared_lock starten und Meldung betrachten.
      Wenn im Fenster "xxx <zeit> lebt noch" erscheint, dasselbe Script in einem zweiten Fenster
      nochmal starten. Nun muss wieder "yyy <zeit> lebt noch" erscheinen. Also eine andere PID.

      genau wie bei Badboy wird auch bei mir keine Meldung ausgegeben, aber das scheint ja normal zu sein. Die beiden shared_locks laufen parallel, brechen also nicht ab.

      Wenn man nun das exclusive_lock.php in einem dritten Fesnter startet, dann muss das mit einem "Datei konnte nicht gesperrt werden" quitiert werden.

      ja - das passiert bei mir.

      Drückt man nun in beiden shared_lock-Fesntern den Stopp-Button des Fensters, dann sollte es ca. drei Sekunden später möglich sein, im exclusive_lock-Fenter durch Reload-Button des Fensters die Meldung "zzz <zeit> lebt noch" zu erzeugen.

      das funktioniert bei mir, wieder analog zu Badboy, auch nicht. Dein Script erzeugt bei mir einen Prozess, den ich manuell killen muss - dann kann ich auch die exclusive_lock.php starten, die dann auch munter durchläuft.

      Wenn man nun in einem der shared-Fenster wieder relaod drückt, müsste "Datei konnte nicht gesperrt werden" erscheinen.

      ja - das passiert bei mir.

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

      Tom

      Gruß,
      Andreas.

      1. Hello,

        Drückt man nun in beiden shared_lock-Fesntern den Stopp-Button des Fensters, dann sollte es ca. drei Sekunden später möglich sein, im exclusive_lock-Fenter durch Reload-Button des Fensters die Meldung "zzz <zeit> lebt noch" zu erzeugen.

        das funktioniert bei mir, wieder analog zu Badboy, auch nicht. Dein Script erzeugt bei mir einen Prozess, den ich manuell killen muss - dann kann ich auch die exclusive_lock.php starten, die dann auch munter durchläuft.

        Das müssten wir nochmal genauer untersuchen. Wenn Du bei den Shared-Lock-Fentern auf STOPP drückst, dann dauert es noch mindestens 3 sec. bis sie Prozesse beendet werden (wegen sleep(3)) Außerdem muss noch der Buffer aufgeräumt werden, erst dann wird der Prozess tatsächlich beendet und das fclose() wird durchgeführt.

        Also müssten die Prozesse, wenn man mal eine Weile wartet, nach eingen Sekunden von alleine verschwinden. Könntest Du das bitte nochmals überprüfen?

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

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hi Tom,

          Das müssten wir nochmal genauer untersuchen. Wenn Du bei den Shared-Lock-Fentern auf STOPP drückst, dann dauert es noch mindestens 3 sec. bis sie Prozesse beendet werden (wegen sleep(3)) Außerdem muss noch der Buffer aufgeräumt werden, erst dann wird der Prozess tatsächlich beendet und das fclose() wird durchgeführt.

          Also müssten die Prozesse, wenn man mal eine Weile wartet, nach eingen Sekunden von alleine verschwinden. Könntest Du das bitte nochmals überprüfen?

          ah jetzt ja. Ich habe scheinbar nur nicht lange genug gewartet. Also nochmal:

          • shared_lock.php zweimal gestartet: beide laufen (2 Apache-Prozesse werden im Taskmanager angezeigt)
          • exclusive_lock.php gestartet: Ausgabe "Abbruch durch Benutzer stoppt das Script Datei konnte nicht gesperrt werden"
          • beide shared_lock.php gestoppt und Fenster geschlossen (immernoch werden 2 Apache-Prozesse angezeigt)
          • ca. 5 Minuten gewartet
          • es wird nur noch 1 Apache-Prozesse angezeigt
          • Reload der exclusive_lock.php: läuft
          • shared_lock.php gestartet: Ausgabe "Abbruch durch Benutzer stoppt das Script Datei konnte nicht gesperrt werden"

          Gruß,
          Andreas.