页面加载渐进
Page loading progressively
我正在构建一个基本的抓取工具,我在笔记本电脑上 运行 本地,用于从 cms 备份数据。
我编写的基本程序脚本从数据库加载 urls,并且对于每个 url,它都会抓取页面,将内容保存到数据库,然后回显页面成功已保存。
问题是,当它设法一次通过所有 url 时(有时有几百个),脚本的输出会逐渐加载到我的浏览器中。
在 Firefox 中我可以看到部分页面的 echo 语句(表明页面已保存),其余的是分批出现的,在底部 Firefox 指示我 "Transferring data from localhost..."
我很困惑,因为我认为当 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>';
}
?>
我想过使用输出缓冲,但问题是如果脚本失败或超时,我想我根本不会得到任何输出。
某种类型的输出缓冲区是您想要使用的。您也可以将它们附加到字符串并在完成后回显该字符串:
<?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将显示类型更改为"block"以避免逐行显示。
我正在构建一个基本的抓取工具,我在笔记本电脑上 运行 本地,用于从 cms 备份数据。
我编写的基本程序脚本从数据库加载 urls,并且对于每个 url,它都会抓取页面,将内容保存到数据库,然后回显页面成功已保存。
问题是,当它设法一次通过所有 url 时(有时有几百个),脚本的输出会逐渐加载到我的浏览器中。
在 Firefox 中我可以看到部分页面的 echo 语句(表明页面已保存),其余的是分批出现的,在底部 Firefox 指示我 "Transferring data from localhost..."
我很困惑,因为我认为当 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>';
}
?>
我想过使用输出缓冲,但问题是如果脚本失败或超时,我想我根本不会得到任何输出。
某种类型的输出缓冲区是您想要使用的。您也可以将它们附加到字符串并在完成后回显该字符串:
<?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将显示类型更改为"block"以避免逐行显示。