php file_get_contents() 以有效的 url 返回 false

php file_get_contents() returning false with a valid url

我目前正在研究地理编码 php 函数,使用 google 地图 API。奇怪的是,我认为 file_get_contents() returns bool(false) 而我使用的 url 编码正确。

在我的浏览器中,当我测试代码时,页面加载时间很长,而且地理编码不起作用(当然,考虑到 API 没有给我什么我要)。

我也试过用curl,目前没有成功。

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

非常感谢。

代码:

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;
    }
}

更新:问题确实是我在代理后面。我用另一个网络测试过,它工作正常。 但是,您对我 return 以及我如何测试成功的回答也非常好,并且将帮助我改进代码。

非常感谢!

看看if声明:

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

这意味着如果 gc_geocode($addr) return 是 falsenull,则此语句将回显 "false".

但是,您实际上从未从该函数中 return 任何东西,所以一旦成功,它就是 returning 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 语句更改为仅在函数 returns false:

时触发
if(gc_geocode($addr)===false){
    //...

当你没有 return 任何功能 returns null.
只需使用它:

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

或者:

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

以上函数 gc_geocode() 在我的系统上正常工作,没有任何额外负载。您已调用 gc_geocode () 它 returns 您的纬度、长度是正确的,现在您已检查

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

使用

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

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

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

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

If it's a transparent proxy, you won't be able to detect it on the client PC.

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

http://amibehindaproxy.com/

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