0

我在这里有一个 PHP 函数:

function TryGetJSON($URL) { //Attempts to retrieve the JSON at a URL, script terminates if failure
    function LogAndDie($msg) { error_log($msg); die(); }
    for($attempt = 0; $attempt < 3; $attempt++) { //Try 3 times to fetch URL
        $JSON = file_get_contents($URL); //Attempt to fetch, then check Response Header
        if( !$JSON && isset($http_response_header) && strstr($http_response_header[0], '503'))
            continue; //503 response: server was busy, so try again
        else
            break; //$JSON is populated, must be a 200 response
    }//$JSON is always false on 404, file_get_contents always returns false on read failure
    
    if(isset($http_response_header)) {
        if(strstr($http_response_header[0], '503')) //If still 503, then all our attempts failed
            LogAndDie('Could not get JSON file (' . $URL . '): ' . $http_response_header[0] . ' after 3 attempts.');
        if(!strstr($http_response_header[0], '200')) //If not a 200
            LogAndDie('Could not get JSON file (' . $URL . '): ' . $http_response_header[0]);
        if(!strstr($http_response_header[7], 'application/json') ) //Check Correct Content-Type
            LogAndDie('Wrong Content Type for (' . $URL . '). Received: ' . $http_response_header[7]);
        return $JSON;
    }
    if(!$JSON) LogAndDie('Could not get JSON file (' . $URL . ').'); //Catch all
}

该函数的要点是,如果它无法从指定的 URL 检索 JSON,它会die()写入并写入。在'serror_log的情况下它会重新尝试 3 次。503

我对此有几个主要问题:

  1. Content-Type检查并不总是正确的,因为 GET 请求上的索引并不总是 7 。我是否想$http_response_headerstrstrfor遍历整个Content-Type内容然后检查它?对我来说似乎很笨拙。手册页对此几乎没有任何内容。必须有一种更简单的方法来处理它?

  2. error_log在 a 上有这样的行404


[25-Oct-2012 09:02:23] PHP Warning:  file_get_contents(...) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in ... on line 8
[25-Oct-2012 09:02:23] Could not get JSON file (...): HTTP/1.1 404 Not Found

我只对保留我的(第二行)感兴趣,而不是error_log两者都填满。我发现@可以用来抑制它file_get_contents,但这可能会抑制我可能需要知道的其他我无法预测的警告。有没有办法在这个函数中抑制特定的警告?

4

1 回答 1

1

根据this question,您可以content-type从超全局获取标题$_SERVER["CONTENT_TYPE"](我没有检查,所以我不能确定)。编辑:现在已经检查过了,它似乎只适用于 POST 请求。

对于这个file_get_contents问题,如果你不想要它,你也可以抑制警告,你可以明确地测试它是否返回错误。

只是一个注释;在函数中定义函数不是一个好主意 - 如果TryGetJSON在同一个脚本中调用该函数两次,则会出现错误,因为您无法定义与已定义函数同名的函数。

于 2012-10-25T15:52:46.427 回答