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效率会好一些。
3. fopen / file_get_contents函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。
4. curl可以模拟多种请求,例如:POST数据,表单提交等,用户可以按照自己的需求来定制请求。而fopen / file_get_contents只能使用get方式获取数据。
因此,我还是比较倾向于使用curl来访问远程url。Php有curl模块扩展,功能很是强大。没事可以研究一下。
php中 curl, fsockopen ,file_get_contents 三个函数 都可以实现采集模拟发言 。 三者有什么区别,或者讲究么
赵永斌:
有些时候用file_get_contents()调用外部文件,容易超时报错。换成curl后就可以.具体原因不清楚curl 效率比file_get_contents()和fsockopen()高一些,原因是CURL会自动对DNS信息进行缓存(亮点啊 有我待亲测)范佳鹏:
file_get_contents curl fsockopen在当前所请求环境下选择性操作,没有一概而论:具我们公司开发KBI应用来看:刚开始采用:file_get_contents后来采用:fsockopen最后到至今采用:curl(远程)我个人理解到的表述如下(不对请指出,不到位请补充)
file_get_contents 需要php.ini里开启allow_url_fopen,请求http时,使用的是http_fopen_wrapper,不会keeplive.curl是可以的。file_get_contents()单个执行效率高,返回没有头的信息。这个是读取一般文件的时候并没有什么问题,但是在读取远程问题的时候就会出现问题。如果是要打一个持续连接,多次请求多个页面。那么file_get_contents和fopen就会出问题。取得的内容也可能会不对。所以做一些类似采集工作的时候,肯定就有问题了。sock较底层,配置麻烦,不易操作。 返回完整信息。潘少宁-腾讯:file_get_contents 虽然可以获得某URL的内容,但不能post get啊。curl 则可以post和get啊。还可以获得head信息而socket则更底层。可以设置基于UDP或是TCP协议去交互file_get_contents 和 curl 能干的,socket都能干。socket能干的,curl 就不一定能干了file_get_contents 更多的时候 只是去拉取数据。效率比较高 也比较简单。赵的情况这个我也遇到过,我通过CURL设置host 就OK了。 这和网络环境有关系