fopen,file_get_contents,curl的区别

转载:http://bbs.phpchina.com/thread-208431-1-1.html


1.fopen/file_get_contents 每次请求都会重新做DNS查询,并不对DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。所以CURL的性能比fopen /file_get_contents 好很多。


2.fopen /file_get_contents在请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。


1)curl/file_get_contents两者除了性能以外,确实还有一些其他的区别,这里顺便说说fopen:
fopen不会keepalive,

file_get_contents请求http时,使用的是http_fopen_wrapper,也不会keeplive,而curl却是可以的。这个是读取一般文件的时候并没有什么问题,但是在读取远程问题的时候就会出现问题。如果是要打一个持续连接,多次请求多个页面。那么file_get_contents和fopen就会出问题。取得的内容也可能会不对。所以做一些类似采集工作的时候,肯定就有问题了。注意到了这个问题,以后如果要给系统做采集功能的时候,就用得着了


2)spider不是只取一个页面,可能要取成千上万个,keepalive可以在取完一页之后立即取另一页。从ext/standard/http_fopen_wrapper.c的源码看,fopen不会keepalive,file_get_contents请求http时,使用的是http_fopen_wrapper,因此也不会keepalive。curl是可以设置keep-alive的。一般做搜索的大点的公司,爬虫不会用php写,不是C就是C++


3.fopen/file_get_contents函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。4.curl可以模拟多种请求,例如:POST数据,表单提交等,用户可以按照自己的需求来定制请求。而fopen / file_get_contents只能使用get方式获取数据。因此,我还是比较倾向于使用curl来访问远程url。Php有curl模块扩展,功能很是强大。没事可以研究一下。


注:curl可定制性更强,比如自定义HTTP头等。采集时常常需要加上refer等HTTP头信息,来突破对方的防采集机制。可以几乎完全模拟浏览器,比如模拟登录人人网,发一条状态等。

file_get_contents一般是GET方式发送HTTP请求,HTTP头几乎为空,没额外的东西。但也第三个参数来设置更多的HTTP头,也可以指定POST等方式请求。

多数情况下file_get_contents能够满足需要。个人认为如果有更多需要再用CURL,甚至socket。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值