Herzlicher: Flock funktioniert nicht mit LOCK_NB bei meinem Server?

Hallo,

wollte die Flock-Unterstützung meines Webspaces (bei All-Inkl) mit folgendem Script testen:

<?php
    $content = "";
    $input = fopen ("lock_test.txt", "a");
    if (flock ($input, LOCK_EX | LOCK_NB) == true){
        echo "in...<br/>";
        for($i=1;$i<10;$i++) {
   fwrite($input,"$i\n");
   sleep (1);
  }
        echo "out...<br/>";
        flock ($input, LOCK_UN);
    }
    else echo "can't acquire block...";
    fclose ($input);

//sleep () was used to give myself enough time to switch to another browser window,
    //invoke the script again to guarantee parallelism and make the notepad test to see
    //if an error occurred with other proccess

?>

Der Flock an sich funktioniert bei parallelem Aufruf, d.h. 2 Instanzen kommen sich nicht in die Quere, erst schreibt das eine zuende, dann das zweite. Jedoch wird vom LOCK_NB-Attribut ("non blocking") erwartet, dass ein zweites Skript bei Flock false zurückgibt und somit nicht in einer Warteschleife verharrt.

Auf meinem Server ist php 5.2.5 installiert. Wenn man googlet merkt man, dass es sich wohl um einen Bug in manchen (früheren 5er) php-Versionen handelt.

Weiß hier jemand eine Lösung?

Haben andere all-inkl-Kunden dasselbe Problem?

Danke und Gruß

Herzlicher

  1. ... es scheint sich um einen Firefox-Bug zu handeln. Wenn ich die Seite im IE7 2x hintereinander aufrufe, reagiert das Skript wie gewollt.

    Das kann jeder testen unter: http://www.unicp.de/tests/flock_test.php
    Einfach in 2 Tabs kurz hintereinander starten.

    1. Hi,

      ... es scheint sich um einen Firefox-Bug zu handeln. Wenn ich die Seite im IE7 2x hintereinander aufrufe, reagiert das Skript wie gewollt.

      Clientseitig soll das Einfluss haben? Schwer zu glauben.

      Das kann jeder testen unter: http://www.unicp.de/tests/flock_test.php
      Einfach in 2 Tabs kurz hintereinander starten.

      Ja habe ich gemacht IE6, Entweder Wartezeit oder  wenn ich während Wartezeit nochmal anfordere kommt "can't acquire block... ".

      Pete

      1. Hallo Pete,

        hast du es mal unter Firefox versucht?

        Ich bin über einen Thread in einem anderen Forum darauf gekommen, wo dasselbe festgestellt wurde.

        1. Hi,

          hast du es mal unter Firefox versucht?

          Hast du es mal im Firefox *unter*sucht?

          HTTP-Header, allgemeiner Ablauf, etc. - das waere mal interessant.

          MfG ChrisB

  2. Hello,

    <?php
        $content = "";
        $input = fopen ("lock_test.txt", "a");

    if (flock ($input, LOCK_EX | LOCK_NB) == true)

    {

    echo "in...<br/>";
            for($i=1;$i<10;$i++)

    {
                  fwrite($input,"$i\n");

    sleep (1);
            }

    echo "out...<br/>";
              flock ($input, LOCK_UN);

    }
        else echo "can't acquire block...";
        fclose ($input);

    ?>

    Generell ist dazu zu sagen, dass das flock ($input, LOCK_UN) meistens die falsche Wahl ist, sondern stattdessen fclose($input) Verwendung finden müsste. In Mehrnutzerumgebungen muss man Dateien entweder geschlossen halten oder in einem kontrollierten Zustand.

    Das Offenhalten ohne auch eine Lockingstufe zu halten ist gefährlich, da Veränderungen ggf. erst mit dem fclose() geschrieben werden. Wenn man das selber auch noch vergisst, dann wirds noch interessanter, insbesondere, wenn man Files in Funktionen oder Schleifen öffnet.

    Bevor man also flock($fh, LOCK_UN) benutzt, muss nach einem schreibenden Zugriff auf jeden Fall fflush() verwendet werden. http://de2.php.net/manual/en/function.fflush.php

    Das war jetzt sicher nicht die Aufgabenstellung Deines Scriptes, aber bevor sich hier im Archiv halbe Beispiele breit machen, wollte ich es erwähnt haben.

    Ein harzliches Glückauf

    Tom vom Berg

    http://bergpost.annerschbarrich.de

    --
    Nur selber lernen macht schlau