php file_get_contents()使用有效的url返回false

时间:2016-06-22 10:49:27

标签: php api google-maps geocoding

我目前正在使用google maps API处理地理编码php功能。奇怪的是,我认为file_get_contents()返回bool(false),而我使用的url是正确编码的。

在我的浏览器中,当我测试代码时,页面需要很长时间才能加载,并且地理编码不起作用(当然,鉴于API没有给我我想要的东西) )。

此外,我尝试使用卷曲,到目前为止没有成功。

如果有人能帮助我,那就太棒了!

非常感谢。

代码:

function test_geocoding2(){

    $addr = "14 Boulevard Vauban, 26000 Valence";
    if(!gc_geocode($addr)){
        echo "false <br/>";
    }
}

function gc_geocode($address){

    $address = urlencode($address);
    $url = "http://maps.google.com/maps/api/geocode/json?address={$address}";

    $resp_json = file_get_contents($url);

    $resp = json_decode($resp_json, true);

    if($resp['status']=='OK'){
        $lati = $resp['results'][0]['geometry']['location']['lat'];
        $longi = $resp['results'][0]['geometry']['location']['lng'];

        if($lati && $longi){
            echo "(" . $lati . ", " . $longi . ")";
        }else{
            echo "data not complete <br/>";
            return false;
        }

    }else{
        echo "status not ok <br/>";
        return false;
    }
}

更新:问题确实是我在代理背后的事实。我测试了另一个网络,它运行正常。 但是,您对我返回的内容以及如何测试成功的答案也非常好,并且会帮助我改进代码。

非常感谢!

4 个答案:

答案 0 :(得分:1)

查看if声明:

if(!gc_geocode($addr)){
    echo "false <br/>";
}

这意味着如果gc_geocode($addr)返回falsenull,则此语句将回显“false”。

但是,你实际上从来没有从函数中返回任何东西,所以一旦成功,它就会返回null

$address = urlencode($address);
$url = "http://maps.google.com/maps/api/geocode/json?address={$address}";
$resp_json = file_get_contents($url);
$resp = json_decode($resp_json, true);
    if($lati && $longi){
        echo "(" . $lati . ", " . $longi . ")"; //ECHO isn't RETURN
        /* You should return something here, e.g. return true */
    } else {
        echo "data not complete <br/>";
        return false;
    }
} else {
    echo "status not ok <br/>";
    return false;
}

或者,您只需将if语句更改为仅在函数返回false时触发:

if(gc_geocode($addr)===false){
    //...

答案 1 :(得分:1)

当你没有返回时,任何函数都会返回null 只需使用:

if(!is_null(gc_geocode($addr))) {
    echo "false <br/>";
}

或者:

if(gc_geocode($addr) === false) {
    echo "false <br/>";
}

答案 2 :(得分:1)

上面的函数gc_geocode()在我的系统上正常工作,没有任何额外的负载。你已经调用了gc_geocode()它返回你的lat,long是正确的,现在你已经检查了

if(!gc_geocode($addr)){
    echo "false <br/>";
} 

使用

  if($responce=gc_geocode($addr)){
      echo $responce;       
    }
  else{
     echo "false <br/>";
    } 

答案 3 :(得分:1)

问题是我使用代理的事实。代码是正确的。

要检查您和Internet之间是否有代理,您必须知道网络的基础结构。如果您在学校或公司网络中工作,则很可能使用代理来保护本地网络。 如果您不知道答案,询问您的网络管理员

如果您的网络中没有声明的代理,仍然可能存在透明代理。但是,作为州对此问题的接受答案:https://superuser.com/questions/505772/how-can-i-find-out-if-there-is-a-proxy-between-myself-and-the-internet-if-there

  

如果它是透明代理,您将无法在客户端PC上检测到它。

有些网站也提供了一些代理检测器,但我不知道那里提供的信息有多相关。以下是两个例子:

http://amibehindaproxy.com/

http://www.proxyserverprivacy.com/free-proxy-detector.shtml