• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

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:
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
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.
 

epiphora

aus Plastik
Veteran

Registriert
14 Juli 2013
Beiträge
3.894
Ort
DE-CIX
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 file_put_contents() benutzen, das ist ein bisschen weniger fehleranfällig.
 

accC

gesperrt

Registriert
14 Juli 2013
Beiträge
5.250
'r+'Zum Lesen und Schreiben geöffnet; platziere Dateizeiger auf Dateianfang.
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+

'a+'Zum Schreiben und Lesen geöffnet; platziere Dateizeiger auf Dateiende. Existiert die Datei nicht, versuche, diese zu erzeugen.
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.
 

Patroklos

NGBler

Registriert
20 Aug. 2013
Beiträge
459
  • 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:
 

Abul

(Threadleser)

Registriert
20 Sep. 2013
Beiträge
4.087
[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?
 

Patroklos

NGBler

Registriert
20 Aug. 2013
Beiträge
459
  • 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]
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
wie sieht es aus mit deinem php Script, hat dieses die nötigen Rechte?

Alternativ: stürzt es vielleicht vorher schon ab
 

Patroklos

NGBler

Registriert
20 Aug. 2013
Beiträge
459
  • 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?
 

epiphora

aus Plastik
Veteran

Registriert
14 Juli 2013
Beiträge
3.894
Ort
DE-CIX
Statt ins Blaue zu raten, könntest Du Dir ja auch einfach mal die Fehlermeldung ansehen, mit der das Script abbricht. ;) So lässt sich festlegen, welche Art von Fehermeldungen ausgegeben werden sollen.
 

GreenApple

Neu angemeldet

Registriert
27 Juli 2014
Beiträge
10
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
 

alter_Bekannter

N.A.C.J.A.C.

Registriert
14 Juli 2013
Beiträge
4.826
Ort
Midgard
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.
 

Patroklos

NGBler

Registriert
20 Aug. 2013
Beiträge
459
  • 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.

https://www.youtube.com/watch?v=IVmWZ0Dmo1w

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]
 

alter_Bekannter

N.A.C.J.A.C.

Registriert
14 Juli 2013
Beiträge
4.826
Ort
Midgard
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.
 

Patroklos

NGBler

Registriert
20 Aug. 2013
Beiträge
459
  • 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?
 

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.754
Ort
in der Zukunft
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
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
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]
 
Oben