Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возвращаясь к текстовым счетчикам ... текстовые файлы в отдельной папке 
V
    Опции темы
клоп
Дата 17.4.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 28.2.2006
Где: г. Череповец

Репутация: нет
Всего: нет



Доброго дня!
Переписал текстовый счетчик для подсчета просмотров статей на сайте. Раньше все счетчики хранились в одном файле, но при большой нагрузке возникали моменты что одновременно его открывали несколько юзеров и счетчик попросту обнулялся (блокировка не спасала). Теперь к каждой статье создается свой счетчик с именем id статьи. Вот его примитивный код.

Код

<?php

$log="counter_id.dat";    //название файла по id статьи

if(file_exists($log)){

    $open=@fopen($log,'r+');
    $counter=@fread($open,filesize($log));
    @fclose($open);
    $counter++;
    $write=fopen($log,'w');
    flock($write, LOCK_EX);
    fputs($write,$counter);
    flock($write, LOCK_UN);
    fclose($write);

}else{
    
    $open=@fopen("$log",'w');
    flock($open, LOCK_EX);
    $counter = 1;
    fputs($open,$counter);
    flock($open, LOCK_UN);
    fclose($open);

}
echo $counter;

?>


Это не удобно, потому как текстовые файлы создаются в той же директории что и сами скрипты. Решил сделать так чтобы все файлы создавались в отдельной папке (в моем случае dir). Но не чего не работает smile . Опыта работы с папками очень мало, решил обратиться за помощью к вам. Вот мой кривой код:

Код

<?php
$log="counter_id.dat";    //название файла по id статьи


if ($directory = opendir('./dir/')) {

   while (false !== ($file = readdir($directory))) {

 if(basename("$file" === "$log")){
   
    $open=@fopen($log,'r+');
    $counter=@fread($open,filesize($log));
    @fclose($open);
    $counter++;
    $write=fopen($log,'w');
    flock($write, LOCK_EX);
    fputs($write,$counter);
    flock($write, LOCK_UN);
    fclose($write);

}


else{

    
    $open=@fopen("$log",'w');
    flock($open, LOCK_EX);
    $counter = 1;
    fputs($open,$counter);
    flock($open, LOCK_UN);
    fclose($open);

}
   
       

  
}

   closedir($directory);
}
?> 
 
--------------------
Всякая чепуха посещает голову, когда она пуста ....
PM MAIL WWW   Вверх
-=Ustas=-
Дата 17.4.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Может так попробуешь:
Код

<?php

$log  = "counter_id.dat";    //название файла по id статьи
$dir  = "dir";

$fileLog = realpath($dir)."/".$log;

if ($directory = opendir($dir)) {
    while (false !== ($file = readdir($directory))) {
        if ($file == $log)) {
            $open = @fopen($fileLog, 'r+');
            $counter = @fread($open, filesize($fileLog));
            @fclose($open);
            $counter++;
            $write = fopen($fileLog, 'w');
            flock($write, LOCK_EX);
            fputs($write, $counter);
            flock($write, LOCK_UN);
            fclose($write);
        } else {
            $open = @fopen($fileLog, 'w');
            flock($open, LOCK_EX);
            $counter = 1;
            fputs($open,$counter);
            flock($open, LOCK_UN);
            fclose($open);
        }
    }
    closedir($directory);
}

?>


Вот только я непойму, для чего тебе циклом пробегаться по директории, если у тебя имя файла указывается явно. Тогда проще сделать таким образом:
Код

<?php

$log  = "counter_id.dat";    //название файла по id статьи
$dir  = "dir";

$fileLog = realpath($dir)."/".$log;

if (file_exists($fileLog)) {
    $open = @fopen($fileLog, 'r+');
    $counter = @fread($open, filesize($fileLog));
    @fclose($open);
    $counter++;
    $write = fopen($fileLog, 'w');
    flock($write, LOCK_EX);
    fputs($write, $counter);
    flock($write, LOCK_UN);
    fclose($write);
} else {
    $open = @fopen($fileLog, 'w');
    flock($open, LOCK_EX);
    $counter = 1;
    fputs($open,$counter);
    flock($open, LOCK_UN);
    fclose($open);
}

?>
 


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
клоп
Дата 17.4.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 28.2.2006
Где: г. Череповец

Репутация: нет
Всего: нет



Ustas cпасибо!!!
Я уже понял что цикл это излишне и начал примерно также как ты написал. Вот сырой код:

Код

<?php
$log="counter_id.dat";    //название файла по id статьи


if(file_exists("./dir/".$log)){ 
 
   
    $open=@fopen("./dir/".$log,'r+');
    $counter=@fread($open,filesize($log));
    @fclose($open);
    $counter++;
    $write=fopen("./dir/".$log,'w');
    flock($write, LOCK_EX);
    fputs($write,$counter);
    flock($write, LOCK_UN);
    fclose($write);

}


else{

    
    $open=@fopen("./dir/".$log,'w');
    flock($open, LOCK_EX);
    $counter = 1;
    fputs($open,$counter);
    flock($open, LOCK_UN);
    fclose($open);       

   }

echo $counter;
?> 
 
--------------------
Всякая чепуха посещает голову, когда она пуста ....
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.