我在这里有一个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
}
该函数的要点是它die()
并且如果它无法从指定的URL检索JSON,则写入error_log
。在503
的情况下,它会重复尝试3次。
我有几个主要问题:
Content-Type
检查并不总是正确的,因为GET请求的索引并不总是7。我想假设$http_response_header
与strstr
Content-Type
进行循环,然后检查一下吗?对我来说似乎很笨拙。 manual page几乎没有任何内容。必须有一种更简单的方法来处理它吗?
我的error_log
在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
来抑制此问题,但这可能会抑制我可能需要知道的其他警告,我无法预测。有没有办法在此函数中禁止该特定警告?
答案 0 :(得分:1)
根据this问题,您可以从content-type
超全局获取$_SERVER["CONTENT_TYPE"]
标题(我没有检查过,所以我无法确定)。编辑:现在已经检查过,它似乎仅适用于POST请求。
对于file_get_contents
问题,如果您不想要它,也可以取消警告,并且您可以明确地测试它是否返回false。
只是一张纸条;在函数中定义函数不是一个好主意 - 如果在同一个脚本中调用TryGetJSON
函数两次,则会出现错误,因为您无法定义与已定义的函数同名的函数