Php 优化获取HTTP状态代码的执行时间

Php 优化获取HTTP状态代码的执行时间,php,http-status-codes,execution-time,Php,Http Status Codes,Execution Time,我正在开发一个简单的应用程序,它扫描页面上的所有URL,并显示每个URL的http状态代码。当URL超过50时,我得到了一个错误致命错误:超过了30秒的最长执行时间,我所做的是,添加这行代码ini\u集('max\u execution\u time',300)。它工作,我的问题是我必须等到它完成,然后显示整个结果,有没有办法使它优化或显示结果,而它是扫描 谢谢 代码 $html = file_get_contents('http://www.example.com'); $dom =

我正在开发一个简单的应用程序,它扫描页面上的所有URL,并显示每个URL的http状态代码。当URL超过50时,我得到了一个错误致命错误:超过了30秒的最长执行时间,我所做的是,添加这行代码
ini\u集('max\u execution\u 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;

}
$html=file\u get\u contents('http://www.example.com');
$dom=新的DOMDocument();
@$dom->loadHTML($html);
//抓取页面上的所有内容
$xpath=newdomxpath($dom);
$hrefs=$xpath->evaluate(“/html/body//a”);
对于($i=0;$i<$hrefs->length;$i++){
$href=$hrefs->item($i);
$url=$href->getAttribute('href');
echo$url.'-'.statusCode($url)。“
”; } 函数状态代码($url){ $ch=curl\u init($url); curl_setopt($ch,CURLOPT_NOBODY,true); curl_exec($ch); $httpCode=curl\u getinfo($ch,CURLINFO\u HTTP\u代码); 卷曲关闭($ch); 返回$httpCode; }
是,因为php需要结束显示过程。只有在所有过程完成后,php才会在页面中显示结果。正如@Romeo Sierra所说的,如果它在php shell中,它将随着进程显示。 我想你想把它显示在页面上,对吗? 你可以这样做

  • 获取数据以在页面中创建for循环,并从中创建Javascript循环
  • 在该循环中,创建一个ajax调用,以根据循环的索引获得一个数据结果
  • Ajax成功将数据追加到列表或表中
  • 结果将随流程一起显示

希望这能起作用。

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外壳?如果是这样的话,您应该可以随时看到结果……这里需要异步CURL实现……请检查此项以供参考@RomeoSierra,就在页面上,在检查http代码时需要时间来查看结果。在这种情况下,您没有什么可以做的。php的执行在php引擎中进行,在完成所有操作后,结果将返回到web服务器。因此,服务器将等待结果。@user123,如果某个答案有帮助,请将其标记为正确。您不能只在循环内调用js代码,要异步执行,您至少需要node.js实例。@BSeitkazin您没有明白我说的。我说的是将数据获取到页面以创建js循环,并在该循环中创建ajax。您只需在页面中获取
$hrefs->length
,即可在浏览器的UI线程中创建js loop.JavaScript,任何长时间运行的进程都会锁定UI,使其无响应。此外,JavaScript的执行时间有一个上限,浏览器会询问用户是否继续执行。所有这些都是非常糟糕的用户体验。用户无法判断是否一切正常。此外,对于连接速度较慢的用户,效果会更糟。是的@BSeitkazin这是100%正确的。我只是用一个简单的方法来帮你。因为user123提到“我正在开发一个简单的应用程序,可以扫描页面上的所有URL,并显示每个URL的http状态代码”,所以从长远来看,这是一种更好的方式。Node比Guzzle好吧?但如果是新用户,需要做一些工作和学习。