2012-03-13 7 views
0

のような簡単なコードを考える:PHP - 正しいコマンド実行順序を保証するためにどのように

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

仮定の問題は、ファイルが大きいか巨大である場合ということです - let'sがjpgを言う - 一つは、と思うだろうがサーバーをコピーするのに時間がかかります(時間がたっても数ミリ秒かかることもあります)。しかし、次の行の実行がはるかに速くなるとも仮定します。 したがって、理論上 - 私は "noまだ作成されていないファイルを操作しようとしたときにエラーが発生する - 悪化する - TRUNCATEDファイルを操作し始める。

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

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

今、私は唯一の私だけに警告しますが、(PHPのエラーを持つように同じ)は何も解決しません

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

のようなものを考えることができ

または

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

しかし、これはあまり有効でもありません。なぜなら、コピーが実行されなかったと言いますから、私は自分の目標を達成することなく、エラーなくループから脱出するだけです。

それも問題ではないのですか、それとも私はそれを熟考していますか? また、PHPにはbulit-inメカニズムがありますか? おすすめの方法はありますか? 問題に関するご意見はありますか? ??

答えて

2

ファイルが作成/コピーするまで、次の行の実行「一時停止」、「遅延」に私のオプションどのようなものがありましたが(

コピーを完了した)コードは継続しないことを意味同期機能ですcopy()が呼び出されてからcopy()が完全に終了するか失敗するまで

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

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

同期IOに加えて、非同期IOもあります。技術的な詳細で説明するのはちょっと複雑ですが、一般的な考え方はバックグラウンドで実行され、コードがその中に入り込むということです。その後、重大なイベントが発生するたびに、バックグラウンドの実行によってコードが警告されます。たとえば、ファイルを非同期にコピーする場合は、進行が行われたときに通知されるコピーにリスナーを登録します。そうすれば、あなたのコードは他のことをできるだけ早く行うことができますが、ファイルの進捗を知ることもできます。

+0

答えに感謝します。質問の範囲から外れるものは何もありません - 私はもっと学び、より多くのことを理解しようとしているからです:-)。質問で言及されたもう1つの問題 - TRUNCATEDファイルの場合はどうですか? php-synchronous-mechanisemも整合性をチェックしますか?再び理論上 - .jpgファイルを作成して保存/コピーすることはできますが、偽の情報が含まれています(私たちはネットから半透明のjpgを見ました)。 –

+0

私の答えは非同期IO :) – Corbin

1

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

+0

しかし、 "実行"は、 "正常に実行する"と同義ではありません - あなたが言ったようにPHPがすべての状況下でそれを処理すると仮定することができない限り... –

+0

これで間違っているかもしれませんが、 )は、コピー中にファイルの一時コピーを作成します。質問者がアップロードされたファイルについて話していると仮定しているのでしょうか?もしそうなら、おそらくmove_uploaded_fileを代わりに使用しなければなりません、そして、私はそれが彼女が話していたものだとは思いません。 – Corbin

+0

はい私はファイルのアップロードと 'move_uploaded_file'に関連していると仮定しましたが、' copy() '関数にも当てはまります(http://au.php.net/manual/en/function.copy.phpを参照)。 )。両方の関数は、コピー操作のステータスを返します。コピー操作は、コピーが完了するまで(成功または失敗)返されません。したがって、これらは同期しています。 –

関連する問題