khapugin пишет:Помогите пожалуйста. Пишу партнёрку, нужен совет.
Нужно записывать IP адреса в файл, а потом брать их из него и сравнивать с тем который у пользователя. В интернете кто то советовал использовать для записи такой код. Будет ли скрипт эффективен в случае если он будет одновременно запущен несколькими пользователей, не приведёт ли это к обнулению файла? Посоветуйте как правильнее написать?
CODE:$lock = fopen("./partner/baseIP.db", "a"); //блокировка файла
if(flock($lock, 1)) {
copy ("./partner/baseIP.db", "./partner/tmpbaseIP.db");
$tmp=fopen("./partner/tmpbaseIP.db","a");
fputs($tmp, $IP."\r\n"); //запись строк
fclose($tmp); //закрытие файлка и переименование его
flock($lock, 3);
fclose($lock);
unlink("./partner/baseIP.db");
rename("./partner/tmpbaseIP.db", "./partner/baseIP.db");
}
Тот вариант, который Вы привели, довольно странный. Не совсем понятно, что должен делать приведённый Вами фрагмент кода, но потенциальные проблемы такого подхода видны сразу. В самом начале идёт проверка на разделяемую (для чтения) блокировку:
CODE: if(flock($lock, 1)) {
А дальше идёт вообще полная ерунда: создание временного файла, запись в него информации и далее, собственно, сама ошибка, когда предпринимается попытка переименовать временный файл в основной. Ппри этом вполне возможно, что процессы чтения со стороны других пользователей не окончились или были запущены новые, и в этом случае Вы получите повреждение или обнуление данных в файле.
khapugin пишет:1. Код действительно безопасный для данных хранящихся в файле?
Предложенный
Александром Михалицыном вариант классический с точки зрения решения проблемы с множественным доступом к файлам из PHP.
khapugin пишет:2. fflush служит для уменьшения нагрузки на сервер?
Читайте описание функции в мануале PHP:
http://php.net/fflush
Эту функцию необходимо запускать, чтобы сбросить в файл все накопившиеся в буфере данные (поскольку непосредственно после записи данные могут в файл и не быть записаны, как правило запись в файл происходит только после накопления определённого объёма информации - это сделано для ускорения работы).
khapugin пишет:3. По вашему проверять заблокирован ли файл не обязательно?
Файл не будет заблокирован только в том случае, если соответствующая функция не поддерживается используемыми операционной или файловой системами. Поскольку с такими системами Вы, скорее всего, работать не будете, то делать проверку на блокировку не имеет смысла. Проверять установку блокировки нужно, если Вы используете блокировку с запретом подвисания, однако такая блокировка далеко не лучший вариант (она использовалась в ExBB FM 1.0 Beta и более старых версиях, поэтому на тех версиях были гораздо более частые проблемы с обнулением).
Ну и напоследок, если к файлам предполагается довольно частое обращение при хранении большого объёма данных, лучше подумать о MySQL