проблема такая: есть сайт c большой посещаемостью. мне нужно подсчитывать количество уникальных ip которые зашли на определенную страницу. сначала я написал скрипт, который работает с файлом. чтобы предотвратить ошибки я перед записью и чтением блокировал его функцией flock. но спустя некоторое время почему-то иногда возникали ошибки. например: 123.123.23.22 123.123.23.22 123.123.23.22 123.12 55.883.23.22 123.123.23.22 123.123.23.22 123.123.23.22 123.123.23.22 я понял что функция flock не идеальная для моей задачи и переписал скрипт на работу с мускулем. использовал функцию: Код (Text): $res = mysql_query("select GET_LOCK('my_lock',3)"); она работает без ошибок. но я хочу все-таки отказаться от мускула для этой задачи. Существуют ли какието альтернативы функции flock() ? ps я слышал про какието "файлы-флаги" но информации о них не нашел. спасибо!
flock не врет. Скорее всего ошибка в вашем скрипте. Покажите как лочите файл. На какой файловой системе проблема? Идея проста. Перед работой с файлом пытаемся создать "файл-флаг". Если удалось - работаем с файлом, иначе - другой скрипт еще не закончил работу с этим файлом. PHP: <? $fn = 'my file'; $lockFn = "$fn.lock"; $lockFile = @fopen($lock, 'x'); if ($lock) { // работаем с файлом $fn fclose($lockFile); unlink($lockFn); } else { // файл залочен. отдаем ошибку или спим и пробуем снова } Не сложно представить что будет, если скрипт упадет и не удалит "файл-флаг".
я старый скрипт стер. принцип такой: $fp = fopen("list.txt", 'a'); if ($fp) { flock($fp, LOCK_EX); fputs($fp, "12345"); flock($fp, LOCK_UN); fclose($fp); } файловая система не помню какая (доступ к серверу только из офиса) но стоит ОС сентоз 5. чтоб этого не случилось я в первом скрипте вставлял команды (не помню какие) чтоб скрипт выполнялся до конца не зависимо от того отменил юзер или оборвалось соединение. я протестирую ваш код но боюсь что проблема повторится. чтобы протестировать достаточно сгенерировать трафик в 100 потоков которые будут вызывать этот скрипт
дело в том что весь контент сайта хранится в текстовых файлах и юзать мускул только изза счетсчика помоему не рационально.
копипаст с сорцов книги PHP5 Котеров. PHP: <?php ## Модель процесса-писателя. $file = "file.txt"; // Вначале создаем пустой файл, ЕСЛИ ЕГО ЕЩЕ НЕТ. // Если же файл существует, это его не разрушит. fclose(fopen($file, "a+b")); // Блокируем файл. $f = fopen($file, "r+b") or die("Не могу открыть файл!"); flock($f, LOCK_EX); // ждем, пока мы не станем единственными // . . . // В этой точке мы можем быть уверены, что только эта // программа работает с файлом. // . . . // Все сделано. Снимаем блокировку. fclose($f); На сколько я помню, важна строка 6. Так же, со вторым аргументом fopen 'a' и 'a+' какие-то траблы. Попробуйте.