0

次のような単純なコードが与えられます:

$file = 'hugefile.jpg';
$bckp_file = 'hugeimage-backup.jpg';
// here comes some manipulation on $bckp_file.

想定される問題は、ファイルが大きいか巨大である場合(たとえば、jpg)、サーバーがファイルをコピーするのに時間がかかると思われることです(つまり、数ミリ秒でもかまいません)。次の行の実行がはるかに高速になること..したがって、理論的には、まだ作成されていないファイルを操作しようとすると、「そのようなファイルまたはディレクトリはありません」というエラーが発生する可能性があります。さらに悪いことに、TRUNCATEDファイルの操作を開始します。 。

私の質問は、$ bckp_fileがそれを操作する次の行の前に正常に作成された(またはこの場合はコピーされた)ことをどのように保証できるかです。

ファイルの作成/コピーが完了するまで、次の行の実行を「一時停止」、「遅延」するための私のオプションは何ですか?

今、私は次のようなことしか考えられません

if (!copy($file, $bckp_file)) {
    echo "failed to copy $file...\n";
}

これは私に警告するだけですが、何も解決しません(phpエラーがあるのと同じです)

また

if (copy($file, $bckp_file)) {
  // move the manipulation to here ..
}

しかし、これもそれほど有効ではありません-コピーが実行されなかったとしましょう-私は目標を達成せず、エラーもなくループから抜け出します。

それも問題ですか、それとも私はそれを考えすぎていますか?それとも、PHPにはそれを確実にするための組み込みメカニズムがありますか?推奨される方法はありますか?この問題について何か考えはありますか???

4

2 に答える 2

2

ファイルの作成/コピーが完了するまで、次の行の実行を「一時停止」、「遅延」するオプションは何ですか

copy() は同期関数であるため、copy() の呼び出し後、copy() が完全に終了するか失敗するまで、コードは続行されません。

つまり、魔法は関係ありません。

if (copy(...)) { echo 'success!'; } else { echo 'failure!'; }

同期 IO とともに、非同期 IO もあります。技術的な詳細を説明するのは少し複雑ですが、一般的な考え方は、バックグラウンドで実行され、コードがフックされるというものです。次に、重要なイベントが発生するたびに、バックグラウンド実行によってコードにアラートが送信されます。たとえば、ファイルを非同期コピーする場合は、進行状況が通知されるコピーにリスナーを登録します。そうすれば、その間にコードで他のことを行うことができますが、ファイルでどのような進行が行われているかを知ることもできます。

于 2012-03-13T05:56:29.800 に答える
1

PHP は、スクリプトを実行する前にファイル全体をサーバー上の一時ディレクトリに保存することによってファイルのアップロードを処理します (したがって、最初から $_FILES を使用できます)。次の行に移動する前に各行を実行します。

于 2012-03-13T05:59:36.830 に答える