3

私の CLI スクリプトの 1 つは、FTP 経由でファイルをダウンロードします。

スクリプトは FTP 接続を開き、ログインして、必要なファイルをダウンロードし、スリープします。時々、ファイルを再度チェックします。このスクリプトは、デーモンとして何日も実行されることが予想されます。

開いている接続を再利用できるようにしたい (そのため、すべてのループを再接続する必要はありません)。

$ftpconn = false;
$ftplogin = false;

while(1){

sleep(25);
if(!$ftpconn){
    $ftpconn = ftp_connect(HOST);
}
if(!$ftplogin){
    $ftplogin = ftp_login($ftpconn, USER, PASS);
}

// Do FTP stuff here

}

私の質問はこれです。タイムアウトの両方ftp_connectを実行しますか? ftp_loginもしそうなら、それが起こったときにFALSEに変わりますか$ftpconn$ftplogin

ありがとう。

4

2 に答える 2

1

これについては、接続プロセスを実装することをお勧めします。次に、ファイルをチェックするためのロジックを構築します。(私は ftp_nlist のようなものを使用していると仮定しています)。何らかの理由でエラーが発生した場合、ftp_nlist は FALSE を返します。その時点で、コードで ftp_close を使用して既存の接続を閉じることができます (何らかの理由で接続が既に閉じられている場合は FALSE が返されます)。その後、接続シーケンスを再度実行します。

ftp_nlist が数回以上失敗した場合にアプリケーションを終了するロジックを組み込む必要があります。残念ながら、さまざまな ftp_* コマンドは、関数が失敗した理由を特定することに関してあまり深くないため、それを補うために追加のロジックを構築する必要があります。

于 2012-09-06T07:26:09.470 に答える
0

私は同じ問題を抱えていました。また、複雑な問題もあります。何らかの理由で、実際のエラーと空の応答 (ファイル リストが空の場合) を区別する方法がありません。ftp_nlistどちらの場合も FALSE を返し (ここにも記載)、ftp_rawlistどちらの場合も空の配列を返します。

それで、私の最初の直感はftp_pwd、接続がまだ開いているかどうかを確認するために、 のような安価な通話を行うことでした。ただし、PHP は何らかのキャッシングを行っているように見えるため、これは機能しません。ただし、これを使用して、PHP に FTP 接続を介して同じ呼び出しを強制的に実行させることができます。

$result = ftp_raw($ftpConnection, 'pwd');
print_r($result);

// Array
// (
//     [0] => 257 "/www/html"
// )

これは常に(FTP 接続が機能している場合) 応答を返す必要があり、これは単一の項目を持つ配列になります。エラーが発生した場合は、空の配列になります。

于 2020-02-26T14:05:52.837 に答える