Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

Счетчик на PHP   Найти похожие ветки 

 
Piter ©   (2005-06-04 17:34) [0]

Написал простенький счетчик на 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\"><small>Посещений: $count_all<br />Уникальных: $count_unic</small></body> </html>";
?>


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

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

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


 
Anatoly Podgoretsky ©   (2005-06-04 17:45) [1]

А где блокировка?


 
Piter ©   (2005-06-04 20:13) [2]

А как ее делать?


 
ArMellon ©   (2005-06-04 20:18) [3]


flock($fw,LOCK_EX);//Блокировать
flock($fw,LOCK_UN);//Разблокировать


 
the_tramway_driver   (2005-06-04 20:19) [4]

Есть книжка одна интересная про ПХП. Котерова. Где-то тут была: http://pv.bstu.ru/?topic=web , там написано.
_______________________
И чего это я??????


 
Piter ©   (2005-06-04 20:47) [5]

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

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


 
ArMellon ©   (2005-06-04 20:55) [6]

Нафига тебе ждать?
он сам дождется
flock
(PHP 3>= 3.0.7, PHP 4)

flock - переносимое "совещательное/advisory" блокирование файлов.

Описание
bool flock (int fp, int operation [, int &wouldblock])

PHP поддерживает перенос блокированных файлов advisory-способом (что означает, что все программы, выполняющие доступ, должны использовать тот же способ блокирования, или блокировка работать не будет).

flock() работает с fp, который обязан быть открытым указателем на файл.
operation имеет одно из следующих значений:

Для получения shared-блокировки (reader) установите в operation значение LOCK_SH (установите 1 в версиях до PHP 4.0.1).

Для получения исключительной/exclusive блокировки (writer) установите в operation значение LOCK_EX (установите 2 в версиях до PHP 4.0.1).

Для освобождения блокировки (shared или exclusive) установите в operation значение LOCK_UN (3 в версиях до PHP 4.0.1).

Если вы не хотите, чтобы flock() блокировала, добавьте LOCK_NB (4 в версиях до PHP 4.0.1) в operation.

flock() позволяет реализовать простую модель reader/writer, которая может использоваться на практически любой платформе (включая большинство клонов Unix и даже Windows). Необязательный третий аргумент устанавливается в TRUE, если блокировка возможна (EWOULDBLOCK errno condition).

flock() возвращает TRUE при успехе и FALSE при ошибке (например, когда блокировка не может быть получена).

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

Предупреждение!
flock() не будет работать в NFS и многих других сетевых файловых системах. См. в вашей документации по ОС детальную информацию.

В некоторых ОС flock() реализуется на уровне процесса. При использовании API многопоточного сервера типа ISAPI вы не сможете рассчитывать на flock() для защиты файлов относительно других PHP-скриптов, запущенных в параллельных потоках в том же самом экземпляре сервера!

flock() не поддерживается на старинных файловых системах вроде FAT и их клонах и, следовательно, всегда возвращает FALSE в такой среде (это также верно для пользователей Windows 98).



 
ArMellon ©   (2005-06-04 20:58) [7]

flock
(PHP 3>= 3.0.7, PHP 4 , PHP 5)

flock -- Portable advisory file locking
Description
bool flock ( resource handle, int operation [, int &wouldblock])

PHP supports a portable way of locking complete files in an advisory way (which means all accessing programs have to use the same way of locking or it will not work).

Замечание: flock() is mandatory under Windows.

flock() operates on handle which must be an open file pointer. operation is one of the following values:

To acquire a shared lock (reader), set operation to LOCK_SH (set to 1 prior to PHP 4.0.1).

To acquire an exclusive lock (writer), set operation to LOCK_EX (set to 2 prior to PHP 4.0.1).

To release a lock (shared or exclusive), set operation to LOCK_UN (set to 3 prior to PHP 4.0.1).

If you don"t want flock() to block while locking, add LOCK_NB (4 prior to PHP 4.0.1) to operation.

flock() allows you to perform a simple reader/writer model which can be used on virtually every platform (including most Unix derivatives and even Windows). The optional third argument is set to TRUE if the lock would block (EWOULDBLOCK errno condition)

Возвращает TRUE в случае успешного завершения, FALSE в случае возникновения ошибки.

Пример 1. flock() example

<?php

$fp = fopen("/tmp/lock.txt", "w+");

if (flock($fp, LOCK_EX)) { // do an exclusive lock
   fwrite($fp, "Write something here\n");
   flock($fp, LOCK_UN); // release the lock
} else {
   echo "Couldn"t lock the file !";
}

fclose($fp);

?>  




 
Piter ©   (2005-06-04 21:11) [8]

Меня вот что интересует:

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

что делать? Я как видно открываю как раз файл с "W".


 
ArMellon ©   (2005-06-04 21:45) [9]


Пример 1. flock() example

<?php

$fp = fopen("/tmp/lock.txt", "w+");

if (flock($fp, LOCK_EX)) { // do an exclusive lock
  fwrite($fp, "Write something here\n");
  flock($fp, LOCK_UN); // release the lock
} else {
  echo "Couldn"t lock the file !";
}

fclose($fp);

?>  


 
Knight ©   (2005-06-04 23:41) [10]


> Piter ©   (04.06.05 17:34)

Ты не туда хады, ты суда хады... http://airbase.ru/computers/php/flock/
:)))


 
Piter ©   (2005-06-05 01:55) [11]

ArMellon ©   (04.06.05 21:45) [9]

ты не понял. Перечитай [8]



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.043 c
6-1112032939
Nes
2005-03-28 22:02
2005.06.29
* HTTP Tunneling? Бред или...


4-1115255968
nickmas
2005-05-05 05:19
2005.06.29
Как перехватить сообщение об ошибке...


3-1116565491
Peter_cc
2005-05-20 09:04
2005.06.29
тип поля DATE


14-1117957406
lookin
2005-06-05 11:43
2005.06.29
Новые поступления от OKA-tuning


14-1117619301
acs
2005-06-01 13:48
2005.06.29
Новый продукт компании ACS inc.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский