Spatie Crawler просто загружается вечно - PullRequest
0 голосов
/ 17 июня 2019

https://github.com/spatie/crawler

У меня есть наблюдатель сканирования, как показано ниже:

<?php

namespace App\Observers;

use DOMDocument;
use GuzzleHttp\Exception\RequestException;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;
use Spatie\Crawler\CrawlObserver;

class PageCrawlObserver extends CrawlObserver
{
    private $pages =[];

    public function willCrawl(UriInterface $uri) {
        echo "Now crawling: " . (string) $uri . PHP_EOL;
    }

    /**
     * Called when the crawler has crawled the given url successfully.
     *
     * @param \Psr\Http\Message\UriInterface $url
     * @param \Psr\Http\Message\ResponseInterface $response
     * @param \Psr\Http\Message\UriInterface|null $foundOnUrl
     */
    public function crawled(UriInterface $url, ResponseInterface $response, ?UriInterface $foundOnUrl = null)
    {
        $path = $url->getPath();
        $doc = new DOMDocument();
        @$doc->loadHTML($response->getBody());
        $title = $doc->getElementsByTagName("title")[0]->nodeValue;

        $this->pages[] = [
            'path'=>$path,
            'title'=> $title
        ];

        dd($this->pages);

        exit;
    }

    /**
     * Called when the crawler had a problem crawling the given url.
     *
     * @param \Psr\Http\Message\UriInterface $url
     * @param \GuzzleHttp\Exception\RequestException $requestException
     * @param \Psr\Http\Message\UriInterface|null $foundOnUrl
     */
    public function crawlFailed(UriInterface $url, RequestException $requestException, ?UriInterface $foundOnUrl = null)
    {
        echo 'failed';
    }

    public function finishedCrawling()
    {
        echo 'crawled ' . count($this->pages) . ' urls' . PHP_EOL;
        foreach ($this->pages as $page){
            echo sprintf("Url  path: %s Page title: %s%s", $page['path'], $page['title'], PHP_EOL);
        }
    }
}

Этот код работает! Но я должен поставить команду exit в конце функции crawled. В противном случае, он просто загружается вечно, пока не получит сообщение об истечении времени ожидания. Я пытался увеличить время выполнения PHP, но он просто загружается, пока не достигнуто это время, и показывает ошибку тайм-аута.

Мне нужно запустить функцию finishedCrawling, поэтому я не хочу ставить функцию exit, как в приведенном выше коде. Есть идеи для этого? Спасибо!

...