Если вы попытаетесь получить доступ к файлу через 2 отдельных процесса, он, вероятно, выдаст ошибку, говорящую о невозможности открыть файл или что-то в этом духе, ot может просто вернуть false, как fopen

я пишу данные в файл черезfile_put_contents сFILE_APPEND флаг установлен, и два пользователя отправляют данные одновременно, будут ли они добавляться независимо, или есть вероятность, что одна запись будет перезаписана?

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

Как PHP вообще справляется с этим? Я использую версию 5.2.9. если это имеет значение.

Спасибо Райан

Ответы на вопрос(2)

Решение Вопроса

стадо функция для реализации правильной блокировки (не основанная на трюке while / sleep)

 John Parker13 янв. 2011 г., 17:51
Круто - звучит так, будто это именно то, что нужно после ОП. +1 от меня. :-)
 Ass3mbler13 янв. 2011 г., 17:49
Как сказано в руководстве: «По умолчанию эта функция будет блокироваться до тех пор, пока не будет получена запрошенная блокировка; этим можно управлять (на платформах, отличных от Windows) с помощью параметра LOCK_NB, описанного ниже». Так что, если LOCK_EX немедленно возвращается с ошибкой, это не то же самое поведение
 John Parker13 янв. 2011 г., 17:47
Разве это не то, что делает модификатор LOCK_EX?
 Ass3mbler13 янв. 2011 г., 17:53
@Middaparka большое спасибо!
 John Parker13 янв. 2011 г., 17:54
Вот что такое SO - лучшие ответы должны всплывать наверх. :-)

LOCK_EXвторой скрипт (по времени), который пытается написать, просто вернет false из file_put_contents.

т.е. он не будет сидеть и ждать, пока файл станет доступным для записи.

Таким образом, если потребуется, вам нужно будет самостоятельно программировать это поведение, возможно, пытаясь использовать file_put_contents aограниченное количество раз (например, 3) с использованием подходящего размераспать между каждой попыткой.

 NightHawk13 янв. 2011 г., 17:42
А как насчет вопроса № 1 ... если бы я не использовал блокировку, что бы произошло?
 RobertPitt13 янв. 2011 г., 17:41
Вам нужно будет запуститьwhile иsleep послеfile_exists проверьте, чтобы иметь возможность ждать разблокировки
 John Parker13 янв. 2011 г., 17:43
@RobertPitt - обновлял мой ответ в этом направлении. Хороший вызов для предварительной проверки file_exists. :-)
 John Parker13 янв. 2011 г., 17:44
@ Райан С Трудно сказать. (И, возможно, зависит от операционной системы.) Общая ловушка заключается в том, что файл будет в «неизвестном состоянии». :-) Тем не менее, если вы не пишете достаточно много данных (по продолжительности), это вряд ли произойдет. Однако вы должны написать код для этого случая, как указано выше.
 RobertPitt13 янв. 2011 г., 18:48
Если вы попытаетесь получить доступ к файлу через 2 отдельных процесса, он, вероятно, выдаст ошибку, говорящую о невозможности открыть файл или что-то в этом духе, ot может просто вернуть false, как fopen

Ваш ответ на вопрос