php - 为什么我的 PHP 脚本间歇性地无法通过 FTP 上传文件?

标签 php ftp

我编写了一个 PHP 脚本来从电子商务商店导出订单,将它们保存在 XML 文件中,然后将它们复制到远程 FTP 文件夹。另一家公司监控该 FTP 文件夹中的新文件并使用它们来完成订单。

出于某种原因,脚本有时只上传文件,我发现调试/深入了解这个问题非常困难。这是有问题的脚本的主要部分:

if ($ftp_conn = ftp_connect($ftp_server)) {
    if ($login = ftp_login($ftp_conn, $ftp_user, $ftp_pass)) {

        $filename = time() . '-orders.xml';
        ftp_pasv($ftp_conn, true);

        if (ftp_put($ftp_conn, $filename, $xmlPath, FTP_ASCII)) {
            $logString .= ' - Successfully run';
            ftp_close($ftp_conn);
        } else {
            $logString .= ' - Failed to upload file';
            $error = error_get_last();
            $logString .= ' - ' . $error['message'];
            ftp_close($ftp_conn);
        }
    } else {
        $logString .= ' - Failed to log in to server';
        ftp_close($ftp_conn);
    }
} else {
    $logString .= ' - Failed to connect to server';
};

我将 $logString 变量保存到一个文本文件中。我实际看到报告的唯一错误是:

ftp_put(): Type set to A

我在网上找不到任何关于这意味着什么或者它是否应该导致问题的信息。

FTP 连接日志也无济于事。这就是它无法运行时您看到的全部内容:

"PASS (hidden)" 230 -
"TYPE A" 200 -

有时有效,有时无效。失败时没有明显的模式。大的和小的 XML 文件都有效和失败。

显然服务器可以同时处理 3 个连接,理论上应该只有 2 个,所以我看不出这是问题所在。

PHP 脚本是否正常?如果是,我还能做些什么来尝试记录文件上传失败时发生的情况?

最佳答案

无论这被认为是修复还是逃避工作,我都会留给你。

我最好的猜测是我连接到的 1and1 FTP 服务器有问题,因为上面的脚本在不同的服务器上运行没有问题。

我尝试将 ftp_put 模式切换为 FTP_BINARY,但没有任何区别。

我通过循环整个函数直到它成功完成来解决这个问题。即:

$uploaded = false;
$tries = 0;
$filename = time() . '-orders.xml';

while (!$uploaded && $tries <= 5) {
    $tries++;
    if ($ftp_conn = ftp_connect($ftp_server)) {
        if ($login = ftp_login($ftp_conn, $ftp_user, $ftp_pass)) {
            $logString .= ' - Attempt ' . $tries;

            ftp_pasv($ftp_conn, true);
            ftp_set_option($ftp_conn, FTP_TIMEOUT_SEC, 120);

            if (ftp_put($ftp_conn, $filename, $xmlPath, FTP_BINARY)) {
                $logString .= ' - Successfully run';
                $uploaded = true;
                ftp_close($ftp_conn);
            } else {
                $logString .= ' - Failed to upload file';
                $error = error_get_last();
                $logString .= ' - ' . $error['message'];
                ftp_close($ftp_conn);
            }
        } else {
            $logString .= ' - Failed to log in to server';
            ftp_close($ftp_conn);
        }
    } else {
        $logString .= ' - Failed to connect to server';
    };
};

我将 $tries 限制在 5 次,以防出现真正的错误。 CRON 作业运行得足够频繁,如果它一次不工作,它可以在另一次工作。

到目前为止,这很有效。上传文件所需的最多尝试次数为 4 次,并且从未完全上传文件失败。所以它正在工作,我可以放松一下。

关于php - 为什么我的 PHP 脚本间歇性地无法通过 FTP 上传文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42439316/

相关文章:

javascript - 使用 php/javascript 在 mysql 数据库的谷歌地图上显示标记

php - 三列——用SQL获取MAX

javascript - 将文件上传到node.js中的ftp服务器

php - 使用php在数据库中插入日期格式

php - 全文搜索 MySql PHP

php - curl 错误 : Recv failure: Connection reset by peer - PHP Curl

java - 无法让类(class)项目 FTP 服务器发送 226

python - 使用Python通过HTTP代理通过HTTP获取FTP url

java - 读取文件的第一个字节

java - Tomcat:通过 JNDI 使用 FTP 连接