Хорошая обработка ошибок с file_get_contents

Я использую simplehtmldom, который имеет этот funciton:

// get html dom form file
function file_get_html() {
    $dom = new simple_html_dom;
    $args = func_get_args();
    $dom->load(call_user_func_array('file_get_contents', $args), true);
    return $dom;
}

Я использую его как так:

$html3 = file_get_html(urlencode(trim("$link")));

Иногда, URL не может просто быть допустимым, и я хочу обработать это. Я думал, что мог использовать попытку и выгоду, но это не работало, так как она не выдает исключение, она просто дает предупреждение php как это:

[06-Aug-2010 19:59:42] PHP Warning:  file_get_contents(http://new.mysite.com/ghs 1/) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found  in /home/example/public_html/other/simple_html_dom.php on line 39

Строка 39 находится в вышеупомянутом коде.

Как я могу правильно обработать эту ошибку, я могу просто использовать плоскость ifусловие, не похоже, что это возвращает булевскую переменную.

Спасибо все для любой справки

Обновление

Действительно ли это - хорошее решение?

if(fopen(urlencode(trim("$next_url")), 'r')){

    $html3 = file_get_html(urlencode(trim("$next_url")));

}else{
    //do other stuff, error_logging
    return false;

}

18
задан Abs 7 August 2010 в 16:46
поделиться

3 ответа

Вот идея:

function fget_contents() {
    $args = func_get_args();
    // the @ can be removed if you lower error_reporting level
    $contents = @call_user_func_array('file_get_contents', $args);

    if ($contents === false) {
        throw new Exception('Failed to open ' . $file);
    } else {
        return $contents;
    }
}

По сути, это обертка для file_get_contents. Она будет выбрасывать исключение при неудаче. Чтобы избежать необходимости переопределять file_get_contents, вы можете

// change this
$dom->load(call_user_func_array('file_get_contents', $args), true); 
// to
$dom->load(call_user_func_array('fget_contents', $args), true); 

Теперь вы можете:

try {
    $html3 = file_get_html(trim("$link")); 
} catch (Exception $e) {
    // handle error here
}

Подавление ошибок (либо с помощью @, либо путем понижения уровня error_reporting - допустимое решение. Это может бросать исключения, и вы можете использовать это для обработки ошибок. Есть много причин, по которым file_get_contents может выдавать предупреждения, и само руководство PHP рекомендует понизить уровень error_reporting: См. руководство

15
ответ дан 30 November 2019 в 08:58
поделиться

ЕСЛИ вы выполняете выборку с внешнего URL-адреса, лучшая обработка будет происходить после внедрения библиотеки HTTP, такой как Zend_Http. Это не сильно отличается от использования CURL или fopen, за исключением того, что он извлекает детали этих «dirvers» в универсальный API, а затем вы можете выбрать, что вы хотите использовать. Он также будет иметь встроенную ловушку ошибок, чтобы упростить вам задачу.

Если вам не нужны накладные расходы на другую библиотеку, вы, очевидно, можете написать ее самостоятельно - в этом случае я всегда предпочитаю CURL.

0
ответ дан 30 November 2019 в 08:58
поделиться

Используйте CURL , чтобы получить URL-адрес и таким образом обработать ответ об ошибке.

Простой пример из curl_init () :

<?php
// create a new cURL resource
$ch = curl_init();

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);

// grab URL and pass it to the browser
curl_exec($ch);

// close cURL resource, and free up system resources
curl_close($ch);
?>
4
ответ дан 30 November 2019 в 08:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: