Необходимо посчитать количество запросов к xml с одного ip. Мой код:
//вынимаем в массив содержимое лога
$a = file('access.log');
$strs = array();
//вынимаем строки с запросами к xml
foreach ($a as $d) {
if (preg_match('/gcost.htm/s', $d)) {
$strs[] = $d;
//echo '<pre>'; print_r($d); echo '</pre>';
}
}
//вынимаем ip
for($i=0;$i<count($strs);$i++) {
if (preg_match('/\d*\.\d*\.\d*\.\d*/s', $strs[$i], $ips)) {
echo '<pre>'; print_r($ips); echo '</pre>';
}
}
В итоге у меня получается несколько массивов содержащих по одному ip:
Array
(
[0] => 127.0.0.1
)
Array
(
[0] => 127.0.0.5
)
Array
(
[0] => 127.0.0.1
)
Как мне извлечь ip в один массив, чтобы можно было посчитать количество повторений ip в массиве? Или возможно посоветуете другие способы подсчета количества обращений к xml? Спасибо
Спустя 48 минут, 29 секунд (13.05.2012 - 17:49) walerus написал(а):
$a = file('access.log', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
/*.
.
.
.
*/
//вынимаем ip
$trash_ip = array();
for( $i = 0; $i < count( $strs ); $i++ )
{
if (preg_match('/\d*\.\d*\.\d*\.\d*/s', $strs[$i], $ips))
{
$trash_ip[] = $ips[0];
}
}
$clear_ip = array_values( array_unique( $trash_ip ) );
echo "Count - ", $clear_ip , "<hr>\n";
echo "<pre>";
print_r( $clear_ip );
Спустя 15 минут, 27 секунд (13.05.2012 - 18:04) solomon написал(а):
walerus, спасибо. Не совсем то, что нужно получилось. Получился массив с уникальными ip. А мне нужно посчитать количество повторений каждого уникального ip. Или может я что не так делаю...
Вот что сейчас:
Array
(
[0] => 127.0.0.1
[1] => 127.0.0.5
)
Вот что сейчас:
Array
(
[0] => 127.0.0.1
[1] => 127.0.0.5
)
Спустя 12 минут, 17 секунд (13.05.2012 - 18:16) walerus написал(а):
$clear_ip = array_count_values( $trash_ip );
В результате будет массив с IP адресами и количество каждого IP адреса..
зы: Курите мануалы по функциям :rolleyes:
Спустя 2 часа, 21 минута, 42 секунды (13.05.2012 - 20:38) solomon написал(а):
Да, да, спасибо, уже нашел ))
Спустя 54 минуты, 31 секунда (13.05.2012 - 21:33) solomon написал(а):
Теперь проблема видимо в размере лога. Запускаю на реальном логе в котором более 200 тыс строк и код просто не выполняется. Как решить эту проблему?
Спустя 47 минут, 3 секунды (13.05.2012 - 22:20) Игорь_Vasinsky написал(а):
fgets() по байтно читать умеет
Спустя 16 минут, 51 секунда (13.05.2012 - 22:36) solomon написал(а):
решено. увеличил память. все заработало
Спустя 18 минут, 48 секунд (13.05.2012 - 22:55) Игорь_Vasinsky написал(а):
не вариант. лучше оптимизировать и читать кусками в цикле. потом он будет 2000000 строк. а слоты в маме кончаться.
Спустя 2 дня, 11 часов, 25 минут, 32 секунды (16.05.2012 - 10:21) Guest написал(а):
Цитата (Игорь_Vasinsky @ 13.05.2012 - 18:55) |
не вариант. лучше оптимизировать и читать кусками в цикле. потом он будет 2000000 строк. а слоты в маме кончаться. |
Как читать кусками?
Спустя 6 минут, 23 секунды (16.05.2012 - 10:27) Invis1ble написал(а):
fgets() же, Игорь написал