Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit Copy Funktion

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit Copy Funktion

    Guten Morgen zusammen,

    ich hoffe mir kann wer helfen hier. Wenn ich mein Skript über den Browser abfeuer funktioniert es einwandfrei.

    Wenn ich es aber als Cronjob einrichten möchte funktioniert es nicht. Ein abfeuern des Skriptes über die Shell sagt mir auch nur, dass die Datei nicht kopiert werden konnte. Die Variablen sind allerdings alle richtig gefüllt. <- meiner Meinung nach.

    Ein Error Reporting gibt mir auch nur wieder, dass weiter unten wenn ich mit der kopierten Datei arbeiten möchte, diese nicht existiert. Hier einmal der Skriptteil wo ich denke, dass vielleicht was faul ist. Obwohl es im Browser super funktioniert.

    PHP-Code:
        //FTP-Verbindung zum Server aufbauen
        // Login-Daten müssen angepasst werden
        
    $ftp_server "*****";
        
    $ftp_user_name "*****";
        
    $ftp_user_pass "*****";
        
    $ftp_dir "logs";
        
    $ftp_new_dir "/akt_log";
     
        
    // Herstellen der Basis-Verbindung
        
    $conn_id ftp_connect($ftp_server);
     
        
    // Einloggen mit Benutzername und Kennwort
        
    $login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass);
         
        
    // Besteht eine FTP-Verbindung
        
    if ((!$conn_id) || (!$login_result)) {
            echo 
    "2.) FTP-Verbindung nicht hergestellt!";
            echo 
    "3.) Verbindung mit $ftp_server als Benutzer $ftp_user_name nicht möglich";
            die;
        } else {
            echo 
    "2.) FTP-Verbindung erfolgreich<br/>";
            echo 
    "3.) Verbunden mit $ftp_server als Benutzer $ftp_user_name<br/><br/>";
        }
        
        
    // Suchen der exakten Log-Datei für die weitere Bearbeitung
        
        // Einlesen des Verzeichnisinhalts in ein Array
        
    $files ftp_nlist ($conn_id$ftp_dir);
        foreach (
    $files as $list){
            
    $bn[]=basename($list);
            
    //print_r($files);
        
    }    
        
        
    // Sortieren des Arrays
        
    sort($bn);
        
        
    // Suchen nach access.log im Namen
        
    $log_dateien = (preg_grep('/^access.log.*/',$bn));

        
    // Speichern des vorletzten Datensatzes des Arrays in neue Variable
        
    $datei = (array_slice($log_dateien,-2,1));

        foreach (
    $datei as $index => $value)
        {
            
    // Kopieren der Datei aus dem Log Verzeichnis in unabhängiges Verzeichnis
            // Ursprungsdatei aus dem Log-Verzeichnis
            
    $pfad 'ftp://'.$ftp_user_name.':'.$ftp_user_pass.'@*******/logs/';
            
    $file         $value;
            
    // Exakte Kopie in anderes Verzeichnis zum weiterverarbeiten
            
    $timestamp time();
            
            
    $new_pfad 'ftp://'.$ftp_user_name.':'.$ftp_user_pass.'@******/akt_log/';
            
    $new_file     $value.'_'.$timestamp;
            
            if (!@
    copy($pfad.$file$new_pfad.$new_file)) {
                   echo 
    "4.) Kopieren der Datei $file <b>NICHT</b> erfolgreich\n";
                
            }else{
                echo 
    "4.) Kopieren der Datei $file erfolgreich\n <br/>";
            }

    Ich danke Euch schon jetzt für Eure Hilfe und Anregungen. Das ganze liegt auf einem 1und1 Server.

    X-Powered-By: PHP/5.2.17

    in der Shell führe ich die Datei mit php5 cron.php aus.

    Gruß
    Daniel

  • #2
    ich habe mir noch nicht alles angesehen, aber bist du sicher dass das hier funktioniert?

    PHP-Code:
     foreach ($files as $list){
            
    $bn[]=basename($list);
            
    //print_r($files);
        

    Der Array wird in der Schleife immer wieder neu deklariert und überschrieben.
    Vor der Schleife solltest du den Array deklarieren mit $bn = array();

    Kommentar


    • #3
      @Fuel: Sollte imho so funktionieren, da nach dem ersten Durchlauf das Array ja bereits existiert.
      Allerdings ist es immer sinnvoll, das Array zuvor einmal zu definieren.

      @daniel1405:
      Du kannst Dir aber die foreach sparen und das $files direkt verwursten und damit weiterarbeiten:
      PHP-Code:
      $file array_map'basename'$files ); 
      und nimm mal das @ hier weg:
      PHP-Code:
      if (!@copy($pfad.$file$new_pfad.$new_file)) { 
      und lass Dir dann den ErrorReport nochmal richtig ausgeben, vielleicht kommt ja doch etwas mehr dann:
      PHP-Code:
      error_reporting ( -);
      ini_set 'display_errors'true ); 
      Competence-Center -> Enjoy the Informatrix
      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

      Kommentar


      • #4
        okay.

        also im browser funktioniert es so wie ich es haben möchte. lediglich in der shell nicht. das ist ja das kuriose. wenn ich print_r($bn); über dem sort($bn) schreibe habe ich auch immer genau die Informationen, die ich benötige um weiter mit den Dateien zu arbeiten.

        also war es da noch nicht.

        Kommentar


        • #5
          Vor dem sort() ist alles ok und danach nicht mehr
          Das wird sicher nicht am sort() liegen...

          Was kommt denn hierbei raus:
          PHP-Code:
          $datei = (array_slice($log_dateien,-2,1)); // die äussere Klammerung ist übrigens überflüssig!
          var_dump$datei ); 
          Competence-Center -> Enjoy the Informatrix
          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

          Kommentar


          • #6
            Zitat von Arne Drews Beitrag anzeigen
            Vor dem sort() ist alles ok und danach nicht mehr
            Das wird sicher nicht am sort() liegen...

            Was kommt denn hierbei raus:
            PHP-Code:
            $datei = (array_slice($log_dateien,-2,1)); // die äussere Klammerung ist übrigens überflüssig!
            var_dump$datei ); 

            also bei var_dump kommt auch genau das raus was ich benötige.

            PHP-Code:
            array(1) { [0]=> string(15"access.log.36.2" 
            und genau diese möchte ich lediglich kopieren mit dem gleichen namen + timestamp in einem anderen ordner. und das errorreporting gibt mir nur weiter unten nen fehler, da die datei nicht existiert. da das kopieren nicht funktioniert hat. in der shell.

            im browser läuft das skript so durch!

            Kommentar


            • #7
              und genau diese möchte ich lediglich kopieren mit dem gleichen namen + timestamp in einem anderen ordner.
              Aber das tust Du nicht...

              Schau mal, Du hast einen String, wie var_dump Dir gerade angezeigt hat.
              Du behandelst das aber direkt im Anschluß als Array:
              PHP-Code:
              foreach ($datei as $index => $value
                  { 
              das kann nicht funktionieren, so wie Du es erwartest.


              EDIT:
              Im übrigen scheint das aus einem grenzwertigen Tutorial zu sein?! Schau Dir mal ftp_get() an...
              Competence-Center -> Enjoy the Informatrix
              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

              Kommentar


              • #8
                Klassiker bei "funktioniert in Browser aber in Shell nicht": Lass mal bei beiden die PHP-Version ausspucken. Oft läuft da eine andere Version (mit anderer Konfiguration).

                EDIT: @Arne: Ne hat er nicht. Das ist ein Array wo das erste Element ein String ist. :P

                Kommentar


                • #9
                  Jo verdammt, Du hast recht!

                  Gut, aber den Rest-Gedöns braucht er trotzdem nicht, wenn er ftp_get() einsetzt ( siehe meinen Edit ).
                  Competence-Center -> Enjoy the Informatrix
                  PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                  Kommentar


                  • #10
                    Zitat von Arne Drews Beitrag anzeigen
                    Aber das tust Du nicht...

                    Schau mal, Du hast einen String, wie var_dump Dir gerade angezeigt hat.
                    Du behandelst das aber direkt im Anschluß als Array:
                    PHP-Code:
                    foreach ($datei as $index => $value
                        { 
                    das kann nicht funktionieren, so wie Du es erwartest.
                    aber $datei ist doch ein array oder nicht? das zieht sich doch durch $bn und $log_dateien

                    php version in der shell wenn ich mal einen cron ausführe X-Powered-By: PHP/5.2.17

                    im browser habe ich bei phpinfo()
                    PHP Version 5.5.14

                    wassen das für ein shit? kriege ich das bei 1und1 irgendwie umgestellt???

                    Kommentar


                    • #11
                      aber $datei ist doch ein array oder nicht?
                      Jo, habe ich übersehen.
                      Trotzdem solltest Du mit ftp_get() weiterkommen, unabhängig der Versionsunterschiede.
                      Wobei 5.2.x schon langsam mal upgedated werden sollte...
                      Competence-Center -> Enjoy the Informatrix
                      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                      Kommentar


                      • #12
                        Nicht getestet, aber der relevante Teil, um die vorletzte Datei der Log-Dateien lokal zu speichern, müsste in etwa so aussehen:
                        PHP-Code:
                        $aRemoteFiles ftp_nlist$conn_id$ftp_dir );
                        $aLogFiles preg_grep'/^access\.log.+/i'$aRemoteFiles );

                        sort$aLogFiles );

                        $sMyLogFile array_slice$aLogFiles, -2);
                        $sMyLogFile_Name basename$sMyLogFile[0] );

                        $bTakenFromRemote ftp_get(
                                
                        $conn_id,
                                
                        'pfad/zur/lokalen/quelle/' $sMyLogFile_Name,
                                
                        $sMyLogFile[0],
                                
                        FTP_BINARY
                            
                        );

                        if ( 
                        $bTakenFromRemote ) {

                            echo 
                        'Datei erfolgreich kopiert!';

                        } else {

                            echo 
                        'Datei konnte nicht kopiert werden, ich bin verwirrt...';


                        ...wie gesagt, nicht getestet, müsste aber in etwa hinkommen.
                        Competence-Center -> Enjoy the Informatrix
                        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                        Kommentar


                        • #13
                          Da hast du das gleiche übersehen wie oben schon. array_slice() liefert IMMER ein Array. basename() wird mit dem nicht glücklich werden.

                          Kommentar


                          • #14
                            Habs grad selbst gemerkt und korrigiert, danke...
                            Competence-Center -> Enjoy the Informatrix
                            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                            Kommentar


                            • #15
                              wow danke jungs. da hat sich ja ne richtige diskussion entwickelt. ich schau mir gleich mal direkt den Vorschlag von Arne an.

                              Kommentar

                              Lädt...
                              X