Я работаю над простым приложением, которое сканирует все 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;
}
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 асинхронно, вы просто получите результат, когда он завершится.
Да потому что php нужно завершить процесс их отображения. Только после того, как весь процесс завершен, php отображает результаты на странице. Как сказал @Romeo Sierra, если он находится в оболочке php, он будет отображаться в процессе.
Я думаю, что вы хотите отобразить это на странице, верно?
Вы можете сделать это,
Надеюсь, это сработает.