Оптимизировать время выполнения получения кода статуса HTTP - PullRequest
0 голосов
/ 20 декабря 2018

Я работаю над простым приложением, которое сканирует все URL-адреса на странице и отображает код состояния http каждого URls.Когда URL больше 50, я получил ошибку Неустранимая ошибка: превышено максимальное время выполнения 30 секунд , что я и сделал, добавьте эту строку кода ini_set('max_execution_time', 300);.Это работает, моя проблема в том, что мне нужно подождать до его завершения, затем отобразить весь результат, есть ли способ оптимизировать его или отобразить результат во время сканирования.

Спасибо.

КОД

$html = file_get_contents('http://www.example.com');

    $dom = new DOMDocument();
    @$dom->loadHTML($html);

    // grab all the on the page
    $xpath = new DOMXPath($dom);
    $hrefs = $xpath->evaluate("/html/body//a");

    for ($i = 0; $i < $hrefs->length; $i++) {
           $href = $hrefs->item($i);
           $url = $href->getAttribute('href');
           echo $url.'-'. statusCode($url) .'<br />';
    }

function statusCode($url) { 

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return $httpCode;

}

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

PHP делает http запрос синхронно.Для достижения ожидаемого результата вы должны делать их асинхронно.Я предлагаю вам использовать библиотеку Guzzle .Простой асинхронный запрос выглядит следующим образом:

$request = new \GuzzleHttp\Psr7\Request('GET', 'http://example.com');
$promise = $client->sendAsync($request)->then(function ($response) {
    echo 'I completed! ' . $response->getBody();
});

Таким образом, выполняя более 50 запросов HTTP асинхронно, вы просто получаете результат, когда он завершается.

0 голосов
/ 20 декабря 2018

Да, потому что php нужно завершить процесс для их отображения.Только после того, как весь процесс завершен, php отображает результаты на странице.Как сказал @Romeo Sierra, если он находится в оболочке php, он будет отображаться в процессе.Я думаю, что вы хотите отобразить это на странице, верно?Вы можете сделать это,

  • Получить данные для создания цикла for на странице и создать из него цикл Javascript.
  • В этом цикле создайте вызов ajax для получения данныхрезультат в соответствии с индексом цикла.
  • Ajax success добавляет данные в список или таблицу.
  • Результаты будут отображаться по мере выполнения процесса.

Надеждаэто будет работать.

...