2013-09-26 4 views
5

Ich habe ein Stück Code bekommt, die Backups von unserem Entwicklungsserver überträgt, und es scheint zufällig sehr seltsam zu verhalten und die folgenden Fehler/Ausgabe geben:Warnung: ftp_get(): Löschen Operation erfolgreich

Warning: ftp_get(): Delete operation successful. in /root/cron/get_dev_archives.php on line 106 
ERR blahjob: Failed to get file: 2013-09-25_18-22-04-blahjob_dev18.tgz 
PHP Warning: ftp_get(): Delete operation successful. in /root/cron/get_dev_archives.php on line 106 

Warning: ftp_get(): Delete operation successful. in /root/cron/get_dev_archives.php on line 106 
ERR blahjob: Failed to get file: 2013-09-25_18-22-37-blahjob_dev19.tgz 
PHP Warning: ftp_get(): Delete operation successful. in /root/cron/get_dev_archives.php on line 106 

Warning: ftp_get(): Delete operation successful. in /root/cron/get_dev_archives.php on line 106 
ERR blahjob: Failed to get file: 2013-09-25_18-23-05-blahjob_dev5.tgz 
PHP Warning: ftp_get(): Delete operation successful. in /root/cron/get_dev_archives.php on line 106 

Warning: ftp_get(): Delete operation successful. in /root/cron/get_dev_archives.php on line 106 
ERR blahjob: Failed to get file: 2013-09-25_18-23-37-blahjob_dev33.tgz 

Ich habe nicht die geringste Ahnung, was Löschen mit ftp_get() zu tun hat, oder warum es false zurückgibt und eine Warnung über den Erfolg einer anderen Operation wirft. Google war auch nicht hilfreich bei der Suche nach ähnlichen Problemen.

-Code in Frage:

// ftp connection established, file list acquired, yadda yadda 
foreach($targets as $target) { 
    $localfile = $backup_dir . $target; 
    if(file_exists($localfile)) { 
     do_log($task['name'], "Local file ".$target." already exists, skipping.", 1); 
     continue; 
    } 
    if(! ftp_get($conn, $localfile, $target, FTP_BINARY)) { // line 106 
     do_log($task['name'], "Failed to get file: ".$target, 2); 
    } else { 
     do_log($task['name'], "Got file: ".$target); 
     ftp_delete($conn, $target); 
    } 
} 
+0

Welche Serverkonfiguration verwenden Sie? Das lokale, wo dieses PHP-Skript läuft. – idmean

+0

@wumm CentOS 5.7 Server mit PHP 5.2.10 läuft dieses Skript über CLI/cron. – Sammitch

+0

Können Sie zeigen, dass sie mit Ihren Zielen array? Und definieren Sie '$ task ['name']'> – Perry

Antwort

7

Meiner Meinung Sie in einem fremden PHP Fehler werden entstehen.

Die Delete operation successful. ist keine PHP-Fehlermeldung, es ist die FTP-Server-Antwortnachricht für einen erfolgreichen Löschbefehl (DELE).

Nach einer Analyse des PHP-Quellcodes, die einzige Erklärung, die ich für dieses Problem finden kann ist, dass die ftp_get-Funktion fehlschlägt, ohne eine Fehlermeldung vom FTP-Server erhalten, daher wird es die FTP-Server-Antwort des vorherigen ausgeführt Befehl, der in diesem speziellen Fall ein Löschbefehl ist.

Die PHP FTP Funktionen speichern, den FTP-Server Antworttext im inbuf field der ftpbuf Struktur:

typedef struct ftpbuf { 
    ... 
    char  inbuf[FTP_BUFSIZE]; /* last response text */ 
    ... 
} 

solches Feld dann in den ftp_get function verwendet wird, um die Warnmeldung anzuzeigen:

if (!ftp_get(ftp, outstream, remote, xtype, resumepos TSRMLS_CC)) { 
    php_stream_close(outstream); 
    VCWD_UNLINK(local); 
    php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); 
    RETURN_FALSE; 
} 

Das ftp->inbuf Feld wird von der ftp_getresp fnc geschrieben, aber es kann sein, dass aus irgendeinem obskuren Grund der niedrige Pegel ftp_get function schlägt fehl, ohne die ftp_getresp-Funktion aufzurufen, und zeigt daher eine irreführende Fehlermeldung an.
Vielleicht die FTP-Server-Fehlerprotokolle könnten einige Hinweise geben, was das eigentliche Problem ist, aber ohne weitere Informationen ist wirklich schwer zu sagen warum Sie dieses Problem erleben und sogar einen Workaround vorschlagen.

Mein einziger Vorschlag ist es, Ihren Code (wenn möglich) gegen einen anderen FTP-Server zu testen, dann eventuell Ihre PHP auf eine neuere Version zu aktualisieren.

+2

Ja. Ich habe über Ihre Antwort nachgedacht und in Betracht gezogen, dass die FTP-Verbindung möglicherweise gelöscht wird und die "Löschen-Operation erfolgreich" nur die letzte Nachricht im Puffer ist. Ich habe versucht, ein NOOP zu senden, um die Verbindung zwischen Downloads zu überprüfen, als ich [diesen PHP-Fehlerbericht] (https://bugs.php.net/bug.php?id=60183) über die Angelegenheit fand, die * sagt * es ist behoben ab 5.3.8, aber es gibt auch [dieses] (https://bugs.php.net/bug.php?id=52766), was bedeutet, dass es immer noch existiert. Go PHP Entwickler. : / – Sammitch

Verwandte Themen