页面加载渐进

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"以避免逐行显示。