php - 在递归函数中间输出回显消息
问题描述
我正在尝试构建一个简单的爬虫。爬虫工作正常,但我想在递归函数中输出一些消息,以了解$crawling
数组中还有多少页面需要爬取,以及当前正在爬取哪些页面。
下面是相关代码。我在函数中有两个回声,但是在脚本完成之前没有输出任何内容。是否可以在递归函数中沿途输出消息?
$alreadyCrawled = array();
$crawling = array();
function followLinks($url) {
global $alreadyCrawled;
global $crawling;
echo "Now crawling: $url";
$parser = new DomDocumentParser($url);
$linkList = $parser->getLinks();
// Get the links
for($i = 0; $linkList->length > $i; $i++) {
$href = $linkList->item($i)->getAttribute("href");
// Convert relative links to absolute links
if(strpos($href, "#") !== false) {
continue;
} else if(substr($href, 0, 11) === "javascript:") {
continue;
} else if(substr($href, 0, 6) === "mailto") {
continue;
}
$href = createLink($href, $url);
// Crawl page
if(!in_array($href, $alreadyCrawled)) {
$alreadyCrawled[] = $href;
$crawling[] = $href;
getDetails($href);
}
}
array_shift($crawling); // Remove page just crawled
echo "Finished crawling: $url, Pages left to crawl: " . count($crawling);
// Crawl until array is empty
foreach ($crawling as $site) {
followLinks($site);
}
}
解决方案
在查看了 nandal 的答案和 CBroe 指向可能重复项的链接后,我最终得到了下面的函数。在每个回声之后调用它就可以了。
function flush_buffers(){
ob_end_flush();
ob_flush();
flush();
ob_start();
}
推荐阅读
- node.js - 使用带有 cloudinary api 的 multer 库
- c - 当我声明一个矩阵时,为什么这个数组会出现问题?
- html - 如何将变量放入语句 [Angular,TypeScript]
- excel - VBA SumIfs 太慢
- python - HTTPError:HTTP 错误 400:翻译 TextBlob 的错误请求
- tensorflow - I'm getting this error : 'AttributeError: module 'keras.optimizers' has no attribute 'Adam''
- .net - 如何在 C# 中读取未知类型的 ComosDB 更改提要?
- bash - ps -x|grep 在命令行上有效,但在 shell 脚本中无效,为什么?
- python - Django 静态 URL 不适用于带有 Digital Ocean CDN 的 {% static %}
- python - 如何使用命名列制作空的 Pandas DataFrame,然后添加一行?