Używam biblioteki o nazwie Simple HTML DOM

Jedna z jego metod, ładuje adres URL do obiektu DOM:

function load_file()
{
    $args = func_get_args();
    $this->load(call_user_func_array('file_get_contents', $args), true);
    // Throw an error if we can't properly load the dom.
    if (($error=error_get_last())!==null) {
        $this->clear();
        return false;
    }
}

W celu przetestowania obsługi błędów stworzyłem ten kod:

include_once 'simple_html_dom.php';
function getSimpleHtmlDomLoaded($url)
{
  $html = false;
  $count = 0;
  while ($html === false && ($count < 10)) {
    $html = new simple_html_dom();
    $html->load_file($url);
    if ($html === false) {
      echo "Error loading url!\n";
      sleep(5);
      $count++;
    }
  }
  return $html;
}

$url = "inexistent.html";
getSimpleHtmlDomLoaded($url);

Ideą tego kodu jest ponowna próba załadowania adresu URL, jeśli po 10 próbach nadal się nie powiedzie, powinien zwrócić false.

Wydaje się jednak, że przy nieistniejącym adresie URL metoda load_file nigdy nie zwraca wartości false.

Zamiast tego otrzymuję następujący komunikat ostrzegawczy:

Ostrzeżenie PHP: file_get_contents(inexisten.html): nie udało się otworzyć strumienia

Jakiś pomysł jak to naprawić?

Uwaga: Najlepiej byłoby uniknąć włamywania się do biblioteki.

0
rfc1484 24 wrzesień 2012, 15:20

2 odpowiedzi

Najlepsza odpowiedź

Zmień następujący kod:

$html->load_file($url);
if ($html === false) {

Dla tego:

$ret = $html->load_file($url);
if ($ret === false) {

Ponieważ sprawdzałeś instancję obiektu zamiast zwracanej wartości z metody load_file().

2
Nelson 24 wrzesień 2012, 15:34

Dodanie znaku @ przed wywołaniem metody powoduje pominięcie wszelkich ostrzeżeń. Jeśli z tego korzystasz, zawsze sprawdzaj samodzielnie błędy, tak jak teraz, i upewnij się, że nie są dostępne żadne inne metody, aby upewnić się, że nie pojawią się żadne ostrzeżenia i/lub błędy.

Powinieneś sprawdzić rzeczywiste dane, które są zapisane gdzieś przez metodę load(), jeśli to równa się FALSE zamiast instancji obiektu $html.

0
zeebonk 24 wrzesień 2012, 15:36