我有一些代码可以从我们的开发服务器传输备份,它似乎随机地表现得非常奇怪,并给出以下错误/输出:
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);
}
}
在我看来,
你正在招致一个奇怪的PHP错误。
Delete operation successful.
不是 PHP 错误消息,而是成功删除 (DELE( 命令的 FTP 服务器响应消息。
在对PHP源代码进行分析后,我能找到的对此问题的唯一解释是ftp_get
函数失败而没有从FTP服务器收到错误消息,因此它显示先前执行的命令的FTP服务器响应,在这种情况下,这是一个删除命令。
PHP FTP 函数将 FTP 服务器响应文本存储在ftpbuf
结构的 inbuf 字段中:
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升级到较新版本。