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

时间:2016-04-08 15:38:24

标签: php loops curl

我正在尝试创建一个小型URL抓取工具,供我工作的公司内部使用。

目前,我有一个辅助类,其中发生了所有魔法,还有一个显示结果的index.php。

我想要发生的是提供一个URL以及要离开的代码并获取该网站包含的所有页面URL以便在屏幕上显示。

然而,等到这个foreach循环结束需要一个年龄,因此,我想在循环的每次迭代之后回显链接。

我无法让它发挥作用。我不知道它是链接获取代码,还是我尝试刷新输出缓冲区。我在这里按照这个问题的例子:Echo 'string' while every long loop iteration (flush() not working)

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

// 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。 /叹气 - 说实话,我喜欢编程。

1 个答案:

答案 0 :(得分:-2)

您是否尝试过使用ob_flush()? 这是一个例子。也许这有助于: https://gist.github.com/jtallant/3260398