关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
这是一个php使用curl向一个https链接post提交数据发现的问题。
本来这里最好放到php分类下面,但我php很少用,而且每次用一句查一句。所以放到内容和Linux有关联的Linux分类下。
问题如下:
由于是https链接,需要忽略证书。测试代码如下:
<?php
$json = '{
"items":[
{"product_id":"300767189","quantity":2,"vendor_id":"200256993"}
],
"language":"en",
"currency":"USD",
}';
$headers = array(
"Content-type: application/json;charset='utf-8'",
);
$url = 'https://xxxxxxxxxxxxxxxxx'; //网址不重要,注意前面是https
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 从证书中检查SSL加密算法是否存在
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
$result = curl_exec($ch);
curl_close($ch);
print_r($result);
echo 'end';
?>但无法获取到任何结果,只得到最后一条语句的'end'。
于是尝试把curl错误信息输出。把下面代码加载curl_close前面:
if(curl_error($ch))
{
print_r(curl_error($ch));
}得到SSL connect error 错误信息。(这里可能你的错误描述不太一样,大致也是SSL问题的话,继续往下看)
这里我已经忽略了SSL证书检查,还是保存。继续谷歌(因为百度查到的东西都是重复的),最后查到这个东西:

大致意思是说,这是curl的bug!bug!bug!
若curl版本是7.2x和7.3x都不行,至少要升级到7.4x才行。我们可以用curl_version()函数得到curl的版本信息。
这里需要注意,在php中说的curl是libcurl,而不是系统的curl,这两个是有区别。
我服务器的系统是Linux,CentOS发行版。尝试了CentOS下更新
yum update libcurl
但显示要升级的版本才7.29。折腾几天,发现一下两种方法。(若你急着用,直接看第2种方法)
升级更新curl方法如下:
1)下载curl包
wget http://curl.haxx.se/download/curl-7.49.0.tar.gz
当然,这个链接我是在http://curl.haxx.se/download/找到的。
2)解压
tar -xzvf curl-7.49.0.tar.gz
3)覆盖安装
cd curl-7.49.0 ./configure make make install
cd命令是进入到刚刚解压出来的文件夹。接着在linux中编译安装。若之前存在curl,则会被覆盖。
更新之后,php如何使用?这里有两个分支:
a、用php的shell_exec调用命令行执行curl
b、对php再一次用源码编译一次,重新编译会生成对应的curl.so
该方法是发现新的可用yum源之后,补充的方法:
1)添加yum源
rpm -Uvh http://www.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-1-12.rhel6.noarch.rpm
2)安装或更新libcurl
yum install libcurl