页面加载逐步

时间:2015-05-15 14:06:15

标签: php for-loop timeout

我正在构建一个基本的抓取工具,我在笔记本电脑上本地运行,以便从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>';
}

?>

我想过使用输出缓冲,但问题是如果脚本失败或超时,那么我认为我根本不会得到任何输出。

1 个答案:

答案 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将显示类型更改为“阻止”以避免它逐行显示。