2013-04-07 3 views
2

У меня есть простая страница загрузки, которая получает URL-адрес файла, URL-адрес загружаемого файла .TXT-файла и ссылку перенаправления после загрузки. Все это отправляется через аргументы PHP. Проблема в том, что кто-то рассылал спамеры и загружал счет. Я хочу поставить колпачок на счетчик загрузки, поэтому он будет считать только 3 обращения от каждого адреса, на загружаемый элемент.Как я могу заставить мой загружаемый PHP загрузчик перестать повторять загрузки для IP-адресов?

Мне нужно сделать это только с PHP и без базы данных MySQL. У меня есть аргументы в пользу этого, мой сервер базы данных мусор и ненадежный, я не могу отключить счетчик.

Это мой текущий файл PHP загрузчика. Дополнительная информация, этот файл PHP находится в своей собственной папке по адресу /counter с каталогом /counter/data для каждого файла, загружающего TXT. Эти файлы хранят только одно целое значение.

<? 
    //Retrieve downloadable file URL 
    $c_url = urldecode($_GET['url']); 

    //retrieve redirect page URL 
    $c_page = urldecode($_GET['page']); 

    //Retrieve download counter TXT URL 
    $c_file = "../" . $_GET['file']; 
?> 

<!-- Set up simple styles --> 
<head> 
    <style type="text/css"> 
     body{ 
      background: url("../images/background.png"); 
      color: #ffffff; 
     } 
    </style> 
</head> 

<!-- Creates download file URL in hidden iFrame --> 
<iframe src="<?echo $c_url;?>" id="hiddenFrm" style="display:none;" frameborder="0"></iframe> 

<body> 
<center> 
    <h1>Your download is starting</h1><br> 
    <p>You should be redirected momentarily...<br> 

    <? 
    <br><br> 

    if (file_exists($c_file)) 
    { 
     //Add one value to the counter file 
     file_put_contents($c_file, ((int) file_get_contents($c_file)) + 1); 

     //Set an automatic redirect for the page (Return home) 
     ?> 
     <meta http-equiv="refresh" content="0;url=<?echo $c_page;?>" /> 
     <? 

     //Display information about the download, and alternate exits to the page 
     if ($c_url != "") 
     {?> 
      <b><a href="<?echo $c_url?>">Click here</a> if the download did not start.<br><br> 
      <a href="<?echo $c_page?>">Click here</a> if this page does not close after your download.</b></p> 
     <?} 
     else 
     { 
     ?> 
      <b><a href="<?echo $c_page?>">Click here</a> if you are not redirected automatically</b></p> 
     <? 
     } 
    } 
    else 
    { 
     //In case our counter file is improperly specified 
     echo "<br><br><br>Error, the counter file was not found!"; 
    } 
    ?> 
    </center> 
</body> 

Мой вопрос упрощена: Как я могу хранить IP-адреса людей, которые загружают каждый продукт и предотвратить загрузку счетчика из насчитывающей более 3 загрузки с этого адреса, используя только PHP и нет базы данных?

Помощь очень ценится.

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

+0

Ссылка http://stackoverflow.com/questions/15579620/how-to-block-100-000-individual-ip-addresses может быть это поможет .. –

+0

Время, затрачиваемое на запись быстрого хэша для хранения IPS и подсчета количества звонков и даже эффективного обновления, уже будет менее выгодным, чем исправление этого сервера базы данных «trash and unreliable» и поможет вам избежать головной боли позже. Если ваш веб-сервер может обслуживать сайты, он также должен иметь возможность запускать базу данных для этого –

+0

Вы пробовали кеш? – kdazzle

ответ

2

Без какой-либо базы данных это было бы довольно сложно. Я был бы удивлен, если вы вообще не сможете использовать MySQL, но, возможно, что-то еще проще, чем SQLite. Помимо этого есть два решения, о которых я могу думать: файловая система и файлы cookie.

Проблема с печеньем заключается в том, что они временны, и если у вас есть спам-боты, вы, вероятно, отклоните настройку cookie.

Что вы можете сделать, это сохранить файл

IP download-count last-download-time 

Если файл достаточно мал, вы можете загрузить его в память с file и поиск IP-адреса с preg_grep и обновлять счетчик таким образом.

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

+0

Мне нравится упоминание куки. На самом деле это будет намного лучше, потому что я могу получить хороший точный счет, и нет «я надеюсь, что на этом адресе не более трех машин». К счастью, моя проблема - не боты. Это человеческая работа, с которой я имею дело. Спасибо за помощь, но не могли бы вы объяснить, как я могу настроить систему cookie? –

+1

@BitFracture у вас может быть только одно или два куки. Тот, у которого есть номер загрузки и последнее время загрузки, или тот, у которого есть оба. Проверка и настройка файлов cookie очень проста с помощью механизмов 'setcookie' и' $ _COOKIE' PHP. Вам даже не нужно рассматривать IP-адрес в этом случае –

+0

Это намного проще, чем я думал! Спасибо! –

0

Данные должны храниться где-то, так как PHP всегда «начинается с нуля». Как насчет текстового файла для представления базы данных?

+0

Это именно то, что я ищу. Но я не уверен, как создать эффективную систему чтения/записи для этого. –

1

Я бы использовал Memcache. Вы можете увидеть документы PHP здесь: http://php.net/manual/en/book.memcache.php

Вы можете использовать строку в IP-адрес в качестве ключа, а затем на каждый запрос загрузки, вы пытаетесь сделать ($ ключ) в размере $ memcache-> прибудете. Если этого не существует, вы должны сделать $ memcache-> set ($ key, $ downloadCount). Если ключ существует, вы увеличиваете значение downloadCount.

+0

Это может быть именно то, что я ищу, я проверю его и получаю назад к вам. –

+0

Это похоже на то, что я должен иметь доступ к серверу напрямую. Когда мой сайт размещен, я абсолютно не контролирую серверы (или эту ненадежную базу данных), поэтому мне действительно нужен способ использовать то, с чем пришел PHP. Обычно ли это входит в PHP? Я попробую еще. Похоже, что он использует базу данных. –

+1

У некоторых провайдеров уже есть настройка memcache для вас. Memcache предназначен для минимизации запросов к базе данных, поэтому я почти уверен, что это всего лишь хэш-таблица в памяти. – kdazzle

Смежные вопросы