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

PHP понемножку

  Все выпуски  

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


Окончание статьи по закачке файлов с контролем количества потоков

Сохранение данных в MySQL

Второй доступный способ сохранения данных о количестве закачек – это сохранение информации в базе данных. Для каждого IP-адреса мыбудем создавать отдельную запись со счетчиком потоков. Код при этом оказывается проще, чем в предыдущем случае – мы всего лишь выполняем простые SQL-запросы.

Создадим требуемую таблицу:

 

CREATE TABLE threads (
  `ip` int(10) unsigned NOT NULL,
  `count` smallint(5) unsigned NOT NULL,
  PRIMARY KEY  (`ip`)
)

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

Функция thread_number()

 

// Эта функция возвращает номер текущего потока для данного IP-адреса
function thread_number(){
// Выполняем запрос для записи с ключом
// соответствующим числовому значению IP-адреса
  $res = mysql_query("SELECT `count` FROM `threads` WHERE `ip` = ". ip2long($_SERVER['REMOTE_ADDR']));
// Если запись присутствует,
// то возвращаем указанное в ней число потоков
  if ($line = mysql_fetch_array($res, MYSQL_ASSOC)) return (int) $line['count'];
// Если записи нет возвращаем ноль
  return 0;
}

Функция thread_start()

 

// Эта функция, запускаемая при начале скрипта, будет отмечать каждый поток, для каждого IP-адреса
function thread_start(){
//  Получаем номер очередного потока
  if(thread_number() == 0) {
// Если потоков с этого IP не зарегистрировано,
// то создаём для него запись
    mysql_query("INSERT INTO `threads` (`ip`, `count`) VALUES (
"
. ip2long($_SERVER['REMOTE_ADDR']) .", 1)");
  } else {
// Если с данного IP уже скачиваются потоки,
// увеличиваем счётчик на единицу
    mysql_query("UPDATE `threads` SET `count` = `count` + 1 WHERE `ip` = ". ip2long($_SERVER['REMOTE_ADDR']);
  }
}

Функция thread_stop()

 

// Эта функция отмечает окончание данного потока для данного IP-адреса
function thread_stop(){
  $number = thread_number();
  if($number == 1) {
// Если остался один поток,
// то запись из таблицы удаляется
    mysql_query("DELETE FROM `threads` WHERE `ip` = ". ip2long($_SERVER['REMOTE_ADDR']));
  }
  else {
// Если все еще есть активные потоки,
// то счетчик уменьшается на единицу
    mysql_query("UPDATE `threads` SET `count` = `count` - 1 WHERE `ip` = ". ip2long($_SERVER['REMOTE_ADDR']));
  }
}



В избранное