Отправляет email-рассылки с помощью сервиса Sendsay

PHP понемножку

  Все выпуски  

PHP понемножку. Функции для ограничения числа подключений к файлам


Основной  код для ограничения числа скачиваемых файлов.

Одним из способов организовать возможность сохранения данных для нескольких запускаемых копий одного PHP-скрипта, являются файлы, уникальные для каждого IP-адреса и каждого потока закачки с него. Разместим в папке нашего скрипта подпапку с названием lock и при подключении каждого IP-адреса будем создавать в ней папки с именем соответствующим этому IP. Для каждого потока закачки файлов мы будем создавать в этих папках файлы нулевого размера. Т.е. если с адреса 192.168.0.1 у нас качается два файла, то в соответствующей папке (lock/192.168.0.1) у нас будут находится два файла 1 и 2.

Код требуемых нам функций thread_number(), thread_start() и thread_stop() будет следующим.

Функция thread_number()

 

// Эта функция возвращает номер текущего потока для данного IP-адреса
function thread_number(){
// Задаем имя папки для размещения файлов отмечающих каждый поток
// В папке lock каждому IP-адресу будет соответствовать папка с именем равным IP
  $lock_dir =  './lock/' . $_SERVER['REMOTE_ADDR'];
// Очищаем кэш файловых операций
  clearstatcache();
// Если папка не существует (закачка с данного IP еще не производилась), то создаем ее
// с правами на полный доступ
  if(!is_dir($lock_dir)) {
    mkdir($lock_dir);
        chmod($lock_dir, 0777);
  }
// Получаем список файлов в папке
  $files = scandir($lock_dir);
// Поскольку даже в пустой папке присутствуют два системных имени:
//  "." - текущая папка и ".." - родительская папка, то удаляем их из списка
  array_shift($files);
  array_shift($files);
// Возвращаем количество файлов. Это и будет номер текущего потока запущенного с IP-адреса
  return count($files);
}

Функция thread_start()

 

// Эта функция, запускаемая при начале скрипта, будет отмечать каждый поток, для каждого IP-адреса
function thread_start(){
// Задаём имя файла для отметки текущего потока.
// Он будет на единицу больше числа возвращаемого функцией thread_number()
  $lock_file =  './lock/' . $_SERVER['REMOTE_ADDR'] .'/'. (thread_number()+1);
// Эти две функции создадут нам файл нулевого размера.
  $f = fopen($lock_file, 'w');
  fclose($f);
// Выставляем права на файл для его беспрепятственного удаления в конце работы скрипта
  chmod($lock_file, 0777);
}

Функция thread_stop()

 

// Эта функция удаляет файл отмечающий данный поток для данного IP-адреса или всю папку
function thread_stop(){
// Задаем имя папк, где размещены файлы отмечающих каждый поток для текущего IP.
  $lock_dir =  './lock/' . $_SERVER['REMOTE_ADDR'];
// Получаем номер текущего скрипта. В силу того, что для любого его запуска создается свой файл
// эта величина всегда будет больше единицы
  $number = thread_number();
  if($number==1) {
// При завершении единственного скрипта, запущенного с данного IP будут удалены и папка и файл
    unlink($lock_dir .'/'. $number);
    rmdir($lock_dir);
  }
  elseif($number>1) {
// Если кроме нашего скрипты запущены другие его копии с этого же IP, удаляем только файл
    unlink($lock_dir .'/'. $number);
  }
  else{
// Данная ситуация невозможна при корректной работе скрипта, но все равно отследим ее.
// Если в папке нет ни одного файла, просто удаляем папку.
    rmdir($lock_dir);
  }
}

 

Далее рассмотрим способ сохранения информации о текущих закачках в базе данных MySQL.

В избранное