поэтому я хочу заблокировать файл, чтобы я мог видеть, что 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);
?>
Но проблема в том, что, когда я исполняю этот файл и снова запускаю файл, второй ждет первого с блокировкой. Итак, оба успешно выполнены. Но только первый должен быть успешно выполнен. Anyknow знает, как это сделать?
Похоже, вы не хотите, чтобы стая блокировалась? Вы просто хотите, чтобы первый процесс получил блокировку, а второй - потерпеть неудачу?
Чтобы сделать это, вы можете использовать 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);
Дополнительная информация доступна на странице документа flock php - http://php.net/manual/en/function.flock.php
Вы можете использовать второй файл, например, "test.txt.updated", и поддерживать там состояние - то есть, был ли "test.txt" уже обновлен или нет. Что-то вроде следующего. ПРИМЕЧАНИЕ. Я открыл "text.txt" в append-mode, чтобы увидеть, действительно ли два параллельных прогона написаны только один раз в файле.
<?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);
}
?>
sleep
при тестировании в браузере? Вы на Windows, которая не поддерживает флагLOCK_NB
.