ユーザーがファイルをアップロードするとき(ユーザーは複数のファイルをアップロードできます)
exec('nohup php /main/apache2/work/upload/run.php &');
nohup
バックエンドで実行する必要があるので使用しています。
私の元の設計では、実行されるたびにrun.php
ディレクトリをスキャンしますscandir
。を使用LOCK_EX
してファイルの排他ロックを取得し、ファイルにロックがある場合はファイルをスキップして次のファイルに移動するために使用します。ファイルにロックがある場合。問題は、サーバーにライブラリがなく、そのライブラリを使用してロックメカニズムを実行しているため、現時点では機能しないことです。それをインストールするのに1、2ヶ月かかるでしょう(私はそれを制御できません)。flock
LOCK_NB
//Do logic
fcntl()
flock
flock
したがって、そのための私の回避策は、ロックとして機能する一時ファイル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
か?