在foreach循环的每次迭代中回显字符串


Echo string on each iteration of a foreach loop

我正试图创建一个小型URL爬网程序,供我工作的公司内部使用。

目前,我有一个助手类,所有的魔术都发生在这个类中,还有一个显示结果的index.php。

我想做的是,给出一个URL,然后代码离开,获取网站包含的所有页面URL,以便在屏幕上显示。

然而,等待foreach循环完成需要很长时间,因此,我希望在循环的每次迭代后回显链接。

我不能让它工作。我不知道是链接获取代码,还是我试图刷新输出缓冲区。我在这里遵循了这个问题中的示例:Echo';字符串';而每次长循环迭代(flush()不工作)

我的代码如下(没有刷新尝试)

// INDEX.PHP
require_once('helper.php');
$helper = new Helper();
flush();
ob_flush();
$found = $helper->crawlSite('http://www.bbc.co.uk', 'http://www.bbc.uk');
echo count($found);

// HELPER.PHP
class Helper
{
    private $checked = [];
    private $foundUrls = [];
    public function __construct()
    {
    }
    public function getHTML($url)
    {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        $html = curl_exec($curl);
        curl_close($curl);
        return $html;
    }
    public function getTagFromHTML($html, $tag)
    {
        $dom = new DOMDocument();
        $dom->loadHTML($html);
        return $dom->getElementsByTagName($tag);
    }
    function crawlSite($url, $initialUrl)
    {
        $html = $this->getHTML($url);
        $links = $this->getTagFromHTML($html, 'a');
        foreach ($links as $link) {
            echo $link->getAttribute('href') . '<br>';
            flush();
            ob_flush();
            if (!in_array($link->getAttribute('href'), $this->checked)) {
                if (strpos($link->getAttribute('href'), $initialUrl) !== FALSE) {
                    $this->foundUrls[] = $link->getAttribute('href');
                    $this->crawlSite($link->getAttribute('href'), $initialUrl);
                } else {
                    $this->foundUrls[] = $initialUrl . $link->getAttribute('href');
                    $this->crawlSite($initialUrl . $link->getAttribute('href'), $initialUrl);
                }
                $this->checked[] = $link->getAttribute('href');
            }else{
                echo "Already Checked <br>";
                flush();
                ob_flush();
            }
        }

        return $this->foundUrls;
    }
}

更新

将代码更新到一个更大的站点以演示该问题。还包括我的一次刷新输出缓冲区的尝试,我还实现了@Dev Jyoti Behera关于移动回声的建议。

更新2

多亏了这个建议(如上所述),我现在可以看到屏幕上打印的实时文本了。然而,我现在遇到了第二个问题,爬网程序似乎忽略了已被检查if语句,它将反复检查并列出相同的URL/叹气——老实说,我喜欢编程。

您尝试过使用ob_flush()吗?下面是一个例子。也许这会有所帮助:https://gist.github.com/jtallant/3260398