PHP Curl在localhost上不起作用?

kokeuurv  于 2022-11-13  发布在  PHP
关注(0)|答案(8)|浏览(182)

我在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

我的脚本是从谷歌apis地理编码lat long。它在我的主机提供商服务器上在线工作,但不是在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";
}
cwdobuhd

cwdobuhd1#

这不是关于代理,而是关于如何使用googleapis。
添加CURLOPT_SSL_ on代码并将其设置为false

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

a11xaf1n2#

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

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);

注意:尽管在测试环境中不安全,但它解决了问题。

请记住为生产服务器激活!!!

nszi6y05

nszi6y053#

Curl默认尝试使用端口1080,该端口可能在您的本地主机/路由器/ ISP上未打开。

ikfrs5lh

ikfrs5lh4#

您可能需要为$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

bkkx9g8r

bkkx9g8r5#

如果您使用代理,则可以尝试添加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);

希望这对你有帮助。

dy2hfwbg

dy2hfwbg6#

在MAMP中,如果您在连接到HTTPS主机时遇到错误,只需设置此选项:
如果是,则将其设置为“0”。
通过命令行执行的等效操作为:
curl -k -ssl 3 https://www.your-secure-host.com

9bfwbjaz

9bfwbjaz7#

你真的安装了curl二进制文件吗?你可以用PHP安装curl库,而不用在你的系统上安装curl二进制文件。进入shell提示符,输入curl。(如果这是OSX的标准配置,请原谅我的无知--我不是Mac用户)

sdnqo3pr

sdnqo3pr8#

如果您的操作系统没有提供cacert.pem文件到您的本地服务器进行SSL证书验证,您可以下载它并在php.ini中指定它
cacert.pem
php.ini:

[openssl]
; The location of a Certificate Authority (CA) file on the local filesystem
; to use when verifying the identity of SSL/TLS peers. Most users should
; not specify a value for this directive as PHP will attempt to use the
; OS-managed cert stores in its absence. If specified, this value may still
; be overridden on a per-stream basis via the "cafile" SSL stream context
; option.
openssl.cafile=C:\wamp64\cacert.pem

相关问题