0

ファイルがphpスクリプトから別のプロセスによってアクセスまたは変更されていることを確認する方法はありますか? filemtime()、fileatime()、および filectime() 関数を使用しようとしましたが、継続的にチェックしているループ内にスクリプトがありますが、スクリプトが実行されると、最初から時間がかかるようですファイルがチェックされました..例は、FTPまたはSMB共有にファイルをアップロードすることです。私はこれを以下で試みました

while(1==1)
{
  $LastMod = filemtime("file");
  if(($LastMod +60) > time())
  {
    echo "file in use please wait... last modified : $LastMod";
    sleep(10);
  }else{
    process file
  }
}

ファイルが絶えず変化していることはわかっていますが、$LastMod 変数は更新されていませんが、プロセスを終了して再度実行すると、ファイルから新しい $LastMod が取得されますが、ファイルがループでチェックされるたびに更新されないようです。

私もfilesize()を見てこれを試みましたが、flock()も調べたのと同じ症状が出ましたが、ファイルがPHPの外部で作成または変更されたため、これがどのように機能するかわかりません。

誰か解決策があれば教えてください

ありがとう Vip32

PS。PHP を使用してファイルを処理し、必要に応じて mysql とやり取りし、外部 Web サイトにクエリを実行する

4

2 に答える 2

3

stat()stat()呼び出しは比較的高価な関数であるため、ファイルメタデータ関数はすべてデータをキャッシュする出力を処理します。そのキャッシュを空にして、stat()に新しいデータをフェッチさせることができます。clearstatcache()

ファイルの変更を監視できるメカニズムは他にもあります。PHPでループを実行して繰り返しstat()を実行する代わりに、OSが提供するメカニズムにフックして、ファイルが実際に変更されたときにオンデマンドでPHPスクリプトを呼び出すことができる外部監視アプリ/スクリプトの使用を検討してください。

于 2011-07-15T21:45:29.173 に答える
0

ループに追加clearstatcache();します。

while(true)
{
  $LastMod = filemtime("file");
  clearstatcache();
  if(($LastMod +60) > time())
  {
    echo "file in use please wait... last modified : $LastMod";
    sleep(10);
  }else{
    process file
  }
}
于 2011-07-15T21:46:22.447 に答える