我正在构建一个基本的抓取工具,我在笔记本电脑上本地运行,以便从cms备份数据。
我编写的基本过程脚本从数据库加载url,对于每个url,它会废弃页面,将内容保存到数据库,然后回显页面已成功保存。
问题在于,当它设法同时浏览所有网址时(有时会有几百个网址),脚本的输出会在我的浏览器中逐步加载。
在Firefox中,我可以看到几个页面的部分echo语句(表示页面已保存),其余部分分批进入,底部Firefox表示我"从localhost传输数据...& #34;
我很困惑,因为我认为当PHP脚本运行时,它只会输出并发送一个响应作为单个块,当它完成时,并不是这样,逐步。
也许我忘记了代码中的某些内容?你觉得怎么样?
以下是我的脚本的基本结构:
<?php
try {
// Login into the CMS
// Connect to the DB to get the urls
for ($i = 0; $i < count($urls); $i++) {
// Get data from page
$data = $scraper->getData($urls[$i]);
// Store data from page
if ( $db->save($data) ) {
echo 'Data successfully saved for "' . $url[$i] . '"<br>';
} else {
echo 'Problem when saving data for "' . $url[$i] . '"<br>';
}
}
}
catch (Exception $e) {
echo $e->getMessage() . '<br>';
}
?>
我想过使用输出缓冲,但问题是如果脚本失败或超时,那么我认为我根本不会得到任何输出。
答案 0 :(得分:1)
您想要使用某种类型的输出缓冲区。您也可以将这些附加到字符串并在完成后回显字符串:
<?php
try {
// Login into the CMS
// Connect to the DB to get the urls
$html = '';
for ($i = 0; $i < count($urls); $i++) {
// Get data from page
$data = $scraper->getData($urls[$i]);
// Store data from page
if ( $db->save($data) ) {
$html .= 'Data successfully saved for "' . $url[$i] . '"<br>';
} else {
$html .= 'Problem when saving data for "' . $url[$i] . '"<br>';
}
}
echo $html;
}
catch (Exception $e) {
echo $e->getMessage() . '<br>';
}
?>
即使脚本没有完成加载,只需在PHP中回显即可立即发送文档。这就是为什么你看到它逐行发生的原因。
您还可以查看ob_start()http://php.net/manual/en/function.ob-start.php。这是一种标准的回声方式,但保持输出直到你准备好显示它。
正如@Lithis在评论中提到的,如果你想等到脚本完全停止运行后才显示信息,你可以把它包装在
中<div style="display:none"></div>
然后在document.ready上使用Javascript将显示类型更改为“阻止”以避免它逐行显示。