2013-09-26 87 views
5

我有一點,從我們的開發服務器傳輸備份代碼,並隨機似乎表現得非常奇怪,並給予下列錯誤/輸出:警告:ftp_get():刪除操作成功

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 

我並沒有絲毫的想法,刪除與ftp_get()有什麼關係,或者爲什麼它返回false並且對另一個操作的成功提出警告。谷歌也找不到任何類似的問題。

代碼中的問題:

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

您使用的是什麼服務器設置?本地,這個PHP腳本運行的地方。 – idmean

+0

@wumm運行PHP 5.2.10的CentOS 5.7服務器,該腳本通過CLI/cron運行。 – Sammitch

+0

你能展示他們與你的目標陣列嗎?你是不是定義了'$ task ['name']'> – Perry

回答

7

在我看來你是招致一個奇怪的PHP錯誤。

Delete operation successful.不是PHP錯誤消息,它是成功刪除(DELE)命令的FTP服務器響應消息。

經過對PHP源代碼的分析,我可以找到這個問題的唯一解釋是ftp_get函數失敗時沒有從FTP服務器收到錯誤消息,因此它顯示的是之前執行的FTP服務器響應命令,在這個特定情況下,它是一個刪除命令。

PHP的FTP功能存儲在ftpbuf結構的inbuf field FTP服務器響應文本:

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

這種場然後在ftp_get function用於顯示警告消息:

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

ftp->inbuf字段是由ftp_getresp fnc寫的,但可能是由於某些不明原因,低層ftp_get function失敗時未調用ftp_getresp函數,因此顯示誤導性錯誤消息。
也許FTP服務器錯誤日誌可能會提供一些關於真正問題的線索,但沒有進一步的信息真的很難說爲什麼你遇到了這個問題,甚至提出了一種解決方法。

我唯一的建議是針對不同的FTP服務器測試您的代碼(如果可能的話),然後最終將您的PHP升級到更新的版本。

+2

是的。我正在考慮你的迴應,並考慮到可能FTP連接被刪除,'刪除操作成功'只是緩衝區中的最後一條消息。當我發現[這個PHP錯誤報告](https://bugs.php.net/bug.php?id=60183)關於*說的事情時,我正在尋找發送NOOP來檢查下載之間的連接固定爲5.3.8,但也有[這一個](https://bugs.php.net/bug.php?id=52766),這意味着它仍然存在。去PHP開發者。 :/ – Sammitch