|
Perl для веб-мастераТеперь точность показаний счетчика стала немного выше. Но как он поведет себя, если на нашу страницу зайдет одновременно два посетителя? Одновременно два процесса попытаются произвести запись в файл с показаниями счетчика, в результате чего все данные файла могут быть потеряны. Чтобы этого не допустить, необходимо запретить одновременный доступ к файлу нескольких процессов. Сделать это можно с помощью функции flock, которая позволяет заблокировать файл, связанный с дескриптором, от доступа из других скриптов. Немного изменим процесс работы с файлом count.txt: open (COUNTFILE, "+<$namefile"); flock (COUNTFILE,2); $count =readline(*COUNTFILE); chomp ($count); $count=$count + 1; seek (COUNTFILE,0,0); truncate(COUNTFILE,0); print COUNTFILE "$count"; close(COUNTFILE); Теперь поясненим наши действия. 1) Открываем файл для чтения и записи: open (COUNTFILE, "+<$namefile"); 2) Блокируем файл от доступа из других одновременно запущенных процессов выполнения скрипта flock (COUNTFILE,2); 3) Считываем значение счетчика из файла $count =readline(*COUNTFILE); 4) Удаляем символ конца строки (если он случайно неизвестно откуда появился) chomp ($count); 5) Увеличиваем значение счетчика $count=$count + 1; 6) Перемещаем указатель позиции в файле на его начало seek (COUNTFILE,0,0); 7) Усекаем длину файла до текущей позиции (т. е. до начала файла, куда мы передвинули этот указатель предыдущей строкой) truncate(COUNTFILE,0); 8) Записываем в файл новое значение счетчика print COUNTFILE "$count"; 9) Закрываем файл, одновременно снимая с него блокировку close(COUNTFILE); Итак, весь скрипт теперь будет иметь следующий вид: #!/usr/bin/perl $namefile="/home2/your_domen/public_html/mystat/count.txt"; $nameipfile="/home2/your_domen/public_html/mystat/ip.txt"; $ip=$ENV{"REMOTE_ADDR"}; open (IPFILE, "$nameipfile"); $ipold = close(IPFILE); chomp ($ipold); if ($ipold eq $ip) { exit; } open (IPFILE, "$nameipfile"); print IPFILE "$ip"; close(IPFILE); open (COUNTFILE, "+<$namefile"); flock (COUNTFILE,2); $count =readline(*COUNTFILE); chomp ($count); $count=$count + 1; seek (COUNTFILE,0,0); truncate(COUNTFILE,0); print COUNTFILE "$count"; close(COUNTFILE); print "Content-Type: text/htmlnn"; print "$count"; exit; Продолжение статьи: ч.1 Продолжение статьи: ч.2 Продолжение статьи: ч.3 Продолжение статьи: ч.4 Продолжение статьи: ч.5 Другие статьи по теме: - повышение индивидуального мастерства дизайнера- аутентификация пользователей через веб-интерфейс - введение в perl - Perl для чайников от ns - практическое применение perl-скриптов |
|
2006-2024 © SMTI.RU Главная страница | Связаться с нами |