использование flock () для массива путей к файлам не работает - PullRequest
1 голос
/ 29 марта 2012

У меня есть функция, которая блокирует все файлы в определенной папке:

function lockFolder_files($folder='',$task=''){

global $file_array;//I need to use this var outside the function too

$file_array=glob($folder . '*_che.php');//this lists all files ending with "_che.php" in the array from folder1.

//now do a foreach on the array and open the file, and lock it:

foreach($file_array as $path){

$lock=fopen($path,"a+")//open with append mode

if($task=="lock"){
flock($lock,LOCK_EX);
}
elseif($task=="unlock"){
flock($lock,LOCK_UN);
}

}//end of foreach

if(count($file_array)==0){echo"no files were found in the folder"; return false;}

}//end of function

Так я называю эту функцию:

lockFolder_files("blah1/blah/myfolder","lock");

//do what i need to do with the array of files locked ($file_array)

lockFolder_files("blah1/blah/myfolder","unlock");//unlock all the files

Теперь кажется, что все файлы находятся в папке, они назначены массиву, но по какой-то причине он не блокирует файлы. После тестирования (с помощью sleep () и попытки записи в файл с помощью других сценариев) flock(), похоже, не оказывает никакого влияния на файлы, чем когда-либо ....

Есть идеи, почему это происходит?

Спасибо

1 Ответ

1 голос
/ 29 марта 2012

Две вещи:

  • блокировка файла с * nix не обязательна, только если все программное обеспечение использует flock() доступ синхронизирован.
  • Проблема вызвана сборкой мусора PHP,После возврата из функции все файлы закрываются, и поэтому все блокировки снимаются автоматически.Вы должны держать их открытыми, если хотите, чтобы замки оставались.
...