Как мне сделать «если домен не существует»? - PullRequest
1 голос
/ 07 марта 2020

Итак, у меня есть приложение Laravel для преобразования страниц из URL в pdf. Я использую file_get_contents, чтобы получить страницу в строке, чтобы преобразовать ее в PDF. У меня возникли некоторые проблемы с вводом, я использую «filter_var», чтобы проверить действительный URL-адрес, и проверить, если он начинается с http, но у меня есть ошибки, когда его допустимый домен, но он не загружается или когда он занимает много времени .

if ((substr( $url, 0, 8 ) === 'https://') || (substr( $url, 0, 7 ) === 'http://'))
{
    if (filter_var($url, FILTER_VALIDATE_URL))
    {
        $content = file_get_contents($url);
        $parse = parse_url($url);
    }
    else
    {
        session()->flash('danger', 'Imposible to load the url');
        return view('welcome');
    }
}
else
{
    session()->flash('danger', 'You must set a proper url type value');
    return view('welcome');
}

Как я могу проверить, загружается ли долго или это рабочий домен? Или любая другая идея? Любой совет приветствуется.

1 Ответ

2 голосов
/ 07 марта 2020

Мне посоветовали использовать curl () вместо file_get_contents (), потому что curl позволяет намного лучше обрабатывать запросы и ошибки. Итак, я нашел здесь замечательную функцию ( Как получить содержимое страницы с помощью cURL? ).

protected function get_web_page( $url )
{
    /**
    * Send a GET requst using cURL
    * @param string $url to request
    * @param array $user_agent values to send
    * @param array $options for cURL
    * @return string
    */
    $user_agent='Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0';

    $options = array(

        CURLOPT_CUSTOMREQUEST  =>"GET",        //set request type post or get
        CURLOPT_POST           =>false,        //set to GET
        CURLOPT_USERAGENT      => $user_agent, //set user agent
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => false,    // don't return headers
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
        CURLOPT_TIMEOUT        => 120,      // timeout on response
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
    );

    $ch      = curl_init( $url );
    curl_setopt_array( $ch, $options );
    $content = curl_exec( $ch );
    $err     = curl_errno( $ch );
    $errmsg  = curl_error( $ch );
    $header  = curl_getinfo( $ch );
    curl_close( $ch );

    $header['errno']   = $err;
    $header['errmsg']  = $errmsg;
    $header['content'] = $content;
    return $header;
}

И я использую ее вот так

if ((substr( $url, 0, 8 ) === 'https://') || (substr( $url, 0, 7 ) === 'http://'))
{
    $result = $this->get_web_page( $url );
    if ( $result['errno'] != 0 )
    {
        session()->flash('danger', 'The url is not returning anything or is taking too long.');
        return view('welcome');
    }
    if ( $result['http_code'] != 200 )
    {
        session()->flash('danger', 'There is no page to display.');
        return view('welcome');
    }
    $content = $result['content'];
}
else
{
    session()->flash('danger', 'You must set a proper url type value');
    return view('welcome');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...