12

このシステムでは、SFTPを使用して、サーバー上の特定のディレクトリに大きなビデオファイルをアップロードします。完全にアップロードされたファイルを別のディレクトリにコピーするために使用されるPHPスクリプトを作成しています。

私の質問は、ファイルが完全にアップロードされているかどうかを判断するための良い方法は何ですか?ファイルサイズをメモし、スクリプトを数秒間スリープさせ、サイズを再度読み取り、2つの数値を比較することを検討しました。しかし、これは非常に厄介なようです。

4

5 に答える 5

5

単純

ほとんどのユースケースを処理する単純な手法が必要な場合は、最終更新日または (質問に示されているように) ファイルサイズを確認するプロセスを作成し、設定された時間 (たとえば 1 分間) に変更されていない場合は、アップロードが完了したと仮定して処理します。事実-あなたの質問は、まさにこれを示す別の質問のほぼ複製です。

屈強

ファイルのサイズ/最終更新時刻をポーリングする代わりに (接続が低速または断続的であると、開いているアップロードが完了するのが早すぎると見なされる可能性があります)、inotifyを使用してファイルの書き込みがいつ終了するかをリッスンします。

IN_CLOSE_WRITEをリッスンすると、ftp アップロードが特定のファイルの更新をいつ終了したかを知ることができます。

私はこれをphpで使用したことはありませんが、質素なドキュメントからは、基礎となるlibとまったく同じように動作するようです。

FTP クライアントを機能させる

このコメントから、一部の ftp プログラムがどのように機能するかを考慮してください。

一部の ftp サーバーは、転送が完了するまでデータを受信するために非表示の一時ファイルを作成することに注意してください。つまり、ターゲット ファイルと同じアップロード パスに .foo-ftpupload-2837948723

したがって、該当する場合は、完成したファイル名から、ftp アップロードが実際に終了したか、アップロードの途中で停止/切断されたかがわかります。

于 2012-08-20T13:41:24.393 に答える
4

理論的には、PHP からシステム コマンドを実行できる場合は、pidofコマンドを使用して sftp サーバー プロセスの pid を取得し、 lsof出力を使用して、現在チェックされているアップロード ファイルに対して開いているファイル記述子が存在するかどうかをチェックできます。

于 2012-08-20T13:53:54.823 に答える
1

転送中、ファイルの実際のサイズを知っているのは、SFTP クライアントとおそらく SFTP サーバーだけです (プロトコルの詳細がわからないため、サーバーも知っている可能性があります)。SFTP サーバーと直接通信できない限り、ファイルが完了するまで待つ必要があります。ある間隔でチェックするのは面倒に思えますが、状況下ではかなり良いです。それが私のプロジェクトで行うことです。

ポーリング間隔が非常に短い場合、数秒間停止する可能性のあるアップロードを処理するときに、それほど回復力がありません. そのため、間隔を1分に1つなどに設定してください。*nix ベースのプラットフォームを使用していると仮定すると、スクリプトを実行するために毎分 (またはポーリング間隔に関係なく) 実行するように cron ジョブを設定できます。

于 2012-08-20T13:37:08.860 に答える
1

@jcolebrandが述べたように-アップロードプロセスを制御できない場合-実際には、推測(ファイルのサイズ/日付)以外にできることはあまりありません。サーバーアクションの前後にフック/スクリプトを実行できるサーバーソフトウェアを探します(ここではファイル転送が完了しました)。そのようなソフトウェアが存在するかどうかはわかりません。最後の手段として、そのようなフックを自分で追加することにより、要件に合わせてオープンソース SFTP サーバーを適合させることができます。

于 2012-08-20T13:39:09.017 に答える
1

元の質問の下のコメントに興味深い回答が記載されていました (ただし、なんらかの理由でコメントが削除されました): SFTP サーバー ログを解析して、完全にアップロードされたファイルを見つけることができます。

于 2012-08-20T16:36:56.463 に答える