在PHP中捕获失败的HTTP请求

时间:2012-04-20 22:44:59

标签: php file-get-contents

所以,我在PHP中遇到一些带有file_get_contents的麻烦......

我正在使用this code

之前,如果我使用无法找到的哈希(bdfccf20b1db88d835c27685ac39f874)运行它,它会返回:

fcf1eed8596699624167416a1e7e122e - found: octopus (Google)
bed128365216c019988915ed3add75fb - found: passw0rd (Google)
d0763edaa9d9bd2a9516280e9044d885 - found: monkey (Google)
dfd8c10c1b9b58c8bf102225ae3be9eb - found: 12081977 (Google)
ede6b50e7b5826fe48fc1f0fe772c48f - found: 1q2w3e4r5t6y (Google)
bdfccf20b1db88d835c27685ac39f874
Warning: file_get_contents(http://md5.gromweb.com/query/bdfccf20b1db88d835c27685ac39f874): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found

 in /Users/mihir/MD5Decryptor.php on line 44

Catchable fatal error: Argument 2 passed to MD5Decryptor::dictionaryAttack() must be an array, boolean given, called in /Users/mihir/MD5Decryptor.php on line 56 and defined in /Users/mihir/MD5Decryptor.php on line 25

要停止警告,我改变了

if ($response = file_get_contents($url)) {

第43行到

$response = @file_get_contents($url);
if ($response) {

,输出变为

fcf1eed8596699624167416a1e7e122e - found: octopus (Google)
bed128365216c019988915ed3add75fb - found: passw0rd (Google)
d0763edaa9d9bd2a9516280e9044d885 - found: monkey (Google)
dfd8c10c1b9b58c8bf102225ae3be9eb - found: 12081977 (Google)
ede6b50e7b5826fe48fc1f0fe772c48f - found: 1q2w3e4r5t6y (Google)
bdfccf20b1db88d835c27685ac39f874
Catchable fatal error: Argument 2 passed to MD5Decryptor::dictionaryAttack() must be an array, boolean given, called in /Users/mihir/MD5Decryptor.php on line 56 and defined in /Users/mihir/MD5Decryptor.php on line 25

我怎样才能发现错误?就像在,如果找不到哈希,我怎么能修改脚本以返回“Hash Not Found”而不是完全崩溃?

提前致谢...

3 个答案:

答案 0 :(得分:4)

你仍然得到错误的原因是因为这一行:

return $this->dictionaryAttack($hash, $this->getWordlist($hash));

当getWordList从file_get_contents()获取404时,将返回FALSE,并且生成有关无效参数传递的异常。

你可以尝试修复它的一件事是:

$list = $this->getWordlist($hash);
if ($list === false) {
    return 'Error fetching URL';
} else {
    return $this->dictionaryAttack($hash, $list);
}

至少应该处理它无法加载的网址。

答案 1 :(得分:1)

将它全部包装在try-catch块中。 PHP有一种处理这些致命错误的机制。

这样的事情应该有效:

try {
    if ($response = file_get_contents($url)) {
        ...
    }
}
catch (Exception $e) {
    // return your "Hash Not Found" response
}

以下是有关构造的一些文档: http://php.net/manual/en/language.exceptions.php

您可能希望确切地确定导致错误的代码行,并使用您可以使用的最特殊的Exception子类。这是一种最佳做法,因为您不希望错过与此问题无关的异常。

答案 2 :(得分:0)

你能做的最好的事情是switch to using cURL。虽然你can get the errors when using file_get_contents(),但它不是很强大。