поэтому я хочу заблокировать файл, чтобы я мог видеть, что процесс 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);
?>
Но проблема в том, что когда я выполнил этот файл и снова запустил файл, второй ждет, пока первый будет сделан с блокировкой. Итак, оба успешно выполнены. Но только первый должен быть выполнен успешно. Кто-нибудь знает, как это сделать?
Похоже, вы не хотите, чтобы стадо блокировало? Вы просто хотите, чтобы первый процесс получил блокировку, а второй отказал?
Для этого вы можете использовать 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
Вы можете использовать второй файл, например, например «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);
}
?>