PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten einer Textdatei hinzufügen


koerschgen2001
16.09.2005, 17:46:04
Ich habe eine Textdatei in der Daten aus dem abgeschickten Kontaktformular gesichert werden(backup).
Um direkt das nächste vorweg zu nehmen, ich habe keine Datenbank zur Verfügung.

Muss jedesmal wenn ein Eintrag hinzugefügt wird, die ganze Textdatei mit fgets($datei, 100); in einer Schleife ausgelesen werden.
Dann den Eintrag hinzufügen und das ganze wieder schreiben.

Gibt es da keine andere Möglichkeit die Daten hinzuzufügen ohne das alles überschrieben wird.

Ich kann mir vorstellen dass das mit der Zeit ziehmlich lange dauert. Oder wie schnell sind da die Zugriffszeiten. Bei wie viel Zeichen wird es kritisch?

feuervogel
16.09.2005, 18:29:06
du kannst die datei auch mit dem parameter a für append öffnen, dann wird das was du schreiben willst an die datei angehängt.

koerschgen2001
16.09.2005, 20:51:52
Stimmt. Danke.

volti
16.09.2005, 20:54:05
Ich habe eine Textdatei in der Daten aus dem abgeschickten Kontaktformular gesichert werden(backup).
Um direkt das nächste vorweg zu nehmen, ich habe keine Datenbank zur Verfügung.

Muss jedesmal wenn ein Eintrag hinzugefügt wird, die ganze Textdatei mit fgets($datei, 100); in einer Schleife ausgelesen werden.
Dann den Eintrag hinzufügen und das ganze wieder schreiben.

Gibt es da keine andere Möglichkeit die Daten hinzuzufügen ohne das alles überschrieben wird.

Ich kann mir vorstellen dass das mit der Zeit ziehmlich lange dauert. Oder wie schnell sind da die Zugriffszeiten. Bei wie viel Zeichen wird es kritisch?
--Ich kann mir vorstellen dass das mit der Zeit ziehmlich lange dauert.--

Was ist ziemlich lange?
Ich habe eine Textdatei mit z.Z. ca. 750 KB, die werden bei meinem Rechner weit unter 1 sec gelesen und auch wieder geschrieben.

Für 'ne ähnliche Anwendung habe ich eine DB. Rein gefühlsmäßig ist die nicht schneller. Allerdings habe ich nicht sehr viele Zugriffe, da im Intranet mit geschlossener Gruppe gearbeitet wird. Möglicherweise sieht's anders aus, wenn gleich hundert Leute zugreifen.

Äh, Sch...
Wie geht das mit dem zitieren richtig?

koerschgen2001
17.09.2005, 13:56:01
Da ich aber nur jeweils einen Eintrag hinzufügen muss, reicht für mich
fopen($fn,"a"); vollkommen.
Wäre ja umständlich erst den ganzen Inhalt auszulesen, Eintrag hinzufügen und dann alles wieder schreiben.

meikel (†)
17.09.2005, 19:45:55
Ich habe eine Textdatei in der Daten aus dem abgeschickten Kontaktformular gesichert werden(backup).
Um direkt das nächste vorweg zu nehmen, ich habe keine Datenbank zur Verfügung.
Dann besorge Dir einen Account mit *SQL Zugriff.

Sonst hast Du einige Probleme, wenn das Script von mehr als einem User aufgerufen werden kann. Dann mußt Du beim Lesen und Schreiben die Datei so absichern, daß kein anderer "Task" in die Quere kommt. Damit der andere "Task" trotzdem noch schreiben darf, mußt Du folgenden Mechanismus vorsehen:
1. prüfen, ob die Datei schon in Bearbeitung ist. Falls ja, warten auf Freigabe.
2. mit flock() oder mit einem Semaphorefile die Datei sichern.
3. Lesen + Neueintrag + schreiben:
$dateiname = './daten.txt';

# Sicherung abfragen
# ggf. warten
# Sicherung setzen

$neuer_text = $_POST['text'] . "\n";

# natürlich muß hier klar sein, daß die Datei gelesen und beschrieben werden darf!
file_put_contents($dateiname, file_get_contents($dateiname) . $neuer_text);

# Sicherung aufheben
Diesen Aufriß mußt Du bei einem DBMS nicht veranstalten, da die Zugriffe dort seriell erfolgen.

koerschgen2001
18.09.2005, 14:37:14
1. prüfen, ob die Datei schon in Bearbeitung ist. Falls ja, warten auf Freigabe.
2. mit flock() oder mit einem Semaphorefile die Datei sichern.
3. Lesen + Neueintrag + schreiben:


1. wie püfe ich den ob die Datei schon in Bearbeiung ist?

2. flock($fp,2);
fputs($fp,$inhalt);
flock($fp,3);

3. while (!feof($fp))
{
$inhalt .= fgets($fp, 100);
}
$inhalt .= " $nachricht \n";

meikel (†)
18.09.2005, 19:04:17
Im Handbuch ist ein Beispiel:
http://de2.php.net/flock

Hier ein weiteres:

define('SEM', '/pfad/semaphorfile'); # muß les- und beschreibbar sein
define('MAX', 20);

# Warteschleife

$i = 0;
while (is_readable(SEM))
{
sleep(1);
if ($i>MAX)
die('Das dauert zu lange!');
#############
# EDIT
#############
$i++;
#############
}

# eigenes Semaphorfile erzeugen
if (! $fp = @fopen(SEM, 'w'))
{
die('Mist! Darf kein Semaphorfile anlegen!');
}
fclose($fp);

# Tu was

if (! @unlink(SEM))
die('Huch? Darf Semaphorfile nicht löschen?');

# fertig

koerschgen2001
19.09.2005, 12:56:22
Muss es nicht heissen:


# Warteschleife

$i = 0;
while (!is_readable(SEM))
{
sleep(1);
if ($i>MAX)
die('Das dauert zu lange!');
$i++;
}


?

koerschgen2001
19.09.2005, 13:51:49
Noch was.
Auf dem Server schreibt der mir in die Textdatei statt einen Zeilenumbruch nur so nen kasten(für nicht bekanntes Zeichen).
Ich habe im Quelltext \n stehen aber in der Textdatei erscheint kein Zeilenumbruch.

xabbuh
19.09.2005, 14:56:07
Wie sieht dein Quelltext genau aus? Auf welchem Betriebssystem läuft der Server?

meikel (†)
19.09.2005, 19:05:40
Muss es nicht heissen:
Genau (siehe EDIT). Ich Depp hatte da eine wunderschöne Endlosschleife gebaut. :-(

meikel (†)
19.09.2005, 19:08:55
Auf dem Server schreibt der mir in die Textdatei statt einen Zeilenumbruch nur so nen kasten(für nicht bekanntes Zeichen). Ich habe im Quelltext \n stehen aber in der Textdatei erscheint kein Zeilenumbruch.
\n ist der Linux Zeilenumbruch. Offenbar guckst Du Dir die Textdatei mit einem Windowseditor an, der nur \r\n als Zeilenende kennt und das \n nur als unbekanntes Zeichen darstellt.

koerschgen2001
20.09.2005, 13:36:39
Also mein Server im Internet auf dem Webspace ist Apache/1.3.33 (Unix).

Hier der entscheidende Teil des Codes:

$header="From:$email_from_mail\n";
if(isset($_POST['cc'])){
$header .= "Cc: $email_to_cc\n";
}
$nachricht = "".$_POST['vorname']." $email_from_name\n";
$nachricht .= "".$_POST['strasse']."\n";
$nachricht .= "".$_POST['plz']." ".$_POST['ort']."\n";
$nachricht .= "Tel.". $_POST['telefon']."\n";
$nachricht .= "Fax.".$_POST['fax']."\n";
$nachricht .= "Email: $email_to_cc\n";
$nachricht .= "\n\n".$_POST['kommentar']."\n\n";
$nachricht .= "# Ich wünsche um die Zusendung von\n# weiterem Informationsmaterial: ".$_POST['info']."\n\n";
if(isset($_POST['kontaktmail']) OR isset($_POST['kontakttel'])){
$nachricht .= "# Bitte nehmen Sie Kontakt mit mir auf: ".$_POST['kontaktmail']. " ". $_POST['kontakttel']."\n\n";
}
mail($email_to,$email_betreff,$nachricht,$header);

$fp = "kontakt.txt";
define('MAX', 20);

// Warteschleife

$i = 0;
while (!is_readable($fp))
{
sleep(1);
if ($i>MAX)
die('Dauert zu lange!');
$i++;
}

$inhalt = "$nachricht \n";
$inhalt .= "---------------------------------------------------------\n";

$fp = fopen($fp,"a");
flock($fp,2);
fputs($fp,$inhalt);
flock($fp,3);
fclose($fp);

koerschgen2001
21.09.2005, 09:28:25
\n ist der Linux Zeilenumbruch. Offenbar guckst Du Dir die Textdatei mit einem Windowseditor an, der nur \r\n als Zeilenende kennt und das \n nur als unbekanntes Zeichen darstellt.

Gibt es denn Probleme mit dem Unix, Linux Server wenn ich statt \n, \r\n in den Quelltext schreibe?

feuervogel
21.09.2005, 10:07:47
ich denke nicht; lustig wäre es nu mal unter nem mac zu betrachten, der mag nämlich nur \r :-)

meikel (†)
21.09.2005, 13:37:04
Gibt es denn Probleme mit dem Unix, Linux Server wenn ich statt \n, \r\n in den Quelltext schreibe?
Dem Server ist das völlig Wurscht, aus welchen Zeichen die Datei besteht. Ich verstehe allerdings nicht, warum Du eine Textdatei, die Du mit PHP liest und schreibst, zusätzlich noch mit einem Windowseditor, der noch nicht mal einen UNIX Zeilenumbruch kennt (Notepad?), angucken willst.

Gib doch die Datei im Browser aus:
echo nl2br($text) ;
Die Funktion ergänzt dann jedes \n mit einem <br />, damit der Browser an der richtigen Stelle dann den Zeilenumbruch auch ANZEIGT.

Wenn Du stattdessen eine Textdatei basteln willst, die bei jedem User korrekt formatiert angezeigt wird, hast Du sonst das Problem, daß es mindestens 3 unterschiedliche Zeilenumbruchszeichen gibt:
LINUX: \n
Windows: \r\n
MAC: \r

koerschgen2001
21.09.2005, 15:33:35
Wie ich am Anfang meines Beitrages erwähnt habe, ist die Datei nur als Backup von verschickten emails gedacht.
Wenn das Orginal verloren geht, kann man da nachschauen.

Aber die Idee mit dem Browser wäre was für einen Admin Bereich.