Главная Новые темы Список тем Задать вопрос Поиск  

Форум "Web-мастер" (архив)


Технологии web-програмирования


 #0 Piter © 04.06.05 19:00:04 - 07.06.05 13:09:37

Счетчик на PHP



Написал простенький счетчик на PHP. Вроде все верно, а иногда сбоит:

<?php
   define("PATH_COUNTER_DB", 'data/counter.db.php');

   $ip = getenv('REMOTE_ADDR');
   $ip = stripslashes(preg_replace(array("'­\|'",), array("I",), $ip));

   $fr = file(PATH_COUNTER_DB);
   $fr[1] = trim($fr[1]);
   $fr[2] = trim($fr[2]);
   $count_all = (int)$fr[1];
   $count_unic = (int)$fr[2];
   $ip_unic = TRUE;
   $i = 3;
   while ( $i < count($fr) ) {
       if ( $ip==trim($fr[$i]) ) {
           $ip_unic = FALSE;
           break;
       }
       $i++;
   }
   $count_all++;
   if ( $ip_unic == TRUE ) { $count_unic++; }
   $fw = fopen(PATH_COUNTER_DB, 'w');
   fwrite($fw, $fr[0]);
   fwrite($fw, "$count_all\n");
   fwrite($fw, "$count_unic\n");
   $i = 3;
   while ( $i < count($fr) ) {
       fwrite($fw, $fr[$i]);
       $i++;
   }
   if ( $ip_unic == TRUE ) { fwrite($fw, "$ip\n"); }
   fclose($fw);
   echo "<html><head></head­>
         <body bgcolor=\"#f7f6f4\"><sm­all>Посещений: $count_all<br />Уникальных: $count_unic</small></body> </html>";
?>


Вроде пока следишь - нормально работает... А потом оставишь на некоторое время, так в файле счетчика фигня происходит. Строки куда-то ползут не туда, пробелом куча, в общем, что-то не то.

Я вот думаю - может это быть из-за множественного доступа к файлу? То есть, предыдущая запись в файл еще не отработала, а тут уже новое выполнение скрипта...

Как вообще в PHP с этим борятся? Цитата

 #1 Knight © 04.06.05 19:07:26

А flock() где?
 #2 Piter © 04.06.05 19:21:11

А его всегда надо ставить при работе с файлами?
 #3 Knight © 04.06.05 19:24:17

Тебе же блокировка нужна? Или нет? Если нет - можешь не ставить... но результат ты сам видел  
 #4 Piter © 04.06.05 19:28:25

А если мне нужно дождаться, когда возможно будет писать?

while !flock(...) не будет отнимать слишком много процессорного времени?
 #5 Knight © 04.06.05 19:34:00

Ну он же "простенький", вот если бы был "непростенький", тогда бы оно да...
 #6 Knight © 04.06.05 19:37:32

Если ты этим завесишь сервер... вот посмеёмся  
 #7 Piter © 04.06.05 19:57:01

хм... ты как будто не понимаешь.

Если писать на Delphi:

while true
  begin
    random;
  end;

цикл тоже не "сложный", а толку? Процессор то как его будет исполнять...

Ну ладно, с этим вроде все ок, оказывается flock сам блокирует цикл... но вот что интересно, цитата из документации:

поскольку flock() требует указателя на файл, вам может понадобиться использовать специальную блокировку файла для предотвращения доступа к файлу, который вы намереваетесь усечь в режиме write (с аргументом "w" или "w+" для fopen()).

что делать? Я как видно открываю как раз файл с "W".
 #8 Knight © 04.06.05 21:49:51

>#7 Piter © 04.06.05 18:57:01
> while true do
>  begin
>    random;
>  end;
> цикл тоже не "сложный", а толку? Процессор то как его будет
> исполнять...


А разве многозадачность уже отменили? Странно.... похоже эта инфа проскочила мимо моих ушей...
 #9 Knight © 04.06.05 22:01:22

> поскольку flock() требует указателя на файл, вам может понадобиться
> использовать специальную блокировку файла для предотвращения
> доступа к файлу, который вы намереваетесь усечь в режиме
> write (с аргументом "w" или "w+" для fopen()).


На нормальном русском, а не в машинном переводе, это звучит немного иначе...
Из-за того, что функции flock() необходим указатель на файл, вам может понадобиться воспользоваться специальным запирающим файлом для того, чтобы ограничить доступ к файлу, который вы намерены очищать путём открытыя его в режиме записи (используя "w" или "w+" в качестве аргумента функции fopen()).

Почитай тут
Может ещё чего полезного надыбаешь
 #10 Knight © 04.06.05 22:13:51

Тут лучше...
 #11 Piter © 05.06.05 00:48:41

#8 Knight ©   (04.06.05 21:49)
 разве многозадачность уже отменили? Странно

причем здесь многозадачность?

Ок, вопрос на засыпку. Берем цикл:

while true
 begin
   random;
 end;

угадай какова будет загрузка процессора?
 #12 Knight © 05.06.05 18:19:04

>#11 Piter © 04.06.05 23:48:41  

Ну во-первых поправляю ещё раз... а то скопировал предыдущий, а делфя меня послала...

while true DO
begin
  random;
end;


И даже просто while true DO random;

Во-вторых... ты сам смотрел?
Если проц свободен, то к 100%, если он нужен другой задаче, то загрузка падает и до 50%, и до 20% и даже ниже... Поэтому думаю, что на работающем сервере твоей задаче дадут столько сколько дадут и ни процентом больше

По ссылке 10 ходил?
 #13 Piter © 05.06.05 22:45:22

#12 Knight ©   (05.06.05 18:19)
Поэтому думаю, что на работающем сервере твоей задаче дадут столько сколько дадут и ни процентом больше

да, но например те же хостера считают потраченное ВРЕМЯ ПРОЦЕССОРА... а если процессор не будет занят другими делами - то оно окажется ОЧЕНЬ БОЛЬШИМ...
 #14 Knight © 05.06.05 23:34:08

>#13 Piter © 05.06.05 21:45:22  
> - то оно окажется ОЧЕНЬ БОЛЬШИМ...

Не уточнишь в течении скольки миллисекунд?
 #15 VictorT © 06.06.05 10:11:33

> while !flock(...) не будет отнимать слишком много процессорного
> времени?

в тело цикла вставляешь sleep(1)
 #16 VictorT © 06.06.05 10:26:58

Протормозил, а цикл ведь вообще не нужен.
 #17 Piter © 07.06.05 13:09:37

#14 Knight ©   (05.06.05 23:34)
Не уточнишь в течении скольки миллисекунд?

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

А если это достаточно часто вызываемый счетчик, то это время, повторюсь, будет ОЧЕНЬ БОЛЬШИМ.




  • Тема находится в архиве

    Написать ответ

    Имя: Регистрация HTML?
    smiles смайлики
    Потом перейти в:    
    паутина



      ©  webest.net, 2002-2007  

    top.mail.ru
    » Бесплатный счетчик посещений
    » Рейтинг сайтов