Медленная PHP рутина - PullRequest
       16

Медленная PHP рутина

0 голосов
/ 01 ноября 2019
<pre>

<?php

$newline = "\n";

$hit = 0;
$id = "id";
while ($hit < 10) { 
    $a = rand(0, 255);
    $b = rand(0, 255);
    $c = rand(0, 255);
    $d = rand(0, 255);

    $name = gethostbyaddr("$a.$b.$c.$d");

    if (!strpos($name, $id) === false) {
        print "  " . "<a href=$name>$name</a>" . $newline;
        $hit = $hit + 1;
    }
}

print $newline;
print "Copyright Search Engine" . $newline;
?>

Это маленькая поисковая система для частного предпринимателя, или это было бы, если бы она работала.
Код выполняется, это просто невероятно медленно. Кто-нибудь знает почему.

В случае, если код является значением, а название - NeoSearch, это условия продажи.

Информация
Заказ

10% Promille
Один миллион долларов США

Рекс:.

Ответы [ 2 ]

3 голосов
/ 01 ноября 2019

На многих сайтах обратный DNS не настроен должным образом, поэтому вызов gethostbyaddr() будет медленным, если вы нажмете любой из этих адресов.

Кроме того, вам, вероятно, следует ограничить $a до * 1005. *. Все, что находится за пределами этого диапазона, является многоадресными адресами, не полезно для поисковой системы.

Даже исправляя это, ваш код обязательно будет медленным. Вы ищете адреса, которые разрешают имена с id в них. Подавляющее большинство имен не соответствуют этому шаблону, поэтому вам придется протестировать тысячи имен, прежде чем вы получите желаемую цифру 10.

Это не так, как работают реальные поисковые системы, они не выглядятдо случайных IP-адресов. Они начинают с набора хорошо известных веб-страниц, а затем переходят по ссылкам на всех страницах, чтобы найти другие сайты.

0 голосов
/ 01 ноября 2019

Я не уверен, что вы пытаетесь сделать здесь, но, посмотрев на ваш код и протестировав его локально, я могу вам сказать, что вам приходится искать по множеству хостов, чтобы найти те, которые содержат 'id'в качестве имени хоста для большинства адресов IPv4 используются сами IP-адреса.

Другая проблема, с которой вы сталкиваетесь, заключается в том, что вы выполняете один поток, и это означает, что вы запросите 1 имя хоста IP-адреса, а затем подождитедля ответного ответа.

Если вы хотите увидеть, что делает ваш код, попробуйте запустить приведенный ниже модифицированный код.

<?php

$newline = "\n";

$hit = 0;
$id = "id";
$hosts = 0;
while ($hit < 10) {
    $a = rand(0, 255);
    $b = rand(0, 255);
    $c = rand(0, 255);
    $d = rand(0, 255);

    $ip = "$a.$b.$c.$d";

    $name = gethostbyaddr("$a.$b.$c.$d");
    print($name . $newline);

    if (!strpos($name, $id) === false) {
        print "  " . "<a href=\"$name\">$name</a>" . $newline;
        $hit++;
    }

    $hosts++;
    print($hosts . $newline);
}

print $newline;
print "Copyright Search Engine" . $newline;
?>

Я остановился на более чем 500 хостах, и он все еще продолжалс каждым хозяином, занимающим около секунды каждый. Это означает, что для обхода всех 14+ миллиардов IPv4-адресов уйдет целая вечность, не говоря уже о том, что вы, вероятно, получите повторы с использованием случайного выбора.

Рад помочь вам еще больше в достижении того, что вы пытаетесьделать, если вы сообщите нам

...