私の環境は、Windows、MsSQL、および PHP 5.4 です。
私のシナリオ: 必要なデータベースから一時フォルダーへの完全バックアップを作成し、それを新しい場所に移動する小さなシェル スクリプトを実行しています。
バックアップは正常に行われ、ファイルは一時フォルダーに作成されます。次に、名前を2番目のフォルダーに変更すると、問題が解決する場合もあれば、ソースファイルが見つからない場合もあります。
もちろん、この時点で、一時的な場所をすべてスキップできることはわかっていますが、ファイルが見つからないという実際の問題が気になります。なぜそんなにランダムなのか、これより前に書いた他のファイル機能にも影響を与える可能性があります...また、ファイルが宛先に移動する方法とタイミングを制御できる必要があります。
基本コードは本来あるべき単純なものです (ただし、これは私の実際のコードの単純化されたバージョンです。エラー処理/ログ条件に関心がある人がいるとは思えないためです)。
$query = "use test; backup database test to disk '//server01/temp/backups/file.bak', COMPRESSION;";
if($SQLClass->query($query)) {
$source="////server01//temp//backups//file.bak";
$destination="////server02//storage//backups//file.bak";
if(!rename($source , $destination)) {
//handleError is just a class function of mine that logs and outputs errors.
$this->handleError("Moving {$source} to {$destination} failed.");
}
}
else {
die('backup failed');
}
私が試したことは次のとおりです。
- その前に file_exists を追加しましたが、名前を変更できないときにソースファイルも見つかりません。
- ファイルが見つからないため、copy() と unlink() も機能しません。
- clearstatcache() を試しました
- SQLバックアップが完了した後、sleep(10)を試しました
これらのどれもまったく役に立ちませんでした。私とグーグルは、次に何をすべきか、何をしようとしているのかについてのアイデアがないようです。もちろん、shell_execing を実行することもできますが、それによって以前の製品に対する懸念が解消されるわけではありません。
この問題に気付いたのは、コマンドを連続して複数回実行しようとしたときだけでした。clearstatcache() が触れないファイル名用のある種のキャッシュはありますか? これは、php がファイル システムの内容などの更新に遅れる、ある種のゴースト ファイル現象に関連しているようです。
次に何を試すべきかについてのアイデアをいただければ幸いです。ここまでお読みいただければ、ありがとうございます :)。