flock () продолжает ждать снятия блокировки

поэтому я хочу заблокировать файл, чтобы я мог видеть, что процесс php уже запущен. Пример кода выглядит следующим образом:

<?php
$file = fopen("test.txt","w+");

if (flock($file,LOCK_EX))
{
fwrite($file,"Write something");
sleep(10);
flock($file,LOCK_UN);
}
else
{
echo "Error locking file!";
}

fclose($file);
?>

Но проблема в том, что когда я выполнил этот файл и снова запустил файл, второй ждет, пока первый будет сделан с блокировкой. Итак, оба успешно выполнены. Но только первый должен быть выполнен успешно. Кто-нибудь знает, как это сделать?

0

Решение

Похоже, вы не хотите, чтобы стадо блокировало? Вы просто хотите, чтобы первый процесс получил блокировку, а второй отказал?

Для этого вы можете использовать LOCK_NB флаг, чтобы остановить flock звонок из блокировки:

$file = fopen("test.txt","r+");

if (flock($file,LOCK_EX | LOCK_NB))
{
fwrite($file,"Write something");
sleep(10);
flock($file,LOCK_UN);
}
else
{
echo "Error locking file!";
}

fclose($file);

Более подробная информация доступна на странице документации PHP flock — http://php.net/manual/en/function.flock.php

0

Другие решения

Вы можете использовать второй файл, например, например «test.txt.updated» и поддерживать там состояние — то есть, был ли обновлен «test.txt» или нет. Что-то вроде следующего. ПРИМЕЧАНИЕ. Я открыл «text.txt» в режиме добавления, чтобы увидеть, действительно ли два одновременных запуска записывают в файл только один раз.

<?php

if (! ($f = fopen("text.txt", "a")) )
print("Cannot write text.txt\n");
elseif (! flock($f, LOCK_EX))
print("Error locking text.txt\n");
else {
print("Locked text.txt\n");
if (file_exists("text.txt.updated"))
print("text.txt already updated\n");
else {
print("Updating text.txt and creating text.txt.updated\n");
fwrite($f, "Write something\n");
if ($stamp = fopen("text.txt.updated", "w"))
fwrite($stamp, "whatever\n");
else
print("Oooooops, can't create the updated state file\n");
sleep(10);
}
flock($f, LOCK_UN);
}

?>
0

По вопросам рекламы [email protected]