我有一些代码从我们的开发服务器传输备份,它随机似乎行为非常奇怪,并给出以下错误/输出:
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
Run Code Online (Sandbox Code Playgroud)
我一点都不知道删除与删除有什么关系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);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
在我看来,你会遇到一个奇怪的PHP错误.
这Delete operation successful.不是PHP错误消息,它是成功删除(DELE)命令的FTP服务器响应消息.
PHP源代码的分析后,我可以找到这个问题的唯一解释是,ftp_get函数失败,而不从FTP服务器收到错误信息,所以它的显示前执行的命令的FTP服务器响应,在此具体情况,是删除命令.
PHP FTP函数将FTP服务器响应文本存储在结构的inbuf字段中ftpbuf:
typedef struct ftpbuf {
...
char inbuf[FTP_BUFSIZE]; /* last response text */
...
}
Run Code Online (Sandbox Code Playgroud)
然后在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;
}
Run Code Online (Sandbox Code Playgroud)
该ftp->inbuf字段由写入ftp_getresp FNC,但它可以是,对于一些模糊的原因,低电平ftp_get函数失败而不调用ftp_getresp的功能,因此示出了误导性错误消息.
也许FTP服务器错误日志可以提供一些关于真正问题的线索,但是如果没有进一步的信息,很难说为什么你遇到这个问题,甚至提出一个解决方法.
我唯一的建议是针对不同的FTP服务器测试您的代码(如果可能),然后最终将您的PHP升级到更新的版本.