Форум: "Потрепаться";
Текущий архив: 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.48 MB
Время: 0.041 c