首页 > 解决方案 > PHP ftp_put 随机失败

问题描述

在将我们的网站移动到新主机时,我们从 PHP5(我认为)转到了 PHP7。我们还首次将 SSL 添加到该站点。自从移动站点以来,将图像文件复制到 FTP 的功能一直随机失败。

在做了一些研究之后,我了解到没有办法获得更详细的错误消息“ftp_put has failed”。

$dir = 'path/to/folder';

$a = scandir($dir);

$ftp_server = "ftp.server.com";
$ftp_conn = ftp_connect($ftp_server);
$ftp_username = 'myuser';
$ftp_userpass = 'mypass';
$login = ftp_login($ftp_conn, $ftp_username, $ftp_userpass);
ftp_pasv($ftp_conn, true);

foreach ($a as $value) {
    if(strlen($value) > 4){     

        $file = $dir.$value;
        $name = $value;

        if (ftp_put($ftp_conn, $name, $file, FTP_BINARY)){
            echo "<br><br><span style='color: green'>Successfully uploaded $file.</span><br><br>";
        }
        else{
            echo "<br><br><span style='color: green'>Error uploading $file.</span><br><br>";
        }
    }
}

上面代码的输出是:
成功上传../../img/bil/AAA123/AAA123-1.jpg。
成功上传../../img/bil/AAA123/AAA123-2.jpg。
成功上传../../img/bil/AAA123/AAA123-3.jpg。
上传 ../../img/bil/AAA123/AAA123-4.jpg 时出错。
上传 ../../img/bil/AAA123/AAA123-5.jpg 时出错。
成功上传../../img/bil/AAA123/AAA123-6.jpg。
上传 ../../img/bil/AAA123/AAA123-7.jpg 时出错。
成功上传../../img/bil/AAA123/AAA123-8.jpg。

此输出不同,再次运行它将成功上传其他图像并失败。

我尝试剥离代码,删除 scandir 和 foreach 部分,并使用一个图像文件的直接路径作为 $file 具有相同的结果。

我不知道可能出了什么问题。我怀疑迁移到 PHP7 并且可能 SSL 是问题,因为这一切都是从那时开始的。无法获得 ftp_put 失败的详细错误消息让我完全陷入困境。

我能做些什么来找出问题所在吗?

编辑:
添加 error_reporting(-1) 并打印出 error_get_last() 给我这个:
Array (
[type] => 2
[message] => ftp_put(): Type set to I
[file] => path/to/file. php
[行] => 51
)

标签: php

解决方案


任何网络通信都可能失败。

上传大量文件而不先通过 FTP 压缩它们是确保某些上传失败的好方法。如果您不想将它们压缩到单个请求中,那么一个好的选择是重试失败的响应,在重试之间添加延迟但不要进行无限循环。重试 3 次,如果仍然失败,那么您的问题比轻微的网络问题或 FTP 服务器错误要大得多,您最好跳过该文件并尝试下一个。也不要忘记关闭您打开的任何连接。

$dir = 'path/to/folder';

$a = scandir($dir);

foreach ($a as $value) {

    if(strlen($value) > 4){     

        for($retry = 0; $retry < 3; $retry++) {
            $ftp_server = "ftp.server.com";
            $ftp_conn = ftp_connect($ftp_server);
            $ftp_username = 'myuser';
            $ftp_userpass = 'mypass';
            $login = ftp_login($ftp_conn, $ftp_username, $ftp_userpass);
            ftp_pasv($ftp_conn, true);

            $file = $dir.$value;
            $name = $value;

            if (ftp_put($ftp_conn, $name, $file, FTP_BINARY)){
                echo "<br><br><span style='color: green'>Successfully uploaded $file.</span><br><br>";
                break;
            } else {
                if ($retry < 2) {
                    echo "<br><br><span style='color: green'>Error uploading $file Will retry....</span><br><br>";
                    sleep(2);
                } else {
                    echo "<br><br><span style='color: green'>Error uploading $file.</span><br><br>";
                }
            }
            ftp_close($ftp_conn);
        }
    }
}

推荐阅读