【问题标题】:Ignoring errors in file_get_contents HTTP wrapper?忽略 file_get_contents HTTP 包装器中的错误?
【发布时间】:2012-07-13 14:37:39
【问题描述】:

以下代码用于查询我作为大学项目正在构建的搜索引擎的在线词库,但我遇到了file_get_contents“未能打开流”错误的问题。当我发送词库无法识别的单词时,它会引发错误。我正在尝试编写一段代码,该代码将忽略错误并在没有信息的情况下继续。

$thesaurus_search="http://words.bighugelabs.com/api/2/0089388bb57f/".$this->formatted_query."/php";
$result_thesaurus=file_get_contents($thesaurus_search);

我试过了:

if (file_get_contents($thesaurus_search) != NULL)
{ // do stuff }

...但它不起作用,因为它仍然返回某种字符串。

我能做些什么来处理这种情况?

【问题讨论】:

  • 出错时到底返回什么?一些html? xml? json?您必须解析返回的数据以检查错误代码 - api 不太可能简单地返回任何内容。
  • “我正在尝试编写一段代码,它会忽略错误并在没有信息的情况下继续进行”。如果没有这些信息,您将如何进行?
  • 也许我应该更具体一点,这段代码是一个类的一部分,它返回的信息不是最终产品所固有的,它只是一个奖励。因此,如果 file_get_contents 返回一个错误(因为它与单词不匹配),我想完全脱离这个类,并且不返回任何代码。

标签: php file-get-contents


【解决方案1】:

如果您不希望 file_get_contentsHTTP 错误 报告为 PHP 警告,那么这是 clean 方法,使用流上下文(有是专门针对那个的):

$context = stream_context_create(array(
    'http' => array('ignore_errors' => true),
));

$result = file_get_contents('http://your/url', false, $context);

【讨论】:

  • 感谢 Netcoder 好多了,感谢您的帮助。我也不会再用扳手敲我的电脑了:)
  • 非常感谢!经过多次探索后,我在手册中找到了它,但对我来说,上下文选项可以提供帮助并不是很明显。如果这在 file_get_contents 页面上就更好了。
  • 这是困扰我一段时间但直到现在才烦恼的事情之一。 @ 应该可以工作,但不是很愚蠢。 “PHP 支持一种错误控制运算符:at 符号 (@)。当附加到 PHP 中的表达式之前,该表达式可能生成的任何错误消息都将被忽略。”看起来很简单,但实际上一个谎言。
【解决方案2】:

如果您可以接受救助,最简单的解决方案是:

if (empty($thesaurus_search)) { 
   return;
} else {
   //process with value
}

为了更全面地处理它,查看API,看起来你应该检查response header,例如:

$thesaurus_search="http://words.bighugelabs.com/api/2/0089388bb57f/".$this->formatted_query."/php";
$result_thesaurus=file_get_contents($thesaurus_search);
if ($http_response_header[0] = 'HTTP/1.1 200 OK') {
    //code to handle words
} else {
    // do something else?
}

【讨论】:

  • 考虑到 file_get_contents 已经返回 false 错误,我认为没有必要。
【解决方案3】:

如果我对您的理解正确,您正在尝试对http://words.bighugelabs.com 进行 API 调用。 您需要 cURL 来实现这一点,因此如果您安装了 cURL,那么此代码将为您工作。

$ch = curl_init();
$thesaurus_search="http://words.bighugelabs.com/api/2/0089388bb57f/".$this->formatted_query."/php";
$options = array();
$options[CURLOPT_URL] = $thesaurus_search;
$options[CURLOPT_RETURNTRANSFER] = true;
curl_setopt_array($ch, $options);

// Print result.
print_r(curl_close($ch));

【讨论】:

  • “你需要 cURL 来实现这个”,不,他不需要。
【解决方案4】:

你可以试试 curl:

function curl_get_contents($url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
    curl_setopt($ch, CURLOPT_MAXREDIRS, 2); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $content = curl_exec($ch);
    curl_close($ch);
    return $content;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多