关于本站
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