2013-09-26 8 views
5

Ho un po 'di codice che trasferisce i backup dai nostri server di sviluppo, e sembra in modo casuale a comportarsi in modo molto strano e dando i seguenti errori/uscita:Attenzione: ftp_get(): Cancellare un'operazione di successo

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 

Non ho la minima idea di cosa abbia a che fare l'eliminazione con ftp_get() o il motivo per cui restituisce false e lancia un avviso sul successo di un'altra operazione. Google non è stato di aiuto nel trovare problemi simili.

codice in questione:

// 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

Quale impostazione del server stai utilizzando? Il locale, dove è in esecuzione questo script php. – idmean

+0

@wumm CentOS 5.7 server con PHP 5.2.10, questo script viene eseguito tramite CLI/cron. – Sammitch

+0

Puoi mostrare loro array con i tuoi obiettivi? E stavi definendo '$ task ['nome']'> – Perry

risposta

7

A mio parere si sono incorrere in uno strano bug di PHP.

Il Delete operation successful. non è un messaggio di errore PHP, è il messaggio di risposta del server FTP per un comando delete (DELE) riuscito.

Dopo un'analisi del codice sorgente PHP, l'unica spiegazione che posso trovare per questo problema è che la funzione ftp_get non funziona senza ricevere un messaggio di errore dal server FTP, pertanto viene visualizzata la risposta del server FTP della precedente esecuzione comando che, in questo caso specifico, è un comando di cancellazione.

funzioni

Il PHP FTP memorizzare il testo di risposta del server FTP nel inbuf field del ftpbuf struttura:

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

Tale campo viene quindi utilizzato nel ftp_get function per visualizzare il messaggio di avviso:

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; 
} 

Il campo ftp->inbuf è scritto da ftp_getresp fnc, ma è possibile che, per qualche motivo oscuro, il livello basso ftp_get function non funziona senza chiamare la funzione ftp_getresp, pertanto viene visualizzato un messaggio di errore fuorviante.
Forse i registri degli errori del server FTP potrebbero dare qualche indizio su quale sia il vero problema, ma senza ulteriori informazioni è davvero difficile dire perché il problema si verifica e persino per proporre una soluzione alternativa.

Il mio unico suggerimento è di testare il codice (se possibile) su un server FTP diverso, quindi aggiornare il PHP a una versione più recente.

+2

Sì. Stavo pensando alla tua risposta e considerando che forse la connessione FTP è stata interrotta e che l'operazione "Delete successful" è solo l'ultimo messaggio nel buffer. Stavo cercando di inviare un NOOP per verificare la connessione tra i download quando ho trovato [questo bug report PHP] (https://bugs.php.net/bug.php?id=60183) sulla questione che * dice * è corretto al 5.3.8, ma poi c'è anche [questo] (https://bugs.php.net/bug.php?id=52766) che implica che esiste ancora. Vai agli sviluppatori PHP. : / – Sammitch