2013-09-26 44 views
5

Tôi đã có một chút mã mà chuyển sao lưu từ các máy chủ phát triển của chúng tôi, và có vẻ như ngẫu nhiên cư xử rất kỳ lạ và đưa ra các lỗi sau đây/đầu ra:Cảnh báo: ftp_get(): Xóa hoạt động thành công

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 

Tôi không có ý tưởng nhỏ nhất về việc xóa phải làm gì với ftp_get() hoặc tại sao nó trả về false và ném cảnh báo về thành công của một hoạt động khác. Google cũng đã vô ích trong việc tìm kiếm bất kỳ vấn đề tương tự nào.

Mã trong câu hỏi:

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

Bạn đang sử dụng thiết lập máy chủ nào? Địa phương, nơi tập lệnh php này đang chạy. – idmean

+0

@wumm Máy chủ CentOS 5.7 chạy PHP 5.2.10, tập lệnh này chạy qua CLI/cron. – Sammitch

+0

Bạn có thể cho họ thấy mảng với mục tiêu của mình không? Và bạn có định nghĩa '$ task ['name']'> – Perry

Trả lời

7

Theo tôi bạn đang phải gánh chịu trong một lỗi PHP lạ.

Delete operation successful. không phải là thông báo lỗi PHP, đó là thông báo phản hồi của máy chủ FTP cho lệnh xóa thành công (DELE). Sau khi phân tích mã nguồn PHP, giải thích duy nhất tôi có thể tìm thấy cho vấn đề này là chức năng ftp_get bị lỗi mà không nhận được thông báo lỗi từ máy chủ FTP, do đó nó hiển thị phản hồi của máy chủ FTP trước đó lệnh, trong trường hợp cụ thể này, là lệnh xóa.

Các PHP FTP chức năng lưu trữ các văn bản phản ứng máy chủ FTP trong inbuf field của ftpbuf cấu trúc:

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

lĩnh vực này sau đó được sử dụng trong ftp_get function để hiển thị các thông điệp cảnh báo:

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

Trường ftp->inbuf được viết bởi ftp_getresp fnc, nhưng có thể là do một số lý do không rõ ràng, mức thấp ftp_get function bị lỗi mà không cần gọi hàm ftp_getresp, do đó hiển thị thông báo lỗi gây hiểu lầm.
Có thể nhật ký lỗi máy chủ FTP có thể cung cấp một số manh mối về vấn đề thực sự là gì, nhưng không có thêm thông tin thực sự khó nói lý do tại sao bạn đang gặp sự cố này và thậm chí đề xuất cách giải quyết.

Đề xuất duy nhất của tôi là kiểm tra mã của bạn (nếu có thể) đối với một máy chủ FTP khác, sau đó nâng cấp PHP của bạn lên phiên bản mới hơn.

+2

Yep. Tôi đã suy nghĩ về phản ứng của bạn và xem xét rằng có thể kết nối FTP bị giảm, và 'Xóa hoạt động thành công' chỉ là thông điệp cuối cùng trong bộ đệm. Tôi đang tìm cách gửi một NOOP để kiểm tra kết nối giữa các lần tải xuống khi tôi tìm thấy [báo cáo lỗi PHP này] (https://bugs.php.net/bug.php?id=60183) về vấn đề mà * nói * cố định là 5.3.8, nhưng sau đó cũng có [this one] (https://bugs.php.net/bug.php?id=52766) ngụ ý nó vẫn tồn tại. Đi lập trình PHP. : / – Sammitch

Các vấn đề liên quan