Php flock не блокирует файл

Обновлено: 06.07.2024

flock() позволяет осуществить простую модель чтения/записи, которая может быть использована практически на любой платформе (включая большинство вариантов Unix и даже Windows).

В версиях PHP до 5.3.2 блокировка освобождалась также вызовом функции fclose() (которая также вызывается автоматически по завершении скрипта).

PHP поддерживает портируемый способ консультативной блокировки (adviosory locking) полностью всего файла (что означает, что все программы, осуществляющие доступ к файлу, должны использовать один и тот же способ блокировки, иначе блокировка не будет работать). По умолчанию, данная функция будет ждать получения блокировки; это поведение можно изменить с помощью описанного ниже параметра LOCK_NB .

Список параметров

Указатель ( resource ) на файл, обычно создаваемый с помощью функции fopen() .

  • LOCK_SH для получения разделяемой блокировки (чтение).
  • LOCK_EX для получения эксклюзивной блокировки (запись).
  • LOCK_UN для снятия блокировки (разделяемой или эксклюзивной).

Также возможно добавить константу LOCK_NB в качестве битовой маски к любой из вышеуказанных операций, если вы не хотите ждать пока flock() получит блокировку.

Необязательный третий параметр будет установлен в 1, если блокировка будет блокирующей (код ошибки EWOULDBLOCK). (не поддерживается на Windows)

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Список изменений

Версия Описание
5.3.2 Автоматическое снятие блокировки при закрытии было удалено. Снятие блокировки теперь всегда должно осуществляться вручную.

Примеры

$fp = fopen ( "/tmp/lock.txt" , "r+" );

if ( flock ( $fp , LOCK_EX )) < // выполняем эксклюзивную блокировку
ftruncate ( $fp , 0 ); // очищаем файл
fwrite ( $fp , "Что-нибудь пишем сюда\n" );
fflush ( $fp ); // очищаем вывод перед отменой блокировки
flock ( $fp , LOCK_UN ); // отпираем файл
> else echo "Не удалось получить блокировку !" ;
>

<?php
$fp = fopen ( '/tmp/lock.txt' , 'r+' );

/* Включаем параметр LOCK_NB в операции LOCK_EX */
if(! flock ( $fp , LOCK_EX | LOCK_NB )) echo 'Не удалось получить блокировку' ;
exit(- 1 );
>

Примечания

Замечание:

В Windows flock() использует обязательную (mandatory) блокировку вместо консультативной. Обязательная блокировка также поддерживается на Linux и операционных системах, основанных на System V с помощью стандартного механизма, который предоставляет системный вызов fcntl(): т.е. искомый файл должен иметь установленный бит доступа setgid и неустановленный бит группового выполнения. Для корректной работы этой схемы в Linux, файловая система также должна быть смонтирована с опцией mand.

Замечание:

Из-за того, что функции flock() необходим указатель на файл, вам может понадобиться воспользоваться специальным запирающим файлом для того, чтобы ограничить доступ к файлу, который вы намерены очищать, путём его открытия в режиме записи (используя "w" или "w+" в качестве аргумента функции fopen() ).

Замечание:

Может быть использована только на дескрипторах локальных файлов, возвращенных функцией fopen() , или файловых дескрипторах пользовательских потоков, реализующих метод streamWrapper::stream_lock() .

Присвоение другого значения аргументу handle в последующем коде отменит существующую блокировку.

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

flock() не поддерживается на старых файловых системах вроде FAT и ее производных, так что всегда будет возвращать FALSE в этом окружении (это особенно касается пользователей Windows 98).

У меня есть деамон, из которого только один экземпляр должен работать одновременно. Демон является частью более крупного приложения. Я сделал так: open() /tmp/prog.pid с помощью O_CREAT | O_RDWR O_.

Я пытаюсь заблокировать файл, используя функцию flock(), чтобы избежать ошибки перезаписи, но счетчик часто сбрасывается (возможно, для чтения). numi.txt (счетчик) 4895|533753 frame.php (файл PHP) .

У меня проблема с прилавком. Мне нужно подсчитать две переменные, разделенные символом |, но иногда счетчик не увеличивает значение переменной. numberi.txt (счетчик): 5240|593389 Это скрипт PHP: $f.

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

В настоящий момент я работаю над заданием, для которого я должен создать флокирующую систему с разными подклассами, которые ведут себя по-другому. Я работаю с OpenFrameworks и С++. Я новичок в Open.

Я пытаюсь заставить скрипт bash работать исключительно - если другой экземпляр скрипта уже запущен, тогда дождитесь завершения другого экземпляра, прежде чем запускать новый. Я нашел некоторые ссыл.

Я хочу использовать flock чтобы убедиться, что только один экземпляр скрипта работает в любой момент времени. Скелет сценария выглядит так: ME='basename "$0"'; LOCK="/tmp/$.LCK"; exec 8>$LOC.

Есть ли какие-нибудь примеры флокирования, где стая окружает и захватывает цель вместо рыбы, как кормление бешенства, где они налетают, а затем улетают? Я работаю над накладным стрелком, и я хочу, .

Я работаю над обновлением модульных тестов для своей основной библиотеки и натолкнулся на сценарий, связанный с файловыми блокирами (flock), и хотел посмотреть, как другие реализовали эти типы моду.

Я написал простой код для проверки flock(): int main (int argc, char * const argv[]) < int fd1; if (fd1 = open( "file1", O_RDWR | O_CREAT | O_TRUNC) == -1) < perror("Cannot open file 1.\n"); fflush.

Я пишу сценарий многопроцессного bash, который запускает несколько процессов (непрерывно), есть некоторые функции, которые мне нужно запускать, каждая функция имеет аналогичную форму, описанную в m.

У меня есть файл Perl. Пользователь открывает файл, считывает данные и отображает данные в сетке. пользователь редактирует его и сохраняет его обратно в файл. Я пытаюсь использовать стая, чтобы при.

У меня есть функция, которая получает имя файла и объект json для записи в текстовый файл. Объект обновляется и должен полностью заменить текущее содержимое файла. У каждого посетителя сайта есть с.

Я использую bash и flock на centos. Обычно я запускал cd/to/my/dir && python3.6 runcommand.py Но тогда мы добавляем его в cron и не хотим выводить, поэтому добавьте >/dev/null 2>&.

У меня есть веб-сервер, который читает и записывает в файл данных на диске. Я хотел бы, чтобы файл записывался только в одном веб-запросе. Вот примерная программа, которая иллюстрирует мою проблему.

Я использую flock() для inter-process с именем mutexes (т.е. какой-то процесс может решить заблокировать "some_name", который реализуется путем блокировки файла с именем "some_name" в каталоге temp.

Может ли кто-нибудь объяснить мне, почему опция -c существует в flock ? Я не могу найти хорошее описание того, как он отличается от простого указания команды (ов) для выполнения после flock (кроме .

Я хочу прочитать файл в строке, изменить содержимое и записать обработанную строку в файл. Кроме того, еще один запрос на сервер может начаться слишком рано и попытаться написать тот же файл до тог.

Скажем, система неожиданно отключилась из-за отключения электроэнергии. Всегда ли блокируются блокировки, когда система запускается? В Linux стая полагается на fcntl (. ) (дескрипторы файлов). Дру.

Как и в документации библиотеки GNU C, fcntl(F_OFD_SETLK) блокирует запись таблицы открытого файла (обычно получается open() ). Легко понять. Но в

Я выполняю синтаксический анализ csv, и если я отменяю синтаксический анализ (перейдя на другую страницу или обновляя) до вызова функции fclose(), я получаю следующую ошибку, когда возвращаюсь и за.

У меня возникла проблема с использованием функции PHP flock() . Мне нужно написать две разные переменные ( $O и $O ), но часто она не записывает вторую переменную ( $O ), возможно, потому, что файл.

Я хотел бы знать, правильно ли был написан код ниже. Я пытаюсь написать безопасную критическую часть, которая пишет внутри файла, и пытается предвидеть все, что может пойти не так. Есть ли что-нибу.

Я пробую простой алгоритм, который гласит: Файл1: (lock.php) Открыть файл Заблокируйте файл, чтобы ни один другой PHP файл не мог прочитать это Спать Заблокировать замок Файл2: (lockstatus.php) Поп.

запуск этого кода дважды: $fp = @fopen('test.test', "wb"); if (flock($fp, LOCK_NB | LOCK_EX))< @fwrite($fp, $data); echo 'written'; sleep(5); >else < echo 'skipped , ok'; >@flock($fp, LOCK_UN); @fc.

Относительно этого потока: bash flock: exit, если невозможно получить блокировку Буду признателен, если кто-нибудь сможет объяснить мне, что означает "200". Я читал о стае, и кажется, что 200, если.

Я хочу сделать read-modify-write в файл, пока у меня есть эксклюзивная блокировка. Ясно, что я могу использовать flock() и выполнять последовательность fopen, flock, fread, fwrite, flock, fclose, н.

Как проверить файл заблокирован для записи в perl. Я не хочу снова использовать блокировку, и если он не работает, он говорит, что он блокируется другими процессами. flock (FILE, LOCK_EX | LOCK_NB).

Это было в течение последнего часа, и не могу понять, что случилось. Это код, который я использовал для отладки проблемы. Monitor.php $fp = fopen("lock.txt", "r+"); $var=flock($fp, LOCK_EX | LOCK_N.

Я хочу использовать системные блокировки, чтобы избежать условий гонки. Один процесс - программа opencv, сохраняющая захваченное изображение в файл .jpg. Другой процесс - браузер, получающий один и.

Я пытаюсь понять, не блокируя flock и аргумент beblock $fp = fopen('/tmp/lock.txt', 'r+'); if(flock($fp, LOCK_EX | LOCK_NB, $wouldblock)) < echo 'Lock obtained'; >else< echo 'Unable to obtain lock.

Мне нужно иметь метод mutex в PHP, чтобы он сохранял исключительность по переменной. Это то, что потоки с одинаковым значением должны вводить этот метод по одному за раз, тогда как потоки с разными.

Я хочу обновить файл, а другие процессы могут его прочитать. Функция PHP flock() позволяет точно сделать это. Однако, как я вижу, стадо принимает только дескриптор файла. Обычно это происходит из f.

Если я вызову этот скрипт <?php $file = 'file.txt'; $fp = fopen($file,'w'); if (flock($fp, LOCK_EX)) < echo "A"; >if (flock($fp, LOCK_EX)) < echo "B"; >Я ожидал бы, что этот файл никогда не пе.

Я делаю некоторое тестирование с flock и pkill для сценария test.sh который я звоню из cron и я столкнулся с чем-то, чего не понимаю. test.sh запланирован как * * * * * задание в cron. Его очень пр.

Рубрики

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

Как вы можете видеть в приведенном ниже коде, я пытаюсь использовать flock, чтобы предотвратить доступ других клиентов к php (на самом деле несколько пользователей будут получать доступ к этому примерно 10 раз в секунду, каждый), как я нашел здесь. Но это не работает. Мой data.txt становится пустым каждый раз, когда я это делаю.

Это исходный код (который я пытался изменить, чтобы не сделать файл пустым): (он работает так, как я хочу, но у меня есть эта проблема с файлом. )

1 ответ

Я ищу самый простой способ заблокировать файл. Следующий код экспортирует файл .csv из mysql через код php : <?php require_once('connect_db.php'); $fdate = $_POST['fdate']; $tdate = $_POST['tdate']; //Selecting Items based on Date $result = mysql_query(SELECT item_no, qty, discount_price, date.

Я пишу приложение, в котором два процесса должны обновить один и тот же файл file.txt . Есть шанс, что это произойдет одновременно, поэтому я должен реализовать некоторую структуру блокировки. Каждый процесс должен сначала прочитать все file.txt , обработать его, а затем записать модифицированную.

Вы открываете файл только для чтения, а затем пытаетесь записать его в тот же файл. Попробуйте установить параметр fopen в read/write.

Я бы также использовал fwrite() вместо file_put_contents(), так как у вас уже есть указатель на файл, и его повторное открытие, скорее всего, будет заблокировано блокировкой.

Похожие вопросы:

Я хочу прочитать файл в строку, изменить содержимое и записать обратно обработанную строку в файл. Кроме того, еще один запрос к серверу может начаться слишком рано и попытаться записать тот же файл.

Итак, я новичок в PHP, и пример из книги показывает, что когда я пишу в файл в php, я должен использовать flock($fp, LOCK_EX) после открытия файла, а затем flock($fp, LOCK_UN) перед закрытием файла.

Во время файла load -ed/ require -d файл заблокирован от записи? Если нет, то как я могу исключительно заблокировать запись файла во время load / require ? Вероятно, если это так, то следует.

Я ищу самый простой способ заблокировать файл. Следующий код экспортирует файл .csv из mysql через код php : <?php require_once('connect_db.php'); $fdate = $_POST['fdate']; $tdate =.

Я пишу приложение, в котором два процесса должны обновить один и тот же файл file.txt . Есть шанс, что это произойдет одновременно, поэтому я должен реализовать некоторую структуру блокировки.

У меня есть две службы PHP. Тот, который позволяет другим пользователям загружать файл. Другой, который каждый раз получает обновленную версию этого файла. Теперь я реализую его через flock(). Я.

Когда пользователь загружает файл(пользователи могут загружать несколько файлов) exec('nohup php /main/apache2/work/upload/run.php &'); Я использую nohup , так как он должен быть выполнен в.

Цитата из документации PHP flock : Поскольку flock() требует указателя файла, возможно, вам придется использовать специальный блокировка файла для защиты доступа к файлу, который вы собираетесь.

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

У меня возникли проблемы с использованием функции PHP flock() . Мне нужно написать две разные переменные ( $O и $o ), но часто он не записывает вторую переменную ( $o ), возможно, потому, что файл записывается два раза подряд.

$seguimedia , $filename и $offerta установлены правильно.

Является ли PHP flock() хорошим способом избежать подобных проблем?
Какой язык/функции мне нужно использовать?

3 ответа

Цитата из документации PHP flock : Поскольку flock() требует указателя файла, возможно, вам придется использовать специальный блокировка файла для защиты доступа к файлу, который вы собираетесь усечь, открыв его в режиме записи (с аргументом w или w+ для fopen()). Цитата из документации PHP fopen.

Я пытаюсь заблокировать файл с помощью функции flock(), чтобы избежать ошибки перезаписи, но счетчик часто сбрасывается (вероятно, из-за проблемы с чтением). numeri.txt (счетчик) 4895|533753 frame.php (PHP файл) $filename=numeri.txt; $contents=file_get_contents($filename);.

Проблема на самом деле заключается в вызове fopen() .

Вы открываете файл в режиме c+ . Это означает, что указатель файла находится в начале файла, что приведет к тому, что любая запись перезапишет то, что уже есть. Чтобы добавить оскорбление к травме, вы вызываете ftruncate() , усекая файл до 0 байт прямо перед записью - поэтому перед каждой записью вы вручную стираете весь файл. Таким образом, этот код гарантирует , что останется только последняя запись в файл, вручную заботясь о стирании всех остальных.

Вызов fopen() должен быть выполнен с режимом a+ , и оба ftruncate() и rewind() должны идти (последний также имеет эффект размещения указателя файла в начале).

Это не имеет значения, если вы пишете два раза из одного и того же сценария. Но на самом деле это имеет значение, когда вы пытаетесь сделать это из двух разных процессов AND используйте блокировку файлов.

Во всяком случае, ваша функция changevar() фактически усекает файл каждый раз, так что я думаю, что именно поэтому он "seems", что был написан только один var.

Честно говоря, я действительно думаю, что это очень, очень плохая идея читать и писать файл PHP. Если вы смотрите на конфигурации, то используйте ini или json .

Если вы действительно хотите читать и записывать в файл, то это может быть так же просто, как :

Обратите внимание, что папка include содержит этот .htaccess

Чтобы проверить, действительно ли этот lock работает, я использовал pthreads для эмуляции состояния гонки

Есть ли у Erlang межпроцессный (я имею в виду процесс Linux или Windows) механизм блокировки, такой как flock ? Использование будет выглядеть следующим образом : сервер Erlang начинает обслуживать репозиторий и помещает блокировку файла (или что-то еще) если другой процесс OS (другой сервер Erlang.

У меня проблема со счетчиком. Мне нужно посчитать две переменные, разделенные символом|, но иногда счетчик не увеличивает значение переменной. numeri.txt (счетчик): 5240|593389 Это сценарий PHP: $filename=numeri.txt; $fp=fopen($filename,r); if(!flock($fp,LOCK_SH)) < while(true) < usleep(100000);.

Похожие вопросы:

Когда пользователь загружает файл(пользователи могут загружать несколько файлов) exec('nohup php /main/apache2/work/upload/run.php &'); Я использую nohup , так как он должен быть выполнен в.

У меня есть вопрос о том, как работает flock() , особенно в python. У меня есть модуль, который открывает последовательное соединение (через os.open() ). мне нужно сделать этот поток безопасным. Это.

Итак, я работаю с программой, написанной на TCL, которая использует функцию FLOCK для блокировки файлов. Я тестирую его на более новой версии Linux, чем та, на которой он сейчас работает, и.

Цитата из документации PHP flock : Поскольку flock() требует указателя файла, возможно, вам придется использовать специальный блокировка файла для защиты доступа к файлу, который вы собираетесь.

Я пытаюсь заблокировать файл с помощью функции flock(), чтобы избежать ошибки перезаписи, но счетчик часто сбрасывается (вероятно, из-за проблемы с чтением). numeri.txt (счетчик) 4895|533753.

Есть ли у Erlang межпроцессный (я имею в виду процесс Linux или Windows) механизм блокировки, такой как flock ? Использование будет выглядеть следующим образом : сервер Erlang начинает обслуживать.

У меня проблема со счетчиком. Мне нужно посчитать две переменные, разделенные символом|, но иногда счетчик не увеличивает значение переменной. numeri.txt (счетчик): 5240|593389 Это сценарий PHP.

Мне было интересно, можно ли открывать, читать и писать из файла xml с помощью simplexml в блокировке файла PHP. Если это невозможно, как я могу добиться блокировки файла и чтения/записи в него с.

Я пытаюсь понять правильный способ синхронизации чтения/записи файлов с помощью flock в PHP. У меня есть два сценария php. testread.php: <? $fp=fopen(test.txt,r); if (!flock($fp,LOCK_SH)) echo.

flock() -это портативная консультативная функция блокировки файлов PHP. Они явно пропагандируют, что он даже работает под windows: flock() позволяет выполнить простую модель чтения/записи, которая.

Произойдет ли сбой fopen() , если файл существует, но в данный момент заблокирован с помощью LOCK_EX ?

Или мне нужно открыть его, а затем попытаться установить замок, чтобы определить, существует ли он уже?

Я также читал, что flock() будет;

Если да, то правда ли, что этот 'pause' можно обойти с помощью;

1 ответ

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

Я пытаюсь понять правильный способ синхронизации чтения/записи файлов с помощью flock в PHP. У меня есть два сценария php. testread.php: <? $fp=fopen(test.txt,r); if (!flock($fp,LOCK_SH)) echo failed to lock\n; else echo lock ok\n; while(true) sleep(1000); ?> и testwrite.php: <.

flock() на самом деле не мешает вам читать/писать в файл, он только позволяет вам "communicate" идеи блокировки для других сценариев. Вы можете определить, есть ли блокировка файла, используя опубликованный фрагмент кода.

Похожие вопросы:

В руководстве PHP говорится, что вызов flock возвращает TRUE, если блокировка была успешной, и FALSE, если нет. Если файл заблокирован другим процессом, то flock должен дождаться его разблокировки.

У меня есть функция, которая получает имя файла и объект json для записи в текстовый файл. Объект обновляется и должен полностью заменить текущее содержимое файла. У каждого посетителя сайта есть.

У меня есть файл, в который я пишу, но сначала мне нужно заблокировать его (используя flock() ), чтобы предотвратить запись в него любого другого скрипта. Так что у меня есть: $file=fopen($file_p);.

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

Я пытаюсь понять правильный способ синхронизации чтения/записи файлов с помощью flock в PHP. У меня есть два сценария php. testread.php: <? $fp=fopen(test.txt,r); if (!flock($fp,LOCK_SH)) echo.

Я пытаюсь заблокировать файл с помощью функции flock(), чтобы избежать ошибки перезаписи, но счетчик часто сбрасывается (вероятно, из-за проблемы с чтением). numeri.txt (счетчик) 4895|533753.

В PHP, как я могу проверить, если файл уже был заблокирован с flock ? Например, если другой запущенный скрипт вызвал следующее: $fp = fopen('thefile.txt', 'w'); flock($fp, LOCK_EX);

Цитата из документации PHP flock : Поскольку flock() требует указателя файла, возможно, вам придется использовать специальный блокировка файла для защиты доступа к файлу, который вы собираетесь.

У меня есть процесс, который записывает файл с помощью file_put_contents() : file_put_contents ( $file, $data, LOCK_EX ); Я добавил параметр LOCK_EX , чтобы предотвратить одновременную запись.

Читайте также: