php - 警告 : ftp_get(): Delete operation successful

标签 php ftp

我有一些代码可以从我们的开发服务器传输备份,它似乎随机地表现得很奇怪并给出以下错误/输出:

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 错误。

删除操作成功。 不是 PHP 错误消息,它是 FTP 服务器对成功删除 (DELE) 命令的响应消息。

在分析了 PHP 源代码之后,我能找到的关于这个问题的唯一解释是 ftp_get 函数在没有从 FTP 服务器收到错误消息的情况下失败,因此它显示 FTP先前执行的命令的服务器响应,在这种特定情况下,是删除命令。

PHP FTP 函数将 FTP 服务器响应文本存储在 inbuf fieldftpbuf 结构:

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 升级到更新的版本。

关于php - 警告 : ftp_get(): Delete operation successful,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19034026/

相关文章:

c# - 尝试连接到 sftp 服务器时没有消息或超时

c# - .Net FtpWebRequest 有时会失败

php - 获取 [ErrorException] - 使用 composer 安装 yii2

php - 将产品描述添加到 WooCommerce 电子邮件通知

php - 在 codeigniter 中根据 ID 显示表数据

php - 如何将我的数组分成 3 个元素的组,按最后一个元素对它们进行排序并显示元素?

batch-file - 从包含两个独立模式的 FTP 服务器下载多个文件

python - FTP 可以在浏览器中进行无需身份验证的连接,但不能在代码中进行连接

Java-Android-FTP上传主线程异常

php - jquery选项卡,为每个选项卡重新加载页面