In Datei schreiben mit ftp

winna

Grünschnabel
Hallo,
ich hab ein kleines Problem, und zwar versuch ich von meinem Webserver auf einem anderen Webserver durch ftp Zugriff in eine Datei zu schreiben.
Als Beispiel wollte ich erstmal nur das Datum in die Datei schreiben und darauf dann später aufbauen. Doch leider will es bei mir nicht klappen mit dem Script

Mein code sieht folgendermaßen aus:

PHP:
<?
if (!$con = ftp_connect("Domain")) {
      die("Error: can't connect");
   }
   
if (!ftp_login($con,"user","pass")) {
      ftp_quit($con);
      die("Error: can't login");
   }
   
$handle = fopen = ("datei.txt", "a");
fputs($handle, date("dmY")."\n");

?>

Es kommt leider immer der fehler:
Warning: fputs(): supplied argument is not a valid stream resource

Die Datei "datei.txt" ist auf dem anderen Webserver enthalten und hat die rechte 777.
Also ich kann mit dem Script auf den FTP Zugreifen nur leider nicht in der entsprechenden Datei reinschreiben.

ich weiss leider nicht mehr weiter ich hoffe ihr könnt mir helfen.

mfg.
 
Du kannst die Datei nicht remote verändern, soweit ich weiß.

Lade sie per [phpf]ftp_fget[/phpf] herunter, ändere sie und per [phpf]ftp_fput[/phpf] wieder hochladen.
 
Wenn Du eine Datei mit fopen() oeffnest dann wird diese lokal geoeffnet. Du verbindest zwar zuvor mit einem FTP-Server, aber davon weiss fopen() nichts, zumal dies auch eigentlich nur fuer lokale Dateien gedacht ist (auch wenn es, unter bestimmten Voraussetzungen, auch fuer Remote-Files zu gebrauchen ist).

Zusaetzlich ist das = nach fopen ueberfluessig.
Es heisst also nicht
PHP:
$handle = fopen = ("datei.txt", "a");
sondern
PHP:
$handle = fopen("datei.txt", "a");
Was aber eben immer noch auf eine lokale Datei verweist und nicht auf eine auf dem FTP-Server.

Die FTP-Funktionen von PHP koennen nur PUT und GET, also Dateien hoch oder runter laden.
Einen Schritt weiter geht meine FTP-Klasse, wo Dateien auch einfach gelesen oder geschrieben werden koennen, ohne dass eine lokale Datei dafuer erstellt/gelesen werden muss.
Ein Anhaengen von Daten ist hier aber auch nicht moeglich, liesse sich aber simulieren indem die Datei ausgelesen wird, der neue Content angehaengt und alles wieder geschrieben wird. Das erhoeht natuerlich den Traffic, duerfte aber die beste Loesung sein.

@Flex: Dein Vorschlag ist natuerlich auch machbar, aber aus 3 Gruenden finde ich die Nutzung meiner Klasse vorteilhafter:
  1. Die Datei muss nicht (kann aber) lokal gespeichert werden.
  2. Die FTP-Verbindung wird mittels fsockopen() aufgebaut, es besteht also keine Abhaengigkeit von den FTP-Funktionen oder der schrecklichen Einstellung allow_url_fopen.
  3. Es ist meine Klasse. :D
 
Manual Text 1:

fopen() bindet eine benannte Resource, welche mittels filename spezifiziert wurde, an einen Stream. Hat filename die Form "schema://..." wird angenommen, dass es sich hier um eine URL handelt und PHP sucht nach einem Protokollhandler (auch als Wrapper bekannt) für dieses Schema. Sind keine Wrapper für dieses Protokoll registriert, gibt PHP als Hilfe zum Verfolgen potentieller Probleme in Ihrem Skript einen Hinweis aus und setzt dann weiter fort, obwohl filename eine reguläre Datei spezifiziert.

Manual Text 2: Anhang N. List of Supported Protocols/Wrappers Weiter
FTP and FTPS
PHP 3, PHP 4, PHP 5. ftps:// since PHP 4.3.0
ftp://example.com/pub/file.txt
ftp://user:password@example.com/pub/file.txt
ftps://example.com/pub/file.txt
ftps://user:password@example.com/pub/file.txt

Conclusion ;)

PHP:
//$handle = fopen = ("datei.txt", "a");
 
$handle = fopen = ("ftp://user:password@serv.er/Directory/datei.txt", "a");
fputs($handle, date("dmY")."\n"); 
fclose($handle);

Klappt natürlich nur wenn hinreichende
Dateirechte auf dem Server vorliegen...
 
Danke euch allen für die Tipps.

Ich hab mir erstmal den Tipp vom rexxitall angeschaut. Weil das sah mir am einfachsten aus.
Habs so geändert wie du es vorgeschlagen hast:
PHP:
$handle = fopen = ("ftp://user:password@server/Directory/datei.txt", "a");
Doch leider sagt er mir jetzt:
Parse error: syntax error, unexpected '=' in .... in der entsprechenden Zeile von oben.

Schade wenn das nicht geht das sah für mich als Anfänger am leichtesten aus es zu realisieren.
Wenn es so nicht geht werd ich dann mal die anderen netten vorschläge abarbeiten.

mfg.
 
PHP:
$handle = fopen("ftp://user:password@server/Directory/datei.txt", "a");

Es muss ja auch immer noch so heißen, wodrauf Dennis Wronka ja auch schon hingewiesen hat.

Und die Fehlermeldung hat doch auch genau das bemängelt ;)
 
Und ich moechte auch nochmal darauf hinweisen, dass fopen() nur mit ueber Netzwerk funktioniert wenn allow_url_fopen aktiv ist, was durchaus ein Sicherheitsrisiko darstellen kann und somit tendenziell eher inaktiv sein duerfte.
 
Das kommt davon wenn man in Eile copy and paste mit dem falschen Beispiel macht *lach* (sorry)
Der Hobbyprogrammierer hat mit seiner Zeile (mit nur einem = Zeichen) na klar Recht.
Hauptsache nun tut es :)
 
Habs jetzt geändert der Fehler verschwindet auch nur jetzt kommt der nächste:
Warning: fopen(ftp://...@Domain.de/datei.txt) [function.fopen]: failed to open stream: FTP does not support simultaneous read/write connections. in .....

Hab dann mal eben phpinfo durchgeführt um zu sehen ob allow_url_fopen aktiv ist.
Und es ist aktiv sowie bei Local Value als auch bei Master Value ist es aktiv.

Und die datei (datei.txt) auf dem anderen server hat die rechte 777.

Ich glaub ich muss das dann anders lösen wenn es so net geht :(

mfg.
 
OK ist aber auch nicht viel mehr aufriss

PHP:
//------------------------------------------------------------------------------
function fileput($file,$data){
//------------------------------------------------------------------------------
$fh=fopen($file,"w");
fwrite($fh,$data);
fclose($fh);
}
//------------------------------------------------------------------------------
function fileget($file){
//------------------------------------------------------------------------------
$fh=fopen($file,"r");
$data=fread( $fh,filesize($file));
fclose($fh);
return $data;
}
$URL="ftp://user:password@serv.er/Directory/datei.txt";
$temp=fileput($URL,fileget($URL).date("dmY")."\n"));

Praktisch Datei einmal holen und dann geändert wieder wegschreiben...
 
Zurück