簡體   English   中英

為什么我的PHP腳本間歇性地無法通過FTP上傳文件?

[英]Why is my PHP script intermittently unable to upload a file via 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';
    };
};

如果出現真正錯誤的情況,我將5美元試探上限。 CRON作業經常運行,如果它不能工作一次,它可以工作另一個。

到目前為止,這一點運作良好。 上傳文件所需的嘗試次數最多為4次,並且完全無法上傳文件。 所以它正在工作,我可以放松一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM