PHP里做一般的获取内容时,用自带的file_get_contents()函数基本就足够了。当然,这个函数只能抓一些简单的数据,如果是遇到需要登录的页面,就不行了,而且效率及稳定性也不是很强。所以要是有特殊需求的话,还是用curl吧。不仅仅速度快,而且非常稳定,基本上用curl抓取失败的几率很小。
而且今天在抓优酷视频API接口中的信息时,发现了一个问题,由于优酷API的url请求是https安全协议,用file_get_contents()函数竟然无法获取到数据,然后用curl写了个代替函数,虽然不报错了,但还是无法获取,最后Google的下,发现有很多人都曾经遇到过这个问题,而且都写出了解决办法。
还是需要curl。
<?php function file_get_contents_by_curl($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER,0); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//禁止调用时就输出获取到的数据 curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false); $result = curl_exec($ch); curl_close($ch);return $result;}?>
这两行才是关键。
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,
false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
算是一小段救命代码,以前知道的看完一笑就好了,主要为不知道的朋友们准备。
直接用file_get_contents,会报错;
程序代码$url =
(https://xxx.com");
file_get_contents($url);
错误:
程序代码Warning:
file_get_contents(https://xxx.com) [function.file-get-contents]: failed to open
stream: No such file or directory in D:wampwwwgrabber_clientindex.php on line
3
用curl的方式是可以的:
程序代码$url =
(https://xxx.com);
重点是以下两句:
=============================================================
今天项目上线,使用php的curl模块通过https访问某个文件时出错:
这是我日志里记录的信息:
2009-05-11 11:10:23 请求音频列表,错误号:60--错误描述:SSL
certificate problem, verify that the CA cert is OK.
Details:
error:14090086:SSL
routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify
failed
哎,项目上线急阿,请教同事得知修改如下代码即可,添加黑体字部分就好了。
curl_setopt($ch,
CURLOPT_URL,
$url);
curl_setopt($ch,
CURLOPT_RETURNTRANSFER,
true);
curl_setopt($ch,
CURLOPT_TIMEOUT,
$this->timeout);
curl_setopt($ch,
CURLOPT_CONNECTTIMEOUT, $this->timeout);
虽然有些简单,但是还是写下来吧,以后好作参考。
//
对HTTPS网站的访问,用到了扩展库curl
要在PHP.ini中对curl的extension前面的分号去掉,可能还要把openssl的扩展同样打开
请问如何配置curl才能支持获取https网站内容或者向https的网站提交数据
?
Linux下编译php的时候,把openssl支持一块编译进去
--with-openssl[=DIR] Include
OpenSSL support (requires OpenSSL >=
0.9.6)
--with-openssl-dir[=DIR] FTP:
openssl install
prefix
--with-imap-ssl[=DIR] IMAP:
Include SSL support. DIR is the OpenSSL install
prefix
--with-openssl-dir[=DIR] SNMP:
openssl install
prefix
我一般自己编译,如果你的Linux发行版带有php5-openssl包,安装好就行了
如果是通过OpenSSL加密的https协议传输的网页,curl可以直接访问:
curl
https://that.secure.server.com
window下的https
通过curl访问的配置:
http://618119.com/archives/2007/10/26/16.html
http://hi.baidu.com/kkwtre/blog/item/3d20fbfb9a90da204e4aea01.html
http://www.enet.com.cn/article/2011/0617/A20110617874334.shtml
=-----------------------------------------------------------------------------------------=
PHP
CURL HTTPS POST:
PHP如何抓取https内容?记录一下。,布布扣,bubuko.com
原文:http://www.cnblogs.com/hechunhua/p/3695290.html