Jump to content
php.lv forumi

glabāt ip adreses failā


kapec gan ne

Recommended Posts

doma ir tāda... glabāt ip adreses failā kopā ar laiku

$now = time(); - laiks

$ip = ip2long($_SERVER['REMOTE_ADDR']); - ip

viss glabātos apmēram šādi failā (ip|time)

2130706433|1313131313\n

2130706434|1313131314\n

2130706435|1313131315\n

kā labāk nolasīt failu, atrast rindu ar sekojošo ip adresi (ja tada ir) un tad ja laiks $now - time > 3600 tad izdzēst vinu no faila?

Link to comment
Share on other sites

Ja nu tiešām nav db un gribi/vajag failā, un negribi SQLite, tad

Uztaisi failu - .ip-list-locked, kas nozīmēs, ka fails nolockots, nolasi ar php no faila rindiņas kuras nevajag dzēst ( file(), array_filter() ), ieraksti visu atpakaļ (implode(), file_put_contents()), nodzēs .ip-list-locked.

Pirms pievienot jaunu IP jāpārbauda vai nav fails .ip-list-locked, ja ir tad jāpagaida un jāmēģina vēlreiz ( while(), time_nanosleep() )

 

edit: ar mazliet paplašinātākiem teikumiem..

Edited by v3rb0
Link to comment
Share on other sites

man to laiku vajag tam lai redzētu kad tika ierakstīts šis ip

db nevaru izmantot

<?php
function ip_valid($ip = ''){
$d = explode('.', $ip);
for ($x = 0; $x < 4; $x++)
if (!is_numeric($d[$x]) || ($d[$x] < 0) || ($d[$x] > 255))
return false;
return $ip;
}

if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && ip_valid($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
elseif($_SERVER['REMOTE_ADDR']){
$ip = $_SERVER['REMOTE_ADDR'];
}
else{
die('Unknown IP');
}

$log = 'log.txt';
$now = time();
$ip = ip2long($ip);
$tmp = array();
$count = 1;
$in = fopen ("log.txt", "r+");
while ($block = fread($in, 22)) {
$tmp[] = $block;
if($block == "2130706433|1314972657\n")
{
break;
}
$count++;
}
fclose ($in);
?>

piem. atrodu rindu ($count norāda uz rindas numuru).

ar explode atdalu laiku no ip un salīdzinu kā vajag

kā man tagad pāriet uz to rindu? fseek($in, 22*$count) ?

 

EDIT: varētu vispār ar ftruncate notīrīt visu un $tmp array'ā veikt izmaiņas un tad ierakstīt pa jaunam visu...

būs apmēram 8000 rindu tāpec diezvai tas notiks pietiekami atri

Edited by kapec gan ne
Link to comment
Share on other sites

Kā jau tika minēts, izmanto sqlite - datubāze vienā failā.

Ērtai lietošanai iesaku RedBean ORM: http://redbeanphp.com/#/Tutorial

 

Reāls piemērs:

 

<?php
 require 'rb.php';
 R::setup('sqlite:/tmp/dbfile.txt','user','password'); //sqlite

 //Pievienošana
 $entry = R::dispense('ips');
 $entry->ip = $ip;
 $entry->time = time();
 R::store($entry);

 //Drukāšana
 $entries = R::find('ips');
 foreach($entries as $val){
echo "IP: {$val->ip}, Laiks: {$val->time}<br/>";
 }

Edited by briedis
Link to comment
Share on other sites

paldies! nesapratu ko v3rb0 ar rakstito domaja :D iesu burties

 

EDIT: kās var uzrakstīt vienu update query.. neizdodas apdeitot

$entry->exec("update ips set time='$now' where id=1")

 

EDIT: sapratu... no sakuma vajadzeja ieladet to

#

Edited by kapec gan ne
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...