У меня есть немного кода, который передает резервные копии с наших серверов разработки, и это случайное поведение ведет себя очень странно и дает следующие ошибки / вывод:
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
Я не имею ни малейшего представления о том, что delete имеет отношение к ftp_get()
, или почему он возвращает false
и предупреждает об успешной работе другой операции. Google также бесполезен в поиске подобных проблем.
Код, о котором идет речь:
// 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); } }
По-моему, вы столкнулись с странной ошибкой PHP.
Операция Delete operation successful.
не является сообщением об ошибке PHP, это ответное сообщение FTP-сервера для успешной команды delete (DELE).
После анализа исходного кода PHP единственным объяснением, которое я могу найти для этой проблемы, является то, что функция ftp_get
не работает, не получая сообщение об ошибке с FTP-сервера, поэтому оно отображает ответ FTP-сервера предыдущей выполненной команды, которая в этот конкретный случай, является командой удаления.
Функции FTP FTP хранят текст ответа сервера FTP в поле inbuf структуры ftpbuf
:
typedef struct ftpbuf { ... char inbuf[FTP_BUFSIZE]; /* last response text */ ... }
Такое поле затем используется в функции ftp_get для отображения предупреждающего сообщения:
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 с низким уровнем не работает , не вызывая функцию ftp_getresp
, поэтому появляется сообщение об ошибке.
Возможно, журналы ошибок FTP-сервера могут дать некоторые подсказки о том, что представляет собой настоящая проблема, но без дополнительной информации действительно сложно сказать, почему вы столкнулись с этой проблемой и даже предложили обходной путь.
Мое единственное предложение – проверить ваш код (если возможно) на другом FTP-сервере, а затем в конечном итоге обновить ваш PHP до более новой версии.