Userverwaltung
Stefanp
- php
Ich habe ein kleines (News)Script bearbeitet welches ohne Sql laüft, d.h es wird alles in .txt Dateien gespeichert.Aber jedes mal wenn ich einen User registrieren will muss ich (offline) in den Ordner User eine neue Datei erstellen mit dem Namen.txt und in ihr enthaltenem Passwort.
Zum Beispiel so: Karl.txt -->Inhalt meinpasswort
Ich will mit Php aber eine Seite (reg.php) erstellen die es einem User ermöglicht ein Formular ausfüllen:
Username #########
Passwort #########
|SUBMIT|
und nach dem er auf den Submit Knopf gedrückt hat automatisch in den Ordner User eine Datei mit seinem Usernamen(.txt) und dem beinhaltetem Passwort erstellt.
Kann mir einer ein kleines Script schicken wie ich das schaffe ?
Danke scho mal
mfg Stefan P.
Hallo Stefan P., [hoffe, das ist richtig so]
ein kleines Script kann ich Dir nicht schicken, könnte aber eines schreiben. Dauert nur etwas. Vorab schon die Gedanken, die Du dir machen solltest.
Textdatei - > Datensatzformat festlegen:
Username
Passwort
Angelegt am
von IP
freigeschaltet
letzter Besuch am
von IP
Ist nur so eine Idee.
Die Daten werden dann, getrennt z.B. mit Semikolon, in die Datei schrieben.
Das macht man in PHP am besten, indem man ein Array definiert, dass aus den einzelnen Feldern besteht. Username bildet dabei den Index.
Man kann die Datei dann mit $userlist = file("userdatei.dat") einlesen ...
So, und nun fängt die Überlegung an. Wie war das doch mit den mehrdimensionalen Arrays, mit dem Sortieren, dem Ändern von Datensätzen und dem Hinzufügen und Löschen?
Es wir eine Weile dauern.
Mal sehen, wer eher fertig ist, Fabian *) oder ich. *grins*
Aufgabenstellung ist also, dass OHNE MySQL zu machen!
Liebe Grüße aus http://www.braunschweig.de
Tom
*) Fabian wird es bestimmt auch lesen und vielleicht schon eine Lösung fertig haben?
Hallo da draußen, dies ist ein Test, ich kann nämlich anscheinend nicht mehr Posten, wenn das Datenvolumen 8KByte übersteigt!?
Fabian
ps: Tom, ich hätte längst geantwortet, aber er schickt das Teil nicht ab...
Hallo Fabi,
das kann natürlich sein. Der Crash muss ja irgendwo hergekommen sein. Hat CK irgendwas geschrieben dazu nachdem er die alte Version wieder eingespielt hatte?
Mach doch mehrere Teile draus. Zusammensetztn können wir das dann ja lokal. Oder pack es als *.txt auf Deinen Server und mach einen Link, dann wird es eben per Link im Browser angezeigt. Weiß nur nicht, was mit den Tags in einer TXT-Datei im Browser passiert
Interessante Frage.
Oder mail es mir und ich leg es bei bitworks.de/beispiele/... ab.
Soooo viele Möglichkeiten.
Grüße
Tom
PS: ich bin auch noch nicht dazu gekommen, richtig anzufangen. Kommte eine email nach der nächsten heute.
Hallo Fabi,
das kann natürlich sein. Der Crash muss ja irgendwo hergekommen sein. Hat CK irgendwas geschrieben dazu nachdem er die alte Version wieder eingespielt hatte?
ich weiß es nicht, tatsache ist: kleine postings gehen.
deshalb: http://mitglied.lycos.de/transchelfiles/post.txt
Mach doch mehrere Teile draus. Zusammensetztn können wir das dann ja lokal. Oder pack es als *.txt auf Deinen Server und mach einen Link, dann wird es eben per Link im Browser angezeigt. Weiß nur nicht, was mit den Tags in einer TXT-Datei im Browser passiert
Interessante Frage.
ein guter browser gibt es als text/plain so aus, wie es da steht *aufIEzeigundauslach*
naja, ist der erste versuch... =)
Fabian
Hallo retour,
so ist es zwar etwas umständlicher, aber es geht auch.
Ich wollte nicht eine Datei pro User bauen, sondern eine Datei für alle User. Da habe ich wohl nicht richtig gelesen.
Allerdings hätte eine Datei pro User den Vorteil, dass man in der ersten Zeile das CVS-Array mit den Login-Daten speichern könnte und in den folgenden Zeilen die Login-Historie mit
Login_Timestamp
Login_IP
Login_Password
Login_Errorflag (so sieht man auch Bruteforces auf die Logins)
Beim Login muss man nur mit fgets() die erste Zeile auslesen und kann dann mit später im Append-Mode einfach die Logindaten hinten dranhängen. Allerdings würde ich dann bei der ersten Zeile für "CVS" mit festen Feldlängen plädieren, um das Passwort auch ändern zu können. In eine echte Textdatei darf man ja sonst nix zürückschreiben. Dann müsste man die vorher ganz einlesen und vollständig zurückschreiben. Das ist unökonomisch.
Passwort sollte natürlich verschlüsselt abgelegt werden.
Hier eine Funktion für die Feldlängen-Abstimmung:
function fillspace($feld,$lang)
{
$feld = substr($feld,0,$lang); //abschneiden, wenn zu lang
while/strlen($feld)<($lang-1) //auffüllen mit
{
$feld = $feld . chr(32); //neutralem Element, kann auch chr(0) sein
}
return $feld;
}
Bei der Verschlüsselung des Passwortes könnte es mit den aufgefüllten Feldern Probleme geben.
Das waren nur noch ein paar Zusatzgedanken von mir.
Bis gleich
Tom
Hallo Fabi,
da ist noch ein dicker Fehler in Deiner Idee:
<?php
$name = $HTTP_POST_VARS['name'];
$pass = $HTTP_POST_VARS['pass']; // möglichst verschlüsseln...
$locked = true; // bis der user freigeschaltet ist...
$daten = $name."|".$pass."|".$locked;
if(file_exists($name.".txt")
{
die("Name schon besetzt.");
}
else
$fp = @fopen($name.".txt",w) or die("Vorgang gescheitert!");
// flock funktioniert auf PHP-Ebene. Das bedeutet, dass alle Zugriffe über den selben Mechanismus funktionieren müssen:
// flock($fp,2);
//-----
$lock_ok=flock($fp,2);
if ($lock_ok)
{
$erfolg = fputs($fp,$daten);
flock($fp,3);
}
else
{
fehlermeldung("Datei wird schon bearbeitet");
}
@fclose($fp); // wenn sie nicht offen war, oder die Connection getorben ist, gibt es eine Fehlermeldung.
if($erfolg)echo("Der User wurde angelegt, bitte warten Sie auf Freischaltung.");
?>
Soweit bisher.
Gruß
Tom
Hi Tom,
// flock funktioniert auf PHP-Ebene. Das bedeutet, dass alle Zugriffe über den selben Mechanismus funktionieren müssen:
// flock($fp,2);
//-----
$lock_ok=flock($fp,2);
if ($lock_ok)
{
$erfolg = fputs($fp,$daten);
flock($fp,3);
}
else
{
fehlermeldung("Datei wird schon bearbeitet");
// an dieser stelle könnte man zum beispiel eine schleife machen, die mit delay() solange probiert, bis die datei schreibbar ist.
}
Du meine Güte, du hast zwar recht, aber glaubst du im Ernst, dass Stefan solchen Traffic hat? Im ernsthaften Einsatz muss man das natürlich so machen, aber wie gesagt, solange uns Stefan nicht sagt zu welchen Zweck genau er das braucht, gehe ich mal davon aus, dass ein solcher Mechanismus unnötig ist.
Fabian
Hello Mr. Transchel,
// flock funktioniert auf PHP-Ebene. Das bedeutet, dass alle Zugriffe über den selben Mechanismus funktionieren müssen:
// flock($fp,2);
//-----
$lock_ok=flock($fp,2);
if ($lock_ok)
{
$erfolg = fputs($fp,$daten);
flock($fp,3);
}
else
{
fehlermeldung("Datei wird schon bearbeitet");
// an dieser stelle könnte man zum beispiel eine schleife machen, die mit delay() solange probiert, bis die datei schreibbar ist.
}
Du meine Güte, du hast zwar recht, aber glaubst du im Ernst, dass Stefan solchen Traffic hat? Im ernsthaften Einsatz muss man das natürlich so machen, aber wie gesagt, solange uns Stefan nicht sagt zu welchen Zweck genau er das braucht, gehe ich mal davon aus, dass ein solcher Mechanismus unnötig ist.
Kostet uns doch ein Lächeln. Warum nicht einfach mal was Gutes in PHP bauen. Die Perl-Freaks lachen doch sowieso immer über uns ;-)
Ich wollte eigentlich hier auch nur sicher gehen, dass Du den Mechanismus von flock() in PHP durchschaust. Die Datei wird nämlich nicht gelockt, sondern es wird in einer flock-Tabelle ein Eintrag hinterlegt. Ich bin mir noch nicht einmal sicher, dass der ohne unlock (also flock($fp,3)) wieder beseitigt wird. Mir wäre hier ein Durchgriff auf das Betriebssystem lieber, auch wenn das nicht ganz "sauber" ist. Linux muss doch auch über Locking-Mechanismen verfügen.
Übrigens sollte man zur Vermeidung von Deadlocks keine Endlosschleifen programmieren. Fünf Lockingversuche sollten da also reichen. Ich denke, PHP wird selber schon mehrmals nachschauen (in Millisekunden-Abständen), bevor es die Anfrage ablehnt (false zurückgibt).
Langsam wird's ja. Teamwork zahlt sich eben immer aus.
LGaBS
Tom
Hallo Thomas und Fabian,
Ich wollte eigentlich hier auch nur sicher gehen, dass Du den Mechanismus von flock() in PHP durchschaust. Die Datei wird nämlich nicht gelockt, sondern es wird in einer flock-Tabelle ein Eintrag hinterlegt. Ich bin mir noch nicht einmal sicher, dass der ohne unlock (also flock($fp,3)) wieder beseitigt wird. Mir wäre hier ein Durchgriff auf das Betriebssystem lieber, auch wenn das nicht ganz "sauber" ist. Linux muss doch auch über Locking-Mechanismen verfügen.
Wo hast Du denn das her, Thomas? Ich hab' mir gerade mal den Quelltext (was liebe ich nicht OpenSource) von PHP angeschaut (im Manual stand nix von einer flock()-Tabelle, sondern von Dateisystemebene) und dort steht für UNIX-Betriebsysteme:
ret = fcntl(fd, operation & LOCK_NB ? F_SETLK : F_SETLKW, &flck);
Wenn das nicht eine Kernel-Locking-Anweisung ist, was dann? Und für Win32:
if (LockFileEx(hdl, LOCKFILE_EXCLUSIVE_LOCK +
((operation & LOCK_NB) ? LOCKFILE_FAIL_IMMEDIATELY : 0)
0, low, high, &offset))
(da gibt's noch mehr von diesen Funktionsaufrufen)
Das ist schon auf Kernel-Elene.
Ach ja, nur so nebenbei, laut Manual sind die ganzen Zahlen (zweiter Parameter) jetzt (seit PHP 4.0.1) als Konstanten definiert.
Ich hab's gerade nochmal in SelfPHP und der Doku nachgeschaut. Ist tatsächlich so, dass man im dritten Parameter die "Blockkonditionen" reinschreiben kann, sprich _wofür_ die Datei gelockt ist, wenn wir das noch einbauen isses perfekt ;)
Wie meinen? Der dritte Parameter gibt doch an, ob der aufruf "blockieren" soll, d.h. so lange warten, bis das Lock freigegeben ist.
Der Durchgriff auf's Betriebsystem geht nicht, weil der Apache ja nicht nur auf Linux läuft und nun stell dir vor, sowas für alle möglichen Plattformen programmieren zu müssen ;-))
Ja wieso? Alle UNIX-Derivate unterstützen fcntl(), das ist POSIX (Layer 2, glaube ich), und für Win32 ist extra-Code eingebaut. Und AFAIK läuft PHP auf nix anderem. Und wenn der Apache auf noch zusätzlichen Betriebsystemen läuft, bringt das dem PHP-User wenig.
Übrigens sollte man zur Vermeidung von Deadlocks keine Endlosschleifen programmieren. Fünf Lockingversuche sollten da also reichen. Ich denke, PHP wird selber schon mehrmals nachschauen (in Millisekunden-Abständen), bevor es die Anfrage ablehnt (false zurückgibt).
Nein. Laut Sourcecode (ext/standard/flock_compat.c) wird nach einem Fehler sofort an das Script zurückgegeben. Ich halte 10 Versuche für OK. Übrigens: Endlosschleifen braucht man gar nicht, den dritten Parameter zu setzen reicht.
Grüße,
Christian
Hallo Christian,
wenn es so ist, wie Du schreibst, dann wäre ich beruhigt. Das würde dann bedeuten, dass flock() in PHP dafür sorgt, dass auch kein Zugriff auf die Datei über die Console möglich wäre, solange das Script sperrt.
---------------
http://www.php.net/manual/de/function.flock.php
Beschreibung
bool flock ( int fp, int operation [, int wouldblock])
PHP liefert einen portablen Weg, Dateien in einer "beratenden" Art und Weise zu verriegeln. D.h. alle zugreifende Programme müssen die gleiche Art und Weise der Verriegelung benutzen, oder es funktioniert nicht.
---------------
"beratende" Art und Weise würde bedeuten, dass eine separate Nachschlagedatei geführt wird, in die jedes Script reinschauen muss. Die eigentliche Datendatei wird nicht auf Systemebene gesperrt. Ich untersuche das nochmal genauer.
Wie ist das dann mit der Freigabe des Locks beim Zurückgeben des Handles?
Wo hast Du denn das her, Thomas? Ich hab' mir gerade mal den Quelltext (was liebe ich nicht OpenSource) von PHP angeschaut (im Manual stand nix von einer flock()-Tabelle, sondern von Dateisystemebene) und dort steht für UNIX-Betriebsysteme:
Wo finde ich den Quellcode? Ist der in C oder C++?
Ich glaube, dann erde ich mich da auchmal einlesen.
ret = fcntl(fd, operation & LOCK_NB ? F_SETLK : F_SETLKW, &flck);
(da gibt's noch mehr von diesen Funktionsaufrufen)
Das ist schon auf Kernel-Elene.
Gibts da inzwischen auch Record- oder Bereichs-Locks?
Ach ja, nur so nebenbei, laut Manual sind die ganzen Zahlen (zweiter Parameter) jetzt (seit PHP 4.0.1) als Konstanten definiert.
Ja wieso? Alle UNIX-Derivate unterstützen fcntl(), das ist POSIX (Layer 2, glaube ich), und für Win32 ist extra-Code eingebaut. Und AFAIK läuft PHP auf nix anderem. Und wenn der Apache auf noch zusätzlichen Betriebsystemen läuft, bringt das dem PHP-User wenig.
Übrigens sollte man zur Vermeidung von Deadlocks keine Endlosschleifen programmieren. Fünf Lockingversuche sollten da also reichen. Ich denke, PHP wird selber schon mehrmals nachschauen (in Millisekunden-Abständen), bevor es die Anfrage ablehnt (false zurückgibt).
Nein. Laut Sourcecode (ext/standard/flock_compat.c) wird nach einem Fehler sofort an das Script zurückgegeben. Ich halte 10 Versuche für OK. Übrigens: Endlosschleifen braucht man gar nicht, den dritten Parameter zu setzen reicht.
Das gäbe dann also ggf. auch einen "Deadlock", wenn sich da zwei Prozesse mit den Lockinglevels gegenseitig verbeißen.
Nun wollen wir das ganz gewiss genau wissen, damit unsere Progs dann auch mit den Perlies mithalten können :-))
Danke Dir für die Info.
Grüße
Tom
Hallo Christian, hallo Fabian,
das hat mir nun keine Ruhe gelassen. Ich habe es jetzt auf dem Linux-Server folgenden Versuch durchgeführt:
Ich habe eine datei namens "datei.txt" angelegt und sie dem wwwrun geschenkt. Dann habe ich folgendes Script gestartet. Das läuft beim mir 75 Sekunden, weil ich max_execution_time so hoch eingestellt habe.
<?php
$fp=fopen("datei.txt","r+") or die("Öffnen ging nicht");
$lock=flock($fp,2);
// die Schleife läuft solange bis max_execution_time erreicht ist.
while (true)
{
echo ".";
flush();
sleep(1);
}
?>
Nach dem Script-Start habe ich die Datei von der Konsole aus gelöscht, was ja nicht gehen dürfte, wenn es sich bei flock um eine Kernelfunktion handeln würde.
QED
Zwei konkurrierende Scripte werde ich morgen ausprobieren und hier berichten. Bin ich scheints doch nicht auf dem Holzweg gewesen.
Grüße
Tom
Moin,
Nach dem Script-Start habe ich die Datei von der Konsole aus gelöscht, was ja nicht gehen dürfte, wenn es sich bei flock um eine Kernelfunktion handeln würde.
QED
Unix-Systeme sind nicht so schlecht wie Windows-Systeme. Du kannst _immer_ eine Datei problemlos löschen, verschieben oder umbenennen während ein Prozess sie geöffnet hat. Wenn der Prozess nämlich die Datei öffnet, bekommt er nur einen Filehandle zurück und wenn er den erstmal hat ist der Dateiname nicht mehr nötig. Intern wird nur noch mit dem Handle gearbeitet, d.h. kannst nun ausserhalb mit dem Dateinamen anstellen was du willst. Es gibt (IIRC) nicht mal eine eindeutige Möglichkeit vom Handle auf den Dateinamen zu schliessen (zumindest nicht zwingend auf allen Systemen). Das kann ja auch gar nicht gehen, weil Unix-Systeme in der Regel auch Hardlinks kennen, also mehrere Dateinamen für die selbe Datei.
Wenn du die Datei 'löscht' während sie noch geöffnet ist, wird einfach nur dieser eine Dateiname entfernt und der Linkcounter um eins verringert. Wenn der Counter auf 0 steht und die Datei geschlossen wird, wird der ihr zugewiesene Speicherplatz freigegeben. Umbenennen ist völlig problemlos und Verschieben entspricht kopieren und löschen.
Was das weitere angeht: fcntl ist immer advisory locking: http://www.gnu.org/manual/glibc-2.0.6/html_chapter/libc_8.html#SEC146. Es gibt zwar auch mandatory locking (http://web.systhug.com/kernel-lock/) aber das riecht nach einer Linux-Extrawurst und ist wahrscheinlich nicht portabel.
--
Henryk Plötz
Grüße aus Berlin
Guten Morgen Henryk,
Nach dem Script-Start habe ich die Datei von der Konsole aus gelöscht, was ja nicht gehen dürfte, wenn es sich bei flock um eine Kernelfunktion handeln würde.
Außerdem dürfte auch kein zweiter Prozess (der das Locking Verfahren nicht beachtet) aus dem Deamon oder dem Apache auf die Datei zugreifen können, wenn sie auf Kernelebene gelockt würde. Aber eben genau das ist möglich.
QED
Unix-Systeme sind nicht so schlecht wie Windows-Systeme.
den Satz streichen wir bitte. Ich bin auch kein Microsoft(-Windows)-Fan, aber bei einer sachlichen Diskussion sollte diese Art der Polemik draußen bleiben.
Selbstverständlich verfügen die meisten netzwerk- oder mutliuser- oder multiprozessfähigen Betriebssysteme über einen Lockingmechanismus auf Systemebene. Die einfacheren über Filelocking, die etwas besseren über Pagelocking (also Clusterweise) und die guten über Recordlocking, wobei das Recordlocking in der Regel byteweise läuft. Man kann Bereiche von...bis in der Datei sperren. Wenn man vergessen hat, wo die Sperre saß, hat man Pech gehabt. Dann muss man das Handle zurückgeben. Wenn man Glück hat, werden die Sperren dan aufgehoben. Novell hatte diesen Bug bis Version < 3.x.
Du kannst _immer_ eine Datei problemlos löschen, verschieben oder umbenennen während ein Prozess sie geöffnet hat.
Das ist eine Frage der Voreinstellung des "extended Filemode". Die normalen Filemodes lauten w, w+, r, r+, a, a+ ...
Leider haben die Entwickler von C hier einen Fehler eingebaut. Es werden für die Übergabe an die Interrupt-Handler keine numerischen Konstanten übergeben, sondern echte Strings. Diese werden dann erst in den einzelnen Interrupt-Handlern von fopen() etc. interpretiert. Aus diesem Grunde kann man das Highnibble des Filemode-Bytes nicht direkt ansprechen in C. In Pascal ist das ohne weiteres möglich. Ich werde nachher mal versuchen, auf dem Linux-Host einen Pascal-Compiler zum Laufen zu bringen und dann ausprobieren, obs klappt.
Aber ich denke, bei Zugriff über C auf die API gibt es da auch eine Systemvariable, die man vor dem Aufruf der Funktion setzen kann. Ich habe sie nur noch nicht gefunden (auch unter DOS/Windows noch nicht). Und ich kenne leider keine C-Programmierer, die da so tief eingestiegen sind. Bis zum Filemode ist alles noch plattformunabhängig. Erst die API ist für die Übersetzung auf die jeweilige Maschine verantwortlich.
Wenn der Prozess nämlich die Datei öffnet, bekommt er nur einen Filehandle zurück und wenn er den erstmal hat ist der Dateiname nicht mehr nötig. Intern wird nur noch mit dem Handle gearbeitet, d.h. kannst nun ausserhalb mit dem Dateinamen anstellen was du willst.
Mit dem Namen schon. Ich darf nur nicht versuchen, ihn ein zweites Mal mit einem Handle auf die Datei zu verbinden. Wenn diese gelockt ist, nützt mir der Name gar nicht viel. Ich komme dann nur noch an den Dateideskriptor (sozusagen der "Header"), nicht jedoch an den Datenbereich der Datei.
Interessant ist nun noch der Versuch, ob die Daten im Handle kopiert werden, oder ob nur die Handlereferenz an den Prozess weitergegeben wird. Im zweiten Falle könntest Du, während eine Applikation schon ein Handle auf die Datei besitzt, von einem anderewn Prozess aus die Zugriffsrechte ändern (das ist "nur" namnesbasiert, dafür braucht man kein Handle) und es hätte Auswirkungen auf den ersten Prozess.
Es gibt (IIRC) nicht mal eine eindeutige Möglichkeit vom Handle auf den Dateinamen zu schliessen (zumindest nicht zwingend auf allen Systemen). Das kann ja auch gar nicht gehen, weil Unix-Systeme in der Regel auch Hardlinks kennen, also mehrere Dateinamen für die selbe Datei.
Vom Handle auf den Dateinamen schließen? Das muss möglich sein, zumindest auf der Systemebene. In der Handle-Tabelle wird der Name der Datei eingetragen. So wird sie nämlich mit dem Handle verbunden. Wenn man also die lage der Handle-Tabelle im Speicher kennt, kann man si natürlich auslesen. Voraussetzung, man het ein gültiges Gate auf den Speicherbereich (Local Desriptor). Sonst klopft einem das OS auf die Finger. Wir arbeiten ja schließlich im protected meode (PCs).
Wenn du die Datei 'löscht' während sie noch geöffnet ist, wird einfach nur dieser eine Dateiname entfernt und der Linkcounter um eins verringert. Wenn der Counter auf 0 steht und die Datei geschlossen wird, wird der ihr zugewiesene Speicherplatz freigegeben. Umbenennen ist völlig problemlos und Verschieben entspricht kopieren und löschen.
Was das weitere angeht: fcntl ist immer advisory locking: http://www.gnu.org/manual/glibc-2.0.6/html_chapter/libc_8.html#SEC146. Es gibt zwar auch mandatory locking (http://web.systhug.com/kernel-lock/) aber das riecht nach einer Linux-Extrawurst und ist wahrscheinlich nicht portabel.
Mit diesem Abschnitt werde ich mich noch beschäftigen. Hast Du einen Link zur Linux-API? Ich würde mich gerne mal mit den System- und Netzwerkinterrupts auseinandersetzen. Eigentlich kann man erst danach mehr sagen zum Thema Locking.
Jedenfalls hast Du bestätigt, dass es in PHP um "advisory Locking" geht. Also Quasi nur eine Verkehrsregel. man kann sie beachten oder auch nicht...
Lieb Grüße aus http://www.braunschweig.de
Tom
Hallo Thomas, Henryk und Fabian, (langsam wird die Liste ja ziemlich lang)
Mit diesem Abschnitt werde ich mich noch beschäftigen. Hast Du einen Link zur Linux-API? Ich würde mich gerne mal mit den System- und Netzwerkinterrupts auseinandersetzen. Eigentlich kann man erst danach mehr sagen zum Thema Locking.
Darf ich auch einen Buchtipp geben? Helmut Herold, "Linux Unix Systemprogrammierung", ISBN 3-8273-1512-3.
Jedenfalls hast Du bestätigt, dass es in PHP um "advisory Locking" geht. Also Quasi nur eine Verkehrsregel. man kann sie beachten oder auch nicht...
Ja, aber das advisory locking ist nicht nur für PHP alleine da. Ein anderer Prozess, der auch mit fcntl() arbeitet, kann sich auch um Locks kümmern. So kann man zumindest alle Programme, die man auf das File "loslässt", mit einem Locking-Mechanismus ausstatten, der funktioniert.
Grüße,
Christian
Hallo Christian, Henryk und Fabian, (langsam wird die Liste interessant)
Mit diesem Abschnitt werde ich mich noch beschäftigen. Hast Du einen Link zur Linux-API? Ich würde mich gerne mal mit den System- und Netzwerkinterrupts auseinandersetzen. Eigentlich kann man erst danach mehr sagen zum Thema Locking.
Also verzeiht mir bitte die DOSige Ausdrucksweise. Aber OHNE Interrupts, IVT, GDT und LDT geht es auf PCs auch in Linux nicht. Gerade Linux nutzt das Prinzip der Austauschbarkeit ganz intensiv.
Darf ich auch einen Buchtipp geben? Helmut Herold, "Linux Unix Systemprogrammierung", ISBN 3-8273-1512-3.
Sowas habe ich schon ewig gesucht. Ich hoffe, das ist auf Deutsch?
Jedenfalls hast Du bestätigt, dass es in PHP um "advisory Locking" geht. Also Quasi nur eine Verkehrsregel. man kann sie beachten oder auch nicht...
Ja, aber das advisory locking ist nicht nur für PHP alleine da. Ein anderer Prozess, der auch mit fcntl() arbeitet, kann sich auch um Locks kümmern. So kann man zumindest alle Programme, die man auf das File "loslässt", mit einem Locking-Mechanismus ausstatten, der funktioniert.
Es wird ja langsam trocken unter den Füßen. Klasse! Also nutzt PHP hier eine Systemfunktion von Linux, und die selbe (nicht: gleiche)Tabelle zum jeweiligen Handle stände dann auch in Perl oder einem C-Prog zur Verfügung etc. Kann man denn auch über die bash darauf zugreifen?
Grüße @ all
Tom
PS: gehe jetzt erstmal Fotos machen zum Drachenfest auf dem Nussberg. Nur das Wetter ist schei.. Brauch die für mein Projekt. Fabi kennts schon.
Hallo alle, die hier mitreden und -lesen ;-)
Darf ich auch einen Buchtipp geben? Helmut Herold, "Linux Unix Systemprogrammierung", ISBN 3-8273-1512-3.
Sowas habe ich schon ewig gesucht. Ich hoffe, das ist auf Deutsch?
Ja, das ist auf Deutsch. Ich hab' hier die 2. Auflage rumliegen, weiß nicht, ob's inzwischen was neuers gibt. Ist aber nicht schlecht. (zumindest in meinen Augen)
Es wird ja langsam trocken unter den Füßen. Klasse! Also nutzt PHP hier eine Systemfunktion von Linux, und die selbe (nicht: gleiche)Tabelle zum jeweiligen Handle stände dann auch in Perl oder einem C-Prog zur Verfügung etc.
Exakt.
Kann man denn auch über die bash darauf zugreifen?
Das weiß ich allerdings nicht. Ich glaube nicht.
Grüße,
Christian
P.S.: was für ein Projekt?
Hallo alle, die hier mitreden und -lesen ;-)
ja, da schließ ich mich an.
Darf ich auch einen Buchtipp geben? Helmut Herold, "Linux Unix Systemprogrammierung", ISBN 3-8273-1512-3.
Sowas habe ich schon ewig gesucht. Ich hoffe, das ist auf Deutsch?
naja, "Systemprogrammierung" klingt deutsch, ne? ;-)
Ja, das ist auf Deutsch. Ich hab' hier die 2. Auflage rumliegen, weiß nicht, ob's inzwischen was neuers gibt. Ist aber nicht schlecht. (zumindest in meinen Augen)
hört sich gut an.
Es wird ja langsam trocken unter den Füßen. Klasse! Also nutzt PHP hier eine Systemfunktion von Linux, und die selbe (nicht: gleiche)Tabelle zum jeweiligen Handle stände dann auch in Perl oder einem C-Prog zur Verfügung etc.
Exakt.
prima. machen wir mittlerweile vier Leute denn nun einen Feature-Artikel draus?
"PHP-Locking für Fortgeschrittene" *g*
Kann man denn auch über die bash darauf zugreifen?
Das weiß ich allerdings nicht. Ich glaube nicht.
Ich denke auch nicht (habs nicht probiert... momentan kein Linux drauf), wär aber zu wünschen, dass es nicht geht, man könnte ja "versehentlich" was ändern ;)
P.S.: was für ein Projekt?
Das erzählt Tom lieber selbst, und zwar soviel, wie er will. Ich sage nix.
Fabian
[bald sind die Ferien um :(]
Hallo alle, die hier mitreden und -lesen ;-)
dito.
prima. machen wir mittlerweile vier Leute denn nun einen Feature-Artikel draus?
"PHP-Locking für Fortgeschrittene" *g*
vielleicht passt es besser als Tipp&Trick. Ist nämlich ein bisschen zu kurz für einen Feature-Artikel.
Ich denke auch nicht (habs nicht probiert... momentan kein Linux drauf), wär aber zu wünschen, dass es nicht geht, man könnte ja "versehentlich" was ändern ;)
Also ich hab' vor dem (vorherigen) Posting in der Bash-Manpage nachgeschaut und da stand nichts in der richtung "Locking" drinnen - und eigentlich ist es ja Quatsch in der Bash, da man in 90% aller Fälle sowieso andere Prozesse aufruft (ok - man kann mit read & echo arbeiten, aber auch nur begrenzt) und da Locks auf Filedeskriptoren angewendet werden, würde das vmtl. einige Probleme machen.
Grüße,
Christian
Hallo alle, die hier mitreden und -lesen ;-)
prima. machen wir mittlerweile vier Leute denn nun einen Feature-Artikel draus?
"PHP-Locking für Fortgeschrittene" *g*
vielleicht passt es besser als Tipp&Trick. Ist nämlich ein bisschen zu kurz für einen Feature-Artikel.
es wird wohl doch länger werden, Tom hat gerade beschlossen dass das ganze auch noch über ein filebasiertes Forum gehen wird ;-)
Ich denke auch nicht (habs nicht probiert... momentan kein Linux drauf), wär aber zu wünschen, dass es nicht geht, man könnte ja "versehentlich" was ändern ;)
Also ich hab' vor dem (vorherigen) Posting in der Bash-Manpage nachgeschaut und da stand nichts in der richtung "Locking" drinnen - und eigentlich ist es ja Quatsch in der Bash, da man in 90% aller Fälle sowieso andere Prozesse aufruft (ok - man kann mit read & echo arbeiten, aber auch nur begrenzt) und da Locks auf Filedeskriptoren angewendet werden, würde das vmtl. einige Probleme machen.
ergibt natürlich sinn, ich wollte es nur sicher wissen, danke.
Fabian
Hallo alle, die hier mitreden und -lesen ;-)
"PHP-Locking für Fortgeschrittene" *g*
Userverwaltung ohne MySQL (oder andere fertige Datenbanken)
vielleicht passt es besser als Tipp&Trick. Ist nämlich ein bisschen zu kurz für einen Feature-Artikel.
es wird wohl doch länger werden, Tom hat gerade beschlossen dass das ganze auch noch über ein filebasiertes Forum gehen wird ;-)
Das macht ja nachher auch nur Sinn, wenn wir ein Modul (Include-Datei) daraus machen, deren Funktionen dann einfach benutzt werden können.
Ich habe nochmal über das Include-Konzept von PHP nachgedacht. Das funktioniert eingentlich (fast) genauso, wie das Unit-Konzept von Pascal. Allerdings wird da ja nach dem Einbinden der Unit noch compiliert und es werden alle Funktionen und Bezeichner rausgeschmissen, die im übrigen Programm nicht benutzt werden. Die späten C-Versionen konnten das dann auch mal irgendwann...
Also ich hab' vor dem (vorherigen) Posting in der Bash-Manpage nachgeschaut und da stand nichts in der richtung "Locking" drinnen - und eigentlich ist es ja Quatsch in der Bash, da man in 90% aller Fälle sowieso andere Prozesse aufruft (ok - man kann mit read & echo arbeiten, aber auch nur begrenzt) und da Locks auf Filedeskriptoren angewendet werden, würde das vmtl. einige Probleme machen.
ergibt natürlich sinn, ich wollte es nur sicher wissen, danke.
Die Geschichte mit der bash ist deshalb interessant, weil Shell-Scripte dann auch Rücksicht auf das "advisory locking" nehmen könnten. Man darf ja einem Prozess nicht einfach die Daten unter dem Hintern wegziehen.
Tom
Hallo,
Ich habe nochmal über das Include-Konzept von PHP nachgedacht. Das funktioniert eingentlich (fast) genauso, wie das Unit-Konzept von Pascal. Allerdings wird da ja nach dem Einbinden der Unit noch compiliert und es werden alle Funktionen und Bezeichner rausgeschmissen, die im übrigen Programm nicht benutzt werden. Die späten C-Versionen konnten das dann auch mal irgendwann...
Aber pass' bitte mit relativen Pfaden auf.
Mach dann so etwas wie
require dirname(__FILE__) . "/blabla.php";
Aber ich denke, das weißt Du schon. ;-)
Die Geschichte mit der bash ist deshalb interessant, weil Shell-Scripte dann auch Rücksicht auf das "advisory locking" nehmen könnten. Man darf ja einem Prozess nicht einfach die Daten unter dem Hintern wegziehen.
Das ließe sich dann nur über Perl-Skripte realisieren. Bash ist halt keine Programmiersprache sondern eine Shell. Aber Perl-Skripte sind ja nicht soooo schwer, dass man gleich verzweifeln muss - ich hab' mir vorgenommen, mich endlich mal richtig in Perl reinzulesen.
Grüße,
Christian
Moin,
Ich denke auch nicht (habs nicht probiert... momentan kein Linux drauf), wär aber zu wünschen, dass es nicht geht, man könnte ja "versehentlich" was ändern ;)
Das habe ich doch in dem anderen Post geschrieben: fcntl ist avisory locking, wenn du mandatory locking willst, musst du durch den einen oder anderen Reifen springen, und das Ganze ist dann nicht mehr POSIX.1 (lies: wenn es auf einem anderen System funktioniert hast du Glück gehabt).
[bald sind die Ferien um :(]
Stimmt, Dienstag sind die ersten Vorlesungen.
--
Henryk Plötz
Grüße aus dem immer noch verschneiten Berlin
Hi Henryk
[bald sind die Ferien um :(]
Stimmt, Dienstag sind die ersten Vorlesungen.
Naja, ich hab morgen gleich 10 Stunden, davon 3(!) Mathe ;-))
Grüße aus dem immer noch verschneiten Berlin
du meine Güte, hoffentlich kommt des nicht nach Hannover rüber, ich muss doch mit dem Fahrrad fahren! >;)
Fabian
Moin,
Unix-Systeme sind nicht so schlecht wie Windows-Systeme.
den Satz streichen wir bitte. Ich bin auch kein Microsoft(-Windows)-Fan, aber bei einer sachlichen Diskussion sollte diese Art der Polemik draußen bleiben.
Naja, es ärgert mich bloß ab und zu mal, dass ich eine Datei nicht umbenennen darf, bloß weil irgendwo irgendein Prozess sie zum Lesen geöffnet hat. Das hat mich mehrfach gebissen als ich beim Aufräumen meiner MP3s den Namen einer Datei korrigieren wollte, während ich sie gehört habe.
Das ist eine Frage der Voreinstellung des "extended Filemode". Die normalen Filemodes lauten w, w+, r, r+, a, a+ ...
Öhm, was meinst du? man 2 open schweigt sich dazu aus.
Interessant ist nun noch der Versuch, ob die Daten im Handle kopiert werden, oder ob nur die Handlereferenz an den Prozess weitergegeben wird. Im zweiten Falle könntest Du, während eine Applikation schon ein Handle auf die Datei besitzt, von einem anderewn Prozess aus die Zugriffsrechte ändern (das ist "nur" namnesbasiert, dafür braucht man kein Handle) und es hätte Auswirkungen auf den ersten Prozess.
Öhm? Die Zugriffsrechte auf die Datei werden beim so weit ich weiß beim Öffnen überprüft, danach kannst du auch mit denen anstellen was du willst.
Vom Handle auf den Dateinamen schließen? Das muss möglich sein, zumindest auf der Systemebene.
Ich bezog mich da auf eine Anmerkung in der Doku zur glibc die ich vor langer, langer Zeit mal gelesen habe: "You can't read the address of a socket in the file namespace. This is consistent with the rest of the system; in general, there's no way to find a file's name from a descriptor for that file." (http://www.gnu.org/manual/glibc-2.2.5/html_node/Reading-Address.html).
In der Handle-Tabelle wird der Name der Datei eingetragen. So wird sie nämlich mit dem Handle verbunden. Wenn man also die lage der Handle-Tabelle im Speicher kennt, kann man si natürlich auslesen. Voraussetzung, man het ein gültiges Gate auf den Speicherbereich (Local Desriptor). Sonst klopft einem das OS auf die Finger. Wir arbeiten ja schließlich im protected meode (PCs).
Das riecht sehr DOSig (wie auch der Begriff des Interrupts ;). Unter Linux gibt es noch das /proc-Dateisystem das für jeden offenen Dateideskriptor einen Symlink auf die Datei hat. Damit scheint die Rückwärtsauflösung möglich zu sein, aber das dürfte noch unportabler als mandatory locking sein.
Mit diesem Abschnitt werde ich mich noch beschäftigen. Hast Du einen Link zur Linux-API? Ich würde mich gerne mal mit den System- und Netzwerkinterrupts auseinandersetzen. Eigentlich kann man erst danach mehr sagen zum Thema Locking.
Ich glaube das was du meinst heisst unter Linux Systemcall und müsste auf so ziemlich jedem System in Kapitel 2 der man-pages ausführlich beschrieben sein. Falls du grade kein Linux zur Hand hast, kannst du auch einfach Google befragen, zum Beispiel nach man open(2).
Jedenfalls hast Du bestätigt, dass es in PHP um "advisory Locking" geht. Also Quasi nur eine Verkehrsregel. man kann sie beachten oder auch nicht...
Eben. Wenn man was anderes machen will, wird das etwas aufwändiger.
--
Henryk Plötz
Grüße aus Berlin
Hallo,
http://mitglied.lycos.de/transchelfiles/post2.txt
Sollte irgendwer von der Server-Crew ne Ahnung haben, wodran meine Posting-"Magersucht" liegt, so möge er/sie sich bitte melden, das ist ja ne Strafe so! ;-)
Fabian
echo $begruessung[rand(0,sizeof($begruessung)-1)];
war ein typo mit "while/strlen"
function fillspace($feld,$lang)
{
$feld = substr($feld,0,$lang); //abschneiden, wenn zu lang
while (strlen($feld)<($lang-1)) //auffüllen mit
{
$feld = $feld . chr(32); //neutralem Element, kann auch chr(0) sein
}
return $feld;
}
Noch was:
CVS für die erste Zeile setzt voraus, dass weder der Name noch das Passwort usw das Trennzeichen oder das Zeilenende-Zeichen enthalten. Das gilt für das Passwort natürlich auch NACH der Verschlüsselung. Wird das bei md5() oder crypt() eingehalten? Ich stell mir vor, dass ja, da Unix ja auch mit Textdateien arbeitet, wollte nur drauf hinweisen. Dein Pipe-Symbol ist als Trennzeichen aber genauso ungeeignet, wie das Semikolon. Ich hatte das eben vergessen, nehme deshalb immer chr(8) als Trenner und chr(127), falls das CRLF mal temporär getauscht werden muss (für die Speicherung von Textareas z.B.). Die bekommt kein normaler User über ein Post-Formular in die Felder rein.
Wir könnten daraus einen kleinen Artikel machen, wenn es fertig ist. Bist Du damit einverstanden? Überschrift: "Einfacher Passwortschutz und Logging für Skripte"
Grüße
Tom
http://mitglied.lycos.de/transchelfiles/post3.txt
habe jetzt mit Opera 5 und 6, Mozilla und IE 5.5 versucht, ich kann nichts größeres Posten :-(
Fabian
Hi Fabi, @Stefan: lebst Du noch?
ich probier nochmal ein kängeres Posting. Also 8K bekommt man nicht so leicht voll. Da mus ich mich richtig anstrengen.
echo $begruessung[rand(0,sizeof($begruessung)-1)];
na gut, du wolltest es so:
echo crypt("G'Nabend Herr Schmieder *fg*"); //jetzt rate, was ich sage ;p
war ein typo mit "while/strlen"
*nachschlag* thx =)
CVS für die erste Zeile setzt voraus, dass weder der Name noch das Passwort usw das Trennzeichen oder das Zeilenende-Zeichen enthalten. Das gilt für das Passwort natürlich auch NACH der Verschlüsselung. Wird das bei md5() oder crypt() eingehalten? Ich stell mir vor, dass ja, da Unix ja auch mit Textdateien arbeitet, wollte nur drauf hinweisen. Dein Pipe-Symbol ist als Trennzeichen aber genauso ungeeignet, wie das Semikolon. Ich hatte das eben vergessen, nehme deshalb immer chr(8) als Trenner und chr(127), falls das CRLF mal temporär getauscht werden muss (für die Speicherung von Textareas z.B.). Die bekommt kein normaler User über ein Post-Formular in die Felder rein.
Außerdem sollten wir das vorher auch noch abchecken.
zustimmung. ich habe bis eben gerade keine crypt-verschlüsselung mit solchen zeichen aus meinem php-interpreter rausbekommen, will aber das geigentiel nicht ausschließen.(Zeilenende-Zeichen mahct er bestimmt nicht)
Wir könnten daraus einen kleinen Artikel machen, wenn es fertig ist. Bist Du damit einverstanden? Überschrift: "Einfacher Passwortschutz und Logging für Skripte"
Hört sich gut an, allerdings sollten wir dann per Mail weitermachen, weil diese magerpostings gehn' mir auf den Keks... (Und Stefan ist das wohl auch egal.)
Ja, der Stefan P. ist entweder eingeschlafen oder weggelaufen, weil er vor der Rechnung Angst hat, die wir ihm hinterher schreiben ;-)
Habe das gerade mal ausprobiert. Es gibt eine Fehlermeldung, dass maximal 12288 Zeichen erlaubt sind pro Posting. Das ist abr sehr viel. Der Fehler muss bei Dir liegen Fabian. Hast Du an Deiner Anlage was geändert heute? Z.B. Hubs sind manchmal so eklig, dass sie keine HTTP- oder POP3-Mulitpart Posts durchlassen. Habe schon zwei von diesen billigen Plunderdingern gehabt. Kaufe ich nicht mehr!
Grüße
Tom
Hi Fabi, @Stefan: lebst Du noch?
ich schon...
Ja, der Stefan P. ist entweder eingeschlafen oder weggelaufen, weil er vor der Rechnung Angst hat, die wir ihm hinterher schreiben ;-)
jo... ich rechne dann schonmal die spesen zusammen... ;)
Habe das gerade mal ausprobiert. Es gibt eine Fehlermeldung, dass maximal 12288 Zeichen erlaubt sind pro Posting. Das ist abr sehr viel. Der Fehler muss bei Dir liegen Fabian. Hast Du an Deiner Anlage was geändert heute? Z.B. Hubs sind manchmal so eklig, dass sie keine HTTP- oder POP3-Mulitpart Posts durchlassen. Habe schon zwei von diesen billigen Plunderdingern gehabt. Kaufe ich nicht mehr!
ja, es kann dran liegen, dass ich meinen DSL_Server von win98 auf 2k geupgraded (geiles wort) habe... mailen geht auch nur single-part, deswegen wird da von mir heute wohl auch nix mehr bei dir ankommen...
Fabian
[genervt]
Armer Fabian,
ja, es kann dran liegen, dass ich meinen DSL_Server von win98 auf 2k geupgraded (geiles wort) habe... mailen geht auch nur single-part, deswegen wird da von mir heute wohl auch nix mehr bei dir ankommen...
es handelt saich da um Timing-Fehler auf der Bit-Schicht, also was ganz eklig Elektisches. Manchmal hilft auch der Austausch der Netzwerkkarte gegen eine von der Mafia "zertifizierte".
Wird Zeit, dass die Marke "Windows" gelöscht wird *gg*
Viel Spaß noch. Ich werde jetzt erstmal ein Buch lesen, so ein richtig echtes mit Seiten zum Umblättern. Stammt von 1889. Habe ich geerbt. Ein Roman über die Entdeckung des Amilandes.
Viel Erfolg beim downdaten. Wenn es update gibt muss es das doch auch geben, oder?
Tom