2011-12-19 7 views
0

サーバー上の特定のフォルダ(IBM AS400)からファイルを移動するPHPスクリプトがあります。私が実行している問題は、ファイルがフォルダーに移動されている間にスクリプトが実行されることがあることです。ファイル転送が完了するまでPHPが移動する前に転送する

私の意見では、不適切なロジックは、ファイルが "使用中"だった場合、PHPはそれを移動しようとはしませんが、結果として破損したファイルになると想定していました。

私はこれを行うことができると思った:

$oldModifyTime = filemtime('thefile.pdf'); 
sleep(2); 
if($oldModifyTime === filemtime('thefile.pdf'){ 
    rename('thefile.pdf','/folder2/thefile.pdf'); 
} 

しかしfilemtime機能は、ファイルが書き込まれている間も同じ値を思い付きます。私は同じ結果でファイルタイムを試みました。

Windowsで右クリック - >プロパティを実行すると、ファイルの書き込み時に変更日時とアクセス日時が常に変化します。

何かをする前にファイル転送が完了しているかどうかを判断する方法はありますか?

答えて

1

filemtime()のためのPHPマニュアルのエントリから:

注:この関数の結果はキャッシュされます。詳細は、clearstatcache()を参照してください。


私も、最初のファイルは、ファイルを保存し、エンドユーザーから来ている

1

一時的な名前または別のフォルダとして転送し、転送が完了したら正しいフォルダに名前を変更してコピーします。

+0

など、2秒は、ファイル転送は、ネットワークの輻輳、バッファリングに完了したかどうかを検出するために少し短いことを示唆しています私は自動的に "正しいフォルダにリネーム/コピー"することはできませんので、サーバー側でこれを実行せずに同じ問題に陥ってしまいます。 – Mike

+0

これは本当に最適な解決策です。手動プロセスの場合は、ユーザーを教育してスクリプトを調整する必要があります。たとえば、.tmpで終了したすべてのファイルを無視し、.tmpを使用してアップロードするようにユーザーに指示してから、アップロード後に名前を変更することができます。 –

+0

それでも可能でない場合は、この質問を見てください:http://stackoverflow.com/q/4693168/608781 –

関連する問題