0

私の環境は、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 がファイル システムの内容などの更新に遅れる、ある種のゴースト ファイル現象に関連しているようです。

次に何を試すべきかについてのアイデアをいただければ幸いです。ここまでお読みいただければ、ありがとうございます :)。

4

3 に答える 3

0

キャッシュ関連であるか、mysql プロセスがまだファイルを解放していない可能性があります。mysql はファイルを別の一時ファイルにダンプし、最初にそれを一時フォルダーに移動します。ファイルの移動中は、他のプロセスからアクセスできない場合があります。

エラーが表示されたら、最初にglob()一時ディレクトリ内のすべてのファイルを試します。お気づきかもしれませんが、まだ完成していません。

また、少し遅れて、10回の再試行の繰り返しなどを実装しようとしましたか?

$notMoved = 0;
while($notMoved < 10){
    $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.
        if ($notMoved++ < 10){
           sleep(20);
        } else {
           $this->handleError("Moving {$source} to {$destination} failed.");
           break;
        }
    }else{
       break;
    }
}

この問題を回避するには:

  • ダンプして移動しないでください
  • 移動してからダンプします:-)

(もちろん、バックアップストアは1つ遅れます)

    $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.");
    }

$query = "use test; backup database test to disk '//server01/temp/backups/file.bak', COMPRESSION;";

if($SQLClass->query($query)) { 
  //done :-)
}
else {
    die('backup failed');
}
于 2014-03-07T15:55:06.827 に答える
0

試す

$source = "\\server01\temp\backups\file.bak";
$destination = "\\server02\storage\backups\file.bak";
$content = file_get_content($source);
file_put_contents($destination, $content);
于 2014-03-07T15:09:08.343 に答える
0

copyシステムのコマンドを呼び出してみてください。2 つの NFS 共有間でファイルをコピーする必要があったときに、(Linux ボックスで) あなたのような問題が発生しました。目に見える理由もなく、時々失敗しました。cp(Windowsコピーのアナログ)に切り替えた後、問題はなくなりました。

確かにそれは完璧ではありませんが、私にとってはうまくいきました。

于 2014-03-07T14:52:09.097 に答える