Как я могу использовать file_put_contents () с FILE_APPEND | LOCK_EX безопасность?

Я использую:

file_put_contents("peopleList.txt", $person, FILE_APPEND | LOCK_EX);

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

Руководство по PHP говорит, что вернет ложное значение в случае неудачи.

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

Возможно, зацикливание функции в цикле while до тех пор, пока она не вернет false (cringe), или просто не предоставит пользователю (посетителю сайта) какой-то графический интерфейс, запрашивающий повторную попытку?

 hozza19 янв. 2012 г., 16:44
Я использую LOCK_EX и FILE_APPEND вместе, потому что другие сценарии имеют возможность записи в файл, а я не делаю то, что им нужно, пока к нему добавляются данные, и наоборот.
 hozza19 янв. 2012 г., 17:35
Нет, некоторые перезаписывают, а некоторые просто читают.
 Mjh19 янв. 2012 г., 15:48
Apache порождает поток, в котором выполняется процесс PHP. Несколько пользователей = несколько процессов PHP. Процесс, получивший блокировку, является единственным, которому разрешено работать с файлом. Все остальные процессы получат сообщение об ошибке от функции file_put_contents, а file_put_contents, выданные этими пользователями, ничего не запишут в файл. Это означает, что пока один пользователь пишет, другим отказывают, и функция возвращает логическое значение.false.
 Mjh19 янв. 2012 г., 15:59
Причина, по которой существует LOCK_EX - это совсем другая тема. Если вы хотите записать в файл независимо, просто удалите LOCK_EX, так как он вам не нужен, и последним, кто получит доступ к вашему веб-сайту / скрипту, будет тот, кто получит данные, записанные в файл. Кроме того, так как вы делаете добавление - какой смысл вообще блокировать файл? Просто удали это.
 Mjh19 янв. 2012 г., 17:04
Все ли сценарии добавляют данные в файл?

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

flock() блоки дозапрошенная блокировка получена:

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

Так какfile_get_contents() использует это, я предполагаю, что это то же самое. Тем не менее, имейте в виду, что это зависит от операционной системы.

Немного более важно, что вам не нужно блокировать файл в описанном вами сценарии по причинам N.B. уже объяснил. Если вы не используете CLI SAPI, я не могу думать о распространенном сценарии, вы должны беспокоиться о блокировке файлов.

 yannis19 янв. 2012 г., 16:48
Тогда, что сказал @NB. Попробуйте запустить параллельные сценарии и посмотрите, что получится
 Mjh19 янв. 2012 г., 16:01
@ hozza пожалуйста, не нужно угадывать, о чем я думаю, я просто объясняю вещи. Если вы их не понимаете, это другое дело. Использование цикла в сочетании со сном просто - глупо. Вы делаете FILE_APPEND, нет необходимости использовать LOCK_EX вообще. Не копируйте примеры с php.net вслепую, он говорит вам, для чего и для чего он используется.
 hozza19 янв. 2012 г., 16:46
Код, который я предоставил, является примером. Сценарий - это просто множество сценариев, которые могут добавлять, усекать, писать или читать файл. Я хочу, чтобы только одна из этих вещей происходила одновременно, поэтому я хочу заблокировать файл с помощью LOCK_EX при использовании file_put_contents ();

она вернет ошибку, которую вы можете использовать.

if ($result === false) { print "failed to lock"; }

Теперь, если вы хотите несколько раз попытаться получить блокировку, просто используйте цикл, чтобы продолжать попытки записи в файл.

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