0

ユーザーがファイルをアップロードするとき(ユーザーは複数のファイルをアップロードできます)

exec('nohup php /main/apache2/work/upload/run.php &');

nohupバックエンドで実行する必要があるので使用しています。

私の元の設計では、実行されるたびにrun.phpディレクトリをスキャンしますscandir。を使用LOCK_EXしてファイルの排他ロックを取得し、ファイルにロックがある場合はファイルをスキップして次のファイルに移動するために使用します。ファイルにロックがある場合。問題は、サーバーにライブラリがなく、そのライブラリを使用してロックメカニズムを実行しているため、現時点では機能しないことです。それをインストールするのに1、2ヶ月かかるでしょう(私はそれを制御できません)。flockLOCK_NB//Do logicfcntl()flockflock

したがって、そのための私の回避策は、ロックとして機能する一時ファイルlock.txtを用意することです。ファイル名がlock.txtに存在する場合は、ファイルをスキップして次のファイルに進みます。

$dir = "/main/apache2/work/upload/files/";
$files = scandir($dir);
$fileName = "lock.txt";

for($i=0; $i<count($files); $i++) 
{   
    if(substr(strrchr($files[$i],'.csv'),-4) == '.csv')
    {           
        if($file_handle = fopen("$fileName", "rb"))
        {
            while(!feof($file_handle))
            {
                $line = fgets($file_handle);
                $line = rtrim($line);
                if($line == "")
                {
                    break;
                }
                else
                {
                    if($files[$i] == $line)
                    {
                        echo "Reading from lock: ".$line."</br>";
                        $i++; //Go to next file
                    }
                }

            }
            fclose($file_handle);
        }

        if($i >= count($files))
        {
            die("$i End of file");
        }

        if($file_handle = fopen("$fileName", "a+"))
        {
            if(is_writable($fileName))
            {               
                $write = fputs($file_handle, "$files[$i]"."\n");
                //Do logic

                //Delete the file name - Stuck here

                fclose($file_handle);
            }

        }

    }
    else
    {
        //Do nothing
    }
}

どうすればファイル名を削除できますlock.txtか?

さらに重要なことに、使用せずにphpでファイルをロックするためのより良い方法はありますflockか?

4

1 に答える 1

1

共有ロックデータベースを使用すると、ロックの問題がそのファイルに移動するだけです。それはそれを解決しません。

より良い解決策は、実際のファイルごとに1つのロックファイルを使用することです。アクセスをロックしたい場合は、それが存在しないかどうかmyFile.csvを確認file_exists('myFile.csv.lock')します。touch('myFile.csv.lock')そしてunlink('myFile.csv.lock')終わったら。

現在、file_exists()とtouch()の間に競合状態が発生する可能性があります。これは、PIDをファイルに保存し、getmypid()実際にロックを保持しているプロセスであるかどうかを確認することで軽減できます。

于 2011-07-21T15:02:07.123 に答える