PHP - Werte in Datei schreiben

Patroklos

NGBler
Registriert
20 Aug. 2013
Beiträge
459
Moin,

folgendes Problem will sich nicht lösen lassen...

Ich würde gerne ein paar Werte in eine Datei schreiben.
[src=php]
$datei = fopen("diedatei","r+");
$derwert = 1234;

rewind($datei);
fwrite($datei, $derwert);
fclose($datei);[/src]


[src=bash]-rw-rw-rw- 1 www-data www-data 0 Jul 12 17:36 diedatei[/src]

Habe ich iwas übersehen? :unknown:
 
PHP Warning: fopen(diedatei): failed to open stream: No such file or directory in ... on line 2


r+ legt wohl keine neue Datei an. Also musst du einen anderen Modus verwenden.
 
Ist das spezielle Verhalten denn erwünscht? Wenn [kw]$derwert = 1234[/kw] ist und in die leere Datei geschrieben wird, funktioniert das natürlich erst mal. Wenn der neue Wert dann [kw]99[/kw] ist, werden allerdings nur die ersten 2 Bytes überschrieben, wodurch hinterher [kw]9934[/kw] in der Datei steht. w wäre also der beste Modus.

Alternativ könnte man auch einfach benutzen, das ist ein bisschen weniger fehleranfällig.
 
[TABLE="class: doctable table, width: 979"]
[TR="bgcolor: #E6E6E6"]
[TD]'r+'[/TD]
[TD]Zum Lesen und Schreiben geöffnet; platziere Dateizeiger auf Dateianfang.[/TD]
[/TR]
[/TABLE]
Das heißt, du überschreibst die Datei jedes mal, wenn du etwas rein schreibst.
Insbesondere kann es dann zu sehr hässlichen Fehlern kommen:

datei
[src=text]tollerwert ist 1234[/src]

[src=php]$file = fopen('datei', 'r+');
fwrite($file, 'tollerwert ist 34');
fclose($file);[/src]

datei
[src=text]tollerwert ist 3434[/src]

Es werden nur die bytes überschrieben, die auch getroffen werden.
Korrekter wäre daher w+ zu verwenden. Die Datei wird dabei auf die Länge 0 gekürzt.

datei
[src=text]tollerwert ist 1234[/src]

[src=php]$file = fopen('datei', 'w+');
fwrite($file, 'tollerwert ist 34');
fclose($file);[/src]

datei
[src=text]tollerwert ist 34[/src]


Was du aber wahrscheinlich möchtest, ist a+

[TABLE="class: doctable table, width: 979"]
[TR="bgcolor: #E6E6E6"]
[TD]'a+'[/TD]
[TD]Zum Schreiben und Lesen geöffnet; platziere Dateizeiger auf Dateiende. Existiert die Datei nicht, versuche, diese zu erzeugen.[/TD]
[/TR]
[/TABLE]
datei
[src=text]tollerwert ist 1234[/src]

[src=php]$file = fopen('datei', 'a+');
fwrite($file, PHP_EOL . 'tollerwert ist 34');
fclose($file);[/src]

datei
[src=text]tollerwert ist 1234
tollerwert ist 3434[/src]


rewind ist an der von dir verwendeten Stelle übrigens unnötig:

[src=php]$file = fopen('datei', 'r+'); // der Dateizeiger steht an Position 0 in der Datei datei
rewind($file); // der Dateizeiger wird an Position 0 in der Datei datei gesetzt[/src]



Der Vorschlag von epiphora gleich file_put_contents zu verwenden ist natürlich unabhängig davon besser, wenn für deinen Anwendungszweck gewollt.
 
  • Thread Starter Thread Starter
  • #5
So also ich habe das nun nochmal probiert.
Mein Problem besteht aber weiterhin.
Ich kann nichts in die Datei schreiben. Egal ob a / r / w.
Es passiert einfach nichts. :unknown:
 
[src=php]<?php
$datei = fopen("diedatei","w");
$derwert = 1234;

rewind($datei);
fwrite($datei, $derwert);
fclose($datei);
?>[/src]

Funktioniert bei mir problemlos. Hast du evtl nicht die Schreibrechte im Verzeichnis?
 
  • Thread Starter Thread Starter
  • #7
Nunja eig schon.
Also /var/www/ gehört www-data und ebenso die Datei.

[src=bash]rw-rw-rw- 1 www-data www-data 0 Jul 12 17:36 diedatei[/src]
 
wie sieht es aus mit deinem php Script, hat dieses die nötigen Rechte?

Alternativ: stürzt es vielleicht vorher schon ab
 
  • Thread Starter Thread Starter
  • #9
Das Script hat doch die rechte des Nutzers der es ausführt oder?

Also müsste doch wenn der user www-data das Script von www-data ausführt, das script in die Datei von www-data schreiben können?
 
Statt ins Blaue zu raten, könntest Du Dir ja auch einfach mal die Fehlermeldung ansehen, mit der das Script abbricht. ;) lässt sich festlegen, welche Art von Fehermeldungen ausgegeben werden sollen.
 
Wie schon geschrieben, solltest du dir auf jeden Fall file_put_contents ansehen, welches im Endeffekt genau das gleiche tut, aber deutlich einfacher in der Bedienung ist.
Ansonsten wären mehr Daten ganz toll. Was genau möchtest du denn wie schreiben? Welche Fehlermeldung steht in der Logdatei? (!!GANZ WICHTIG!!)

Viele Grüße GreenApple
 
Also wenn das Skript nicht nur von dir aufgerufen wird würde ich ganz schnell auf SQL wechseln, denn bei Zugriff durch mehrere Threads verlieren solche Dateien nicht selten mal Werte.

ABer das ist kein PHP spezifisches Problem sondern allgemein außerhalb der Spezifikationen des Filesystems.
 
  • Thread Starter Thread Starter
  • #13
Also hauptsächlich geht es sich darum, das ich gerne eine Datei mit werten hätte die von einem Python Script verarbeitet werden.



Aber es funktioniert immer noch nicht. :/
Alternative habe ich es nun so gelöst.

[src=php]shell_exec('echo ' . $status . ' > /sys/class/gpio/gpio' . $pin . '/value');[/src]
 
Das ist bemerkenswert weit weg von einer guten Idee, nicht nur aus Performancegründen.

Was spricht dagegen Python ebenfalls von SQL lesen zu lassen?
Maneiuelle Schreibanforderungen in Programmen auf diesem Weg zu lösen ist generell sehr, sehr ungeschickt und dann noch ein Shell Exec...

Das da ist in nahezu jeder Hinsicht eine sehr schlechte Idee. Insbesondere wenn das Ding noch automatisch gelesen werden soll.
Du baust dir da einen riesen Haufen von potentiellen Sicherheits und Stabilitätsproblemen.

Geh lieber wieder zurück zu file_put_contents, das ist wesentlich weniger kritisch. Wenn auch immer noch ungeeignet.
 
  • Thread Starter Thread Starter
  • #15
Also ich hab es jetzt mit Mysql versucht.
Das schalten dauert nicht "lange" aber verzögert sich doch schon.
Ebenso wie das Aktuallisieren. Python ließt den zustand aus -> mysql -> seite.

Gibt es da keine elegantere Lösung?
 
wenn du mal im Detail schreiben würdest - was du jetzt gemacht hast, wo es Verzögerungen gibt - und was das Ergebnis sein soll - könnte man dir evtl. auch im Detail helfen :D
 
es wird wohl um ein raspberry pi Projekt gehen!?

also wenn du nur einen Client / Gerät hast das dein php Scritp aufruft und nur ein paar Zahlen dort eintragen soll, dann braucht man doch kein mysql

Funktioniert bei dir folgendes, falls nicht welche Meldungen erhälst du?

[src=php]
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

echo 'Name des Benutzers: ' . get_current_user();

$file = 'test.txt';
$content = file_get_contents($file);
echo $content;

$content = "Neuer Inhalt \n";
file_put_contents($file, $content);[/src]
 
Zurück
Oben