У меня был новичок (ближайший подросток), напишите какой-нибудь php-код, чтобы отслеживать некоторые действия на моем веб-сайте. Я не знаком с php, поэтому я немного спрашиваю о совместном доступе к файлам.
Мое родное приложение (в Windows) иногда записывает некоторые данные на мой сайт, удаляя URL-адрес, содержащий мой php-скрипт. Собственное приложение не проверяет возвращенные данные.
$fh = fopen($updateFile, 'a') or die("can't open file"); fwrite($fh, $ip); fwrite($fh, ', '); fwrite($fh, $date); fwrite($fh, ', '); fwrite($fh, implode(', ', $_GET)); fwrite($fh, "\r\n"); fclose($fh);
Это низкий сайт трафика, и данные не являются критическими. Но что произойдет, если два пользователя столкнутся, а два экземпляра сценария попытаются добавить строку в файл? Есть ли скрытая блокировка файлов в php?
Является ли код выше, по крайней мере, безопасным от блокировки и никогда не возвращать управление моему пользователю? Может ли файл быть поврежден? Если у меня есть сценарий выше, удалите файл каждый месяц, что произойдет, если другой экземпляр скрипта находится в середине записи в файл?
Вы должны поместить замок в файл:
<?php $fp = fopen($updateFile, 'w+'); if(flock($fp, LOCK_EX)) { fwrite($fp, 'a'); flock($fp, LOCK_UN); } else { echo 'can\'t lock'; } fclose($fp);
Поскольку это добавление к файлу, лучшим способом было бы агрегировать данные и записать их в файл в один файл fwrite (), при условии, что данные, которые будут записаны, не будут больше, чем буфер файлов. Конечно, вы не всегда знаете размер буфера, поэтому flock (); всегда хороший вариант.