2018年04月6日网站服务器迁移完成……

fsockopen/curl/file_get_contents的几种比较

php 苏 demo 1324℃ 0评论

377adab44aed2e7344108a478f01a18b86d6fae4

(备注图片与文字无关)

曾经有一道php的笔试题,说如果让你使用php语言去写下载文件,你会使用哪个?

其实单就这个问题来讲,php语言当中有很多中方式能够去实现。

但是推荐答案给的是fsockopen 。

但细想想file_get_contents/curl 不也能获取么? 同样都能做的事情,他们几个会有什么样的区别呢?

手册、手册会给答案,呵呵:

1.fsockopen 偏向于网络底层调用;其返回数据是原始数据(未被处理,例如长度、开始结束字符等);fsockopen参数少,配置简单;

2.curl经过的包装支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证,HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传,http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。curl是返回经过处理后的内容;curl参数多,配置复杂;

3.file_get_contents 需要php环境开启配置allow_url_open;请求http时,使用的是http_fopen_wrapper,请求单个文件,执行效率比较高,读取远程文件时,慎用(有人会说file_get_contents获取内容会慢,有时候会超时,其实超时多半是网络问题,file_get_contents也是有参数可以来定制超市时间的,具体请参考示例);

file_get_contents 函数代码使用示例:

/** 下载图片获取大小 */
public static function downGetImageSize($url)
{
    $context = stream_context_create(array(
        'http' => array(
            'timeout' => 3 //超时时间,单位为秒
        )
    ));
    $content = @file_get_contents($url, 0, $context);
    //$content = @file_get_contents($url);
    $image_name = rand() . '.jpg';
    $save       = @file_put_contents(RUNTIME_PATH . '/Cache/' . $image_name, $content);
    $size       = @getimagesize(RUNTIME_PATH . '/Cache/' . $image_name);
    @unlink(RUNTIME_PATH . '/Cache/' . $image_name);
    return !empty($size) ? array('width' => $size['0'], 'height' => $size['1']) : array('width' => 720, 'height' => 340);
}

综合对比评价:

fsockopen和file_get_contents 不会对dns进行缓存,curl 可以对dns进行缓存,so对于同一个服务器进行多次获取文件内容的时候,curl的优势是很明显的;而且curl可以保持keepalive,  fscockopen和file_get_contents受php.ini 环境配置allow_url_open的限制,如果关闭了,那么这两个就不好使了。同样的,fsockopen和file_get_contents 只能get方式获取内容,curl 则比较综合,get /post/form提交等。

 

打赏

转载请注明:苏demo的别样人生 » fsockopen/curl/file_get_contents的几种比较

   如果本篇文章对您有帮助,欢迎向博主进行赞助,赞助时请写上您的用户名。
支付宝直接捐助帐号oracle_lee@qq.com 感谢支持!
喜欢 (1)or分享 (0)
发表我的评论
取消评论
表情