PHP ftp_put随机失败

时间:2019-03-27 17:50:25

标签: php

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

进行了一些研究之后,我知道没有办法获得更详细的错误信息,“ ftp_put失败”。

$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()给了我这个:
数组(
    [类型] => 2
    [消息] => ftp_put():类型设置为I
    [file] => path / to / file.php
    [line] => 51

1 个答案:

答案 0 :(得分:0)

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

上传大量文件而不先通过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);
        }
    }
}