Php 优化获取HTTP状态代码的执行时间
我正在开发一个简单的应用程序,它扫描页面上的所有URL,并显示每个URL的http状态代码。当URL超过50时,我得到了一个错误致命错误:超过了30秒的最长执行时间,我所做的是,添加这行代码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 =
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好吧?但如果是新用户,需要做一些工作和学习。