Locking auf Windows-Systemen, Helfer gesucht
Tom
- php
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
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
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
wenn ich zeit habe, dass ich das auf mein Laptop testen
der hat XAMPP drauf
Hello,
<?php #### exclusive_lock.php ####
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();
$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 ####
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();
$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
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
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
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 nichtDas 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?!
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 nichtDas 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 werdennachdem 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
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 nichtDas 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 werdennachdem 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
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 nichtDas 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 werdennachdem 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 nochaber 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
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 ;)
Hello,
ein Klick auf Abbruch half nix...
nachdem ich das Fenster geschlossen hatte, wurde trotzdem kein Ram freigegebenich 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
Hello,
ein Klick auf Abbruch half nix...
nachdem ich das Fenster geschlossen hatte, wurde trotzdem kein Ram freigegebenich musste den Apachen beenden, danach war ein weiterarbeiten wieder möglich ;)
Harzliche Grüße aus http://www.annerschbarrich.deAuch 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 :-)
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
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
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
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
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.
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
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:
Gruß,
Andreas.