Оптимизировать время выполнения получения кода статуса HTTP

Я работаю над простым приложением, которое сканирует все URL-адреса на странице и отображает код состояния http каждого URL-адреса. Когда 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;

}

0

Решение

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

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

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

1

Другие решения

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

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

Надеюсь, это сработает.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector