tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
14
ZUGRIFFE
833
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    winna winna ist offline Grünschnabel
    Registriert seit
    Apr 2007
    Beiträge
    3
    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-Code:
    <?
    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($handledate("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.
     

  2. #2
    Avatar von Flex
    Flex Flex ist offline (aka Felix Jacobi)
    tutorials.de Moderator
    Registriert seit
    Nov 2001
    Ort
    Wuppertal
    Beiträge
    5.295
    Blog-Einträge
    65
    Du kannst die Datei nicht remote verändern, soweit ich weiß.

    Lade sie per ftp_fget() herunter, ändere sie und per ftp_fput() wieder hochladen.
     
    KIDS Kinderbetreuungsdienst
    Xing

    "When you play the game of thrones, you win or you die. There is no middle ground."
    by Cersei Lannister in "A Game Of Thrones"

  3. #3
    Avatar von Dennis Wronka
    Dennis Wronka Dennis Wronka ist offline Soulcollector
    Registriert seit
    Apr 2002
    Ort
    Hong Kong
    Beiträge
    12.296
    Blog-Einträge
    231
    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-Code:
    $handle fopen = ("datei.txt""a"); 
    sondern
    PHP-Code:
    $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.
     
    PHP Class Collection - PHP-Klassen fuer PHP 5 (und Teilweise auch fuer PHP 4)
    Updates: Catcher 1.1, FTPConnection 1.2, MultiSQL 1.1, RSS2 1.1, SMTPConnection 1.4
    __________________
    EasyLFS - Hintergrundinformationen, Installationsanleitung, Softwareliste und Download
    EasyLFS Projektthread - Informationen, Status und Diskussion zu meiner Linux-Distribution
    __________________
    Ich bin die Schildkroete, mein Sohn. Ich habe das Universum erschaffen, aber bitte mach mir daraus keinen Vorwurf; ich hatte Bauchschmerzen.
    __________________
    Zitat Zitat von Friedrich Nietzsche
    Man muss noch Chaos in sich haben, um einen tanzenden Stern gebaeren zu koennen.

  4. #4
    rexxitall rexxitall ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Ort
    Hildesheim (Niedersachsen)
    Beiträge
    51
    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://userassword@example.com/pub/file.txt
    ftps://example.com/pub/file.txt
    ftps://userassword@example.com/pub/file.txt

    Conclusion

    PHP-Code:

    //$handle = fopen = ("datei.txt", "a");
     
    $handle fopen = ("ftp://user:password@serv.er/Directory/datei.txt""a");
    fputs($handledate("dmY")."\n"); 
    fclose($handle); 
    Klappt natürlich nur wenn hinreichende
    Dateirechte auf dem Server vorliegen...
     
    Any sufficiently advanced technology
    is indistinguishable from magic.
    (A. C. Clarke)

  5. #5
    winna winna ist offline Grünschnabel
    Registriert seit
    Apr 2007
    Beiträge
    3
    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-Code:
    $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.
     

  6. #6
    Avatar von Flex
    Flex Flex ist offline (aka Felix Jacobi)
    tutorials.de Moderator
    Registriert seit
    Nov 2001
    Ort
    Wuppertal
    Beiträge
    5.295
    Blog-Einträge
    65
    PHP-Code:
    $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
     
    KIDS Kinderbetreuungsdienst
    Xing

    "When you play the game of thrones, you win or you die. There is no middle ground."
    by Cersei Lannister in "A Game Of Thrones"

  7. #7
    Avatar von Dennis Wronka
    Dennis Wronka Dennis Wronka ist offline Soulcollector
    Registriert seit
    Apr 2002
    Ort
    Hong Kong
    Beiträge
    12.296
    Blog-Einträge
    231
    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.
     
    PHP Class Collection - PHP-Klassen fuer PHP 5 (und Teilweise auch fuer PHP 4)
    Updates: Catcher 1.1, FTPConnection 1.2, MultiSQL 1.1, RSS2 1.1, SMTPConnection 1.4
    __________________
    EasyLFS - Hintergrundinformationen, Installationsanleitung, Softwareliste und Download
    EasyLFS Projektthread - Informationen, Status und Diskussion zu meiner Linux-Distribution
    __________________
    Ich bin die Schildkroete, mein Sohn. Ich habe das Universum erschaffen, aber bitte mach mir daraus keinen Vorwurf; ich hatte Bauchschmerzen.
    __________________
    Zitat Zitat von Friedrich Nietzsche
    Man muss noch Chaos in sich haben, um einen tanzenden Stern gebaeren zu koennen.

  8. #8
    rexxitall rexxitall ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Ort
    Hildesheim (Niedersachsen)
    Beiträge
    51
    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
     
    Any sufficiently advanced technology
    is indistinguishable from magic.
    (A. C. Clarke)

  9. #9
    winna winna ist offline Grünschnabel
    Registriert seit
    Apr 2007
    Beiträge
    3
    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.
     

  10. #10
    rexxitall rexxitall ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Ort
    Hildesheim (Niedersachsen)
    Beiträge
    51
    OK ist aber auch nicht viel mehr aufriss

    PHP-Code:

    //------------------------------------------------------------------------------
    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...
     
    Any sufficiently advanced technology
    is indistinguishable from magic.
    (A. C. Clarke)

  11. #11
    biozen biozen ist offline Grünschnabel
    Registriert seit
    May 2007
    Ort
    NRW
    Beiträge
    3
    Hallo,

    Winnis Problem finde ich nicht so trivial - zumindest nicht seine letzte Fehlermeldung:

    "failed to open stream: FTP does not support simultaneous read/write connections"


    Mir ist als Anfänger das gleiche passiert.
    Komme deshalb nicht weiter und würde mich für schnelle Hilfe bedanken!

    Der Fehler erscheint bei mir, weil ich - blöder Weise - eine "$handle=fopen($file,"w");
    fwrite($handle,$data);" Kombination erfolgreich ausprobiert hatte (habe nämlich eine Stream-Id zurückbekommen ), dabei aber das:
    fclose($handle); vergessen

    Meine Frage: wie kann ich den Stream schliessen, ohne den $handle zu wissen?
    Steht er etwa auch in einer GLOBAL?

    Ich programiere schon ein paar Jahre, nur keine Servertechnologien (bisher), arbeite erstmals auf einem Virtual-Server mit allen Rechten und wollte "nur" eine log.datei einrichten.
     

  12. #12
    Avatar von Flex
    Flex Flex ist offline (aka Felix Jacobi)
    tutorials.de Moderator
    Registriert seit
    Nov 2001
    Ort
    Wuppertal
    Beiträge
    5.295
    Blog-Einträge
    65
    Folgende Methode ist sehr unsauber, meiner Meinung nach, und sollte eigentlich nicht benutzt werden, aber es wäre möglich:

    $GLOBALS durchlaufen per Schleife und schauen welche Variable eine Ressource ist (is_resource()) und dann versuchen per fclose() zu schließen.

    Allerdings finde ich, man sollte wissen welche Dateihandle offen sind und auch schließen...
     
    KIDS Kinderbetreuungsdienst
    Xing

    "When you play the game of thrones, you win or you die. There is no middle ground."
    by Cersei Lannister in "A Game Of Thrones"

  13. #13
    biozen biozen ist offline Grünschnabel
    Registriert seit
    May 2007
    Ort
    NRW
    Beiträge
    3
    Danke Felix!
    finde, dass ist eine gute Idee.... aber:
    Bin alle GLOBALS rekursiv durchgegangen, ist keine is_resource() TRUE dabei (nur arrays und strings).
    Alle direkten FTP Befehle verlangen ja die Resourcennummer, also, ftp_quit(); oder so funktionieren nicht.

    Bleibt die Frage: wo wird das FTP-Protokoll eigentlich durchgeführt, bzw. wie läßt sich die aktuelle Resource herausfinden Und damit wohl beeinflussen - stoppen ...

    Da ich wohl Zugriff auf den Server habe, leider aber wenig Ahnung von der Technologie, bräuchte ich einen Hinweis.

    *** Warnung für andere FTP-Anfänger: fclose so absichern, dass er auch bei Abbruch noch ausgeführt wird

    Hilft das weiter:
    SERVER_SIGNATURE is: string ---> Apache/2.0.53 (Linux/SUSE) Server at www.nnnn.de Port 80

    Danke im Voraus!!
     

  14. #14
    Avatar von Flex
    Flex Flex ist offline (aka Felix Jacobi)
    tutorials.de Moderator
    Registriert seit
    Nov 2001
    Ort
    Wuppertal
    Beiträge
    5.295
    Blog-Einträge
    65
    PHP-Code:
    <pre>
    <?php

    $fp 
    fopen("test.txt");

    print_r($GLOBALS);

    ?>
    </pre>
    Wenn ich das ausführe, habe ich unten stehen:

    [fp] => Resource id #3
    Und is_resource() gibt auch TRUE aus.
     
    KIDS Kinderbetreuungsdienst
    Xing

    "When you play the game of thrones, you win or you die. There is no middle ground."
    by Cersei Lannister in "A Game Of Thrones"

  15. #15
    biozen biozen ist offline Grünschnabel
    Registriert seit
    May 2007
    Ort
    NRW
    Beiträge
    3
    Danke Felix,
    das Problem Fehler: "failed to open stream: FTP does not support simultaneous read/write connections"
    ist doch ein ganz anderes.
    Es geht garnicht um einen offene gelassenen FTP-Kanal wie angenommen, sondern allein darum , das ich in fopen(#..', 'a+') den Switch 'a+' = Read + Write gewählt hatte, und dies scheint meine Server-Version oder Einstellung nicht zu wollen. - Sagt die Fehlermeldung eigentlich ja auch deutlich: "not support simultaneous read/write connections".

    Also, keine Panik, mit einem normalen fopen(#..', 'a') klappt's wunderbar.
    Jetzt kann ich den Threat wohl endlich schließen.
    Ciao.
    Geändert von biozen (25.05.07 um 16:41 Uhr) Grund: Falsche Vorannahme...
     

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 12.09.08, 14:08
  2. Antworten: 2
    Letzter Beitrag: 12.02.08, 18:21
  3. Antworten: 2
    Letzter Beitrag: 27.04.07, 08:16
  4. Aus Datei lesen und in eine andere Datei schreiben
    Von Computerpinguin im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 03.05.05, 14:29
  5. Antworten: 4
    Letzter Beitrag: 25.04.05, 22:15