PHP Curl不适用于localhost?

时间:2011-12-07 17:29:27

标签: php curl localhost

我在Mac OSX上使用MAMP Pro 1.9.4 在phpinfo()我看到curl已启用

cURL support    enabled
cURL Information    7.20.0
Age 3
Features
AsynchDNS   No
Debug   No
GSS-Negotiate   No
IDN Yes
IPv6    Yes
Largefile   Yes
NTLM    Yes
SPNEGO  No
SSL Yes
SSPI    No
krb4    No
libz    Yes
CharConv    No
Protocols   dict, file, ftp, ftps, http, https, imap, imaps, ldap, pop3, pop3s, rtsp, smtp, smtps, telnet, tftp
Host    i386-apple-darwin8.11.1
SSL Version OpenSSL/0.9.7l
ZLib Version    1.2.3

我的脚本是从Google apis中对lat进行地理编码。 它在我的托管服务提供商服务器上在线工作,但在localhost上没有。为什么?

$latlng = "44.3585230889,8.57745766643";
$lang = "it";
$geocodeURL = "http://maps.googleapis.com/maps/api/geocode/json?latlng=$latlng&sensor=false&language=$lang";

$ch = curl_init($geocodeURL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode == 200) {
    $geocode = json_decode($result);

    $location   = $geocode->results[0]->address_components[0]->long_name;
    $city       = $geocode->results[0]->address_components[1]->long_name; 
    $province   = $geocode->results[0]->address_components[2]->long_name; 
    $region     = $geocode->results[0]->address_components[3]->long_name;
    $country    = $geocode->results[0]->address_components[4]->long_name;

    $geo_status = $geocode->status;     
    $geo_str    = "$location, $city, $province, $region, $country";
} else {
    $geo_status = "HTTP_FAIL_$httpCode";
    $geo_str    = "Failed: $geo_status";
}

7 个答案:

答案 0 :(得分:34)

这不是关于代理,而是关于如何使用googleapis。

添加CURLOPT_SSL_ on您的代码并将其设置为false

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

答案 1 :(得分:5)

这可能是防火墙问题。默认情况下,Curl尝试使用端口1080,该端口可能未在您的localhost /路由器/ ISP上打开。

答案 2 :(得分:3)

您可能需要为$ch

设置SSL版本和匹配的密码
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');

有关您可以传递给CURLOPT_SSLVERSION的确切参数,请参阅: http://php.net/manual/en/function.curl-setopt.php

此外,还可以显示与SSL版本相关的错误,以帮助您找到确切的版本冲突:

$error = curl_error($ch);
echo $error;

有关此命令的更多信息:http://php.net/manual/en/ref.curl.php

答案 3 :(得分:2)

在具有自签名证书的本地服务器(例如 XAMPP)上,您必须使用:

curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false);
<块引用>

注意:尽管测试环境不安全,但它解决了问题。
记得为生产服务器激活!!!

答案 4 :(得分:1)

在MAMP中,如果在连接到HTTPS主机时遇到错误,只需设置此选项:

curl_setopt($ ch,CURLOPT_SSLVERSION,3);

等效命令行是:

curl -k -ssl3 https://www.your-secure-host.com

答案 5 :(得分:0)

你真的安装了curl二进制文件吗?您可以使用PHP安装curl库,而无需在系统上实际使用curl二进制文件。切换到shell提示符并键入curl。 (如果它是OSX的标准,请原谅我的无知 - 我不是Mac人)

答案 6 :(得分:0)

如果您在代理后面,可以尝试添加CURLOPT_PROXY,例如(假设您的代理位于192.168.1.2端口3128上):

$ch = curl_init($geocodeURL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, "192.168.1.2:3128");
$result = curl_exec($ch);

希望这有帮助。